Selenium Chrome driver/Java - 无法通过 Id 找到元素(文本字段)

Selenium Chrome driver/Java - Can't find element (text field) by Id

我有一个简单的 HTML 网页,其中包含嵌套在一些 div 和 </form> 中的文本字段(我看不到 IFrame)。我确定我使用的是正确的 ID,但是当 运行 IntelliJ 中的代码时,它一直失败。这是元素的html。这是我得到的异常:

异常

org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="loginLastName"]"}

以及我试图通过 selenium 定位的元素(文本字段)的 HTML:

HTML:

<input type="text" maxlength="32" minlength="2" required="" id="loginLastName" class="grv-input " aria-describedby="loginLastNameAria" pattern="(([ \-.']*)?[A-Za-z]+([ \-.']*)?)*">

并且在 java 代码中,我的浏览器正确地加载到像 http://google.com 这样的虚拟网站,但未能从我的相关网站上获取 elementId。我尝试使用 ID 和 XPATH(我从 chrome 浏览器获得):

Java

// get by ID
driver.findElement(By.id("loginLastName")).sendKeys("This is a test");

// get by XPATH
driver.findElement(By.xpath("//*[@id=\"loginLastName\"]")).sendKeys("dsdfdsfdsdsdsfdsgsdfgsdfdsg");

我也尝试添加 延迟 以确保组件有时间加载,但没有任何变化

WebDriverWait wait = new WebDriverWait(driver, 100);
element = wait.until(ExpectedConditions.elementToBeClickable(By.id("loginLastName")));

嵌套在两个 <divs> 和一个 <form> 中有关系吗?我是否必须遍历这些元素,才能深入到这个或其他什么? (似乎过于复杂,虽然我没有那么多地使用 selenium)。

告诉我!

你能试试下面的 Xpaths

#Get Xpath with combination
//input[@type='text' and @id='loginLastName']

#Xpath assuming there are multiple elements (DOM  mentioning 1 of 2 elements)
(//input[@type='text' and @id='loginLastName'])[1]

#Get Xpath with another combination
//input[@type='text' and @aria-describedby='loginLastNameAria']

附录

List <WebElement> elementCheck = driver.findElements(By.xpath("<xpath of element>"))

if (elementCheck.size() == 0){

//Element not present when entered to the page
//Do something

}else {

//Do something

}

好的,看到你的页面我相信我知道问题出在哪里了。您试图识别的“姓氏”字段位于两个嵌套的 shadow-root 元素中。 Selenium 不会查看影子根,除非您识别它并告诉它在那里查看。尝试使用这样的代码:

JavascriptExecutor js;
WebElement shadowRootElement = js.executeScript('''return document.querySelector("refi-common-login-form").shadowRoot''');

WebElement shadowRootChild = js.executeScript('''return arguments[0].querySelector("refi-common-last-name").shadowRoot''', shadowRootElement);

shadowRootChild.findElement(By.id("loginLastName")).sendKeys("This is a test");