我试图在页面https://whitelabel.sandbox.array.io/signup?platform=v3中找到字段名的元素。我试着用id,classname,name,cssSelector等搜索,但是都没有用。在我试图找到元素之前,我甚至增加了服务员,以确保它装得很好。同样的问题发生在页面中的所有字段中。因此,这个问题并不是这个领域所独有的。
在Chrome和Mac上的Firefox上都试过这一点。相同的代码可以很好地找到gmail.com页面中的用户名字段。
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吗?
发布于 2022-07-30 09:50:39
网站中的 Name字段https://whitelabel.sandbox.array.io/signup?platform=v3位于#阴影-根(打开)中。

ShadowRoot in selenium4
根据ShadowRoot.java中的测试实现
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界面。
解决方案
要在名中发送字符序列,可以使用以下定位器策略

https://stackoverflow.com/questions/73159324
复制相似问题