首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Selenium4和Java在#影子根(打开)中定位第一个名称元素

如何使用Selenium4和Java在#影子根(打开)中定位第一个名称元素
EN

Stack Overflow用户
提问于 2022-07-28 21:24:04
回答 1查看 111关注 0票数 2

我试图在页面https://whitelabel.sandbox.array.io/signup?platform=v3中找到字段名的元素。我试着用idclassnamenamecssSelector等搜索,但是都没有用。在我试图找到元素之前,我甚至增加了服务员,以确保它装得很好。同样的问题发生在页面中的所有字段中。因此,这个问题并不是这个领域所独有的。

在Chrome和Mac上的Firefox上都试过这一点。相同的代码可以很好地找到gmail.com页面中的用户名字段。

代码语言:javascript
复制
driver.get("https://whitelabel.sandbox.array.io/signup?platform=v3");
driver.manage().window().maximize();
WebDriverWait wait = new WebDriverWait(driver, java.time.Duration.ofSeconds(10));
WebElement selectFirstName = driver.findElement(By.name("firstName"));
//assertNotNull(driver.findElement(By.name("firstName")));
//assertNotNull(driver.findElement(By.xpath("//input[@name='firstName']")));
//driver.findElement(By.cssSelector("input[name='firstName']")).sendKeys("Thomas");
//driver.findElement(By.name("firstName")).sendKeys("Thomas");
//driver.findElement(By.xpath("//input[@name='firstName']")).sendKeys("Thomas");
//page.locator("[name='firstName']").type("Thomas");
//driver.findElement(By.cssSelector("input[name='firstName']")).sendKeys("Thomas");
//driver.locator("[name='firstName']").type("Thomas");

我得到的错误是:

线程“org.openqa.selenium.NoSuchElementException”中的异常:没有这样的元素:无法定位元素:{“方法”:“css选择器”,“选择器”:“*name=‘firstName’}”(会话信息: chrome=103.0.5060.134)

有人知道我需要做些什么才能得到webElement吗?

EN

回答 1

Stack Overflow用户

发布于 2022-07-30 09:50:39

网站中的 Name字段https://whitelabel.sandbox.array.io/signup?platform=v3位于#阴影-根(打开)中。

ShadowRoot in selenium4

根据ShadowRoot.java中的测试实现

代码语言:javascript
复制
import static org.openqa.selenium.remote.Dialect.W3C;
import static org.openqa.selenium.remote.DriverCommand.FIND_ELEMENTS_FROM_SHADOW_ROOT;
import static org.openqa.selenium.remote.DriverCommand.FIND_ELEMENT_FROM_SHADOW_ROOT;

// Note: we want people to code against the SearchContext API, so we keep this class package private
class ShadowRoot implements SearchContext, WrapsDriver {
  private final RemoteWebDriver parent;
  private final String id;

  ShadowRoot(RemoteWebDriver parent, String id) {
    this.parent = Require.nonNull("Owning remote webdriver", parent);
    this.id = Require.nonNull("Shadow root ID", id);
  }

  @Override
  public List<WebElement> findElements(By by) {
    return parent.findElements(
      this,
      (using, value) -> FIND_ELEMENTS_FROM_SHADOW_ROOT(id, using, String.valueOf(value)),
      by);
  }

  @Override
  public WebElement findElement(By by) {
    return parent.findElement(
      this,
      (using, value) -> FIND_ELEMENT_FROM_SHADOW_ROOT(id, using, String.valueOf(value)),
      by);
  }

  @Override
  public WebDriver getWrappedDriver() {
    return parent;
  }

  public String getId() {
    return this.id;
  }

  private Map<String, Object> toJson() {
    return singletonMap(W3C.getShadowRootElementKey(), id);
  }
}

@titusfortner在他们的评论中解释的相同之处是:

实际状态是,该JavaScript的返回值在v96 of ChromeDriver中更改,以便符合w3c。Selenium 3.141.59无法解析这个新的返回值。您可以在Selenium 4中使用getShadowRoot(),或者可以从Selenium 4.1中的JS返回一个ShadowRoot实例。我纠正了,你需要转换到SearchContext界面。

解决方案

要在中发送字符序列,可以使用以下定位器策略

  • 代码块: Driver.get(“https://whitelabel.sandbox.array.io/signup?platform=v3"”);WebElement元素=新WebDriverWait(driver,Duration.ofSeconds(10),SearchContext context = element.getShadowRoot();WebElement firstName = context.findElement(By.cssSelector("inputname='firstName'"));firstName.sendKeys("Supramanian");
  • 浏览器快照:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73159324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档