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");
我有一个简单的 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");