NoSuchElementException,Selenium无法找到元素 [英] NoSuchElementException, Selenium unable to locate element
问题描述
我想在硒中找到我的TextField,但我不知道如何(我第一次使用Sellenium).
我尝试过:
driver.findElement(By.id("originTextField"))
或通过xPath和cssSelector由chrome在开发工具中生成的字符串.
请帮助我,我会感谢您的解释.
这是html:
NoSuchElementException
org.openqa. selenium.NoSuchElementException (通常称为 NoSuchElementException )扩展了 WebDriverException .
在以下两种情况下可以抛出NoSuchElementException :
-
使用
WebDriver.findElement(By by)
时://example : WebElement my_element = driver.findElement(By.xpath("//my_xpath"));
-
使用
WebElement.findElement(By by)
时://example : WebElement my_element = element.findElement(By.xpath("//my_xpath"));
按照JavaDocs的规定,与其他 WebDriverException 一样, NoSuchElementException 应该包含以下常量字段:
Constant Field Type Value
SESSION_ID public static final java.lang.String "Session ID"
e.g. (Session info: chrome=63.0.3239.108)
DRIVER_INFO public static final java.lang.String "Driver info"
e.g. (Driver info: chromedriver=2.34.522940 (1a76f96f66e3ca7b8e57d503b4dd3bccfba87af1),platform=Windows NT 6.1.7601 SP1 x86)
BASE_SUPPORT_URL protected static final java.lang.String "http://seleniumhq.org/exceptions/"
e.g. (For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html)
原因
出现 Element异常的原因可以是以下任一原因:
- 您采用的定位器策略在视口.
- 您采用的定位器策略可以识别元素,但是由于存在属性 style ="display:none;" 而不会显示.
- 您采用的定位器策略不能唯一标识 HTML DOM 中所需的元素,并且当前可以找到其他隐藏/不可见元素.
- 您要查找的 WebElement 位于
<iframe>
标记内. - 甚至在元素在 HTML DOM 中存在/可见之前, WebDriver 实例仍在寻找 WebElement .
解决方案
解决 NoSuchElementException 的解决方案可以是以下任意一种:
-
采用唯一的定位器策略标识所需的 WebElement .您可以使用开发人员工具( Ctrl + Shift + I 或 F12 ),然后使用 Element Inspector .
在这里,您可以在
executeScript()
方法来滚动元素以查看,如下所示:WebElement elem = driver.findElement(By.xpath("element_xpath")); ((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", elem);
在这里您可以找到有关,请通过
executeScript()
方法删除该属性,如下所示:WebElement element = driver.findElement(By.xpath("element_xpath")); ((JavascriptExecutor)driver).executeScript("arguments[0].removeAttribute('style')", element) element.sendKeys("text_to_send");
-
要检查元素是否在
<iframe>
中,请遍历 HTML 以找到相应的<iframe>
标签和switchTo()
所需的 iframe 通过以下两种方法之一:driver.switchTo().frame("frame_name"); driver.switchTo().frame("frame_id"); driver.switchTo().frame(1); // 1 represents frame index
您可以在.. p>
-
如果该元素在 HTML DOM 中不存在 /可见,请诱导 ExpectedConditions 设置为以下适当方法:>
参考
您可以找到 Selenium 的<在基于客户端的相关讨论中,使用href ="/questions/tagged/python" class ="post-tag" title =显示标记为'python'" rel ="tag"> python 基于客户端的问题
i would like to find my TextField in selenium, but i dont know how (i use sellenium for the first time).
I tried:
driver.findElement(By.id("originTextField"))
or by xPath and cssSelector String generated by chrome in dev tools.
Please help me, i would appreciate explanation.
this is html:
NoSuchElementException
org.openqa.selenium.NoSuchElementException popularly known as NoSuchElementException extends org.openqa.selenium.NotFoundException which is a type of WebDriverException.
NoSuchElementException can be thrown in 2 cases as follows :
When using
WebDriver.findElement(By by)
://example : WebElement my_element = driver.findElement(By.xpath("//my_xpath"));
When using
WebElement.findElement(By by)
://example : WebElement my_element = element.findElement(By.xpath("//my_xpath"));
As per the JavaDocs just like any other WebDriverException, NoSuchElementException should contain the following Constant Fields :
Constant Field Type Value
SESSION_ID public static final java.lang.String "Session ID"
e.g. (Session info: chrome=63.0.3239.108)
DRIVER_INFO public static final java.lang.String "Driver info"
e.g. (Driver info: chromedriver=2.34.522940 (1a76f96f66e3ca7b8e57d503b4dd3bccfba87af1),platform=Windows NT 6.1.7601 SP1 x86)
BASE_SUPPORT_URL protected static final java.lang.String "http://seleniumhq.org/exceptions/"
e.g. (For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html)
Reason
The reason for NoSuchElementException can be either of the following :
- The Locator Strategy you have adopted doesn't identifies any element in the HTML DOM.
- The Locator Strategy you have adopted is unable to identify the element as it is not within the browser's Viewport.
- The Locator Strategy you have adopted identifies the element but is invisible due to presence of the attribute style="display: none;".
- The Locator Strategy you have adopted doesn't uniquely identifies the desired element in the HTML DOM and currently finds some other hidden / invisible element.
- The WebElement you are trying to locate is within an
<iframe>
tag. - The WebDriver instance is looking out for the WebElement even before the element is present/visibile within the HTML DOM.
Solution
The solution to address NoSuchElementException can be either of the following :
Adopt a Locator Strategy which uniquely identifies the desired WebElement. You can take help of the Developer Tools (Ctrl+Shift+I or F12) and use Element Inspector.
Here you will find a detailed discussion on how to inspect element in selenium3.6 as firebug is not an option any more for FF 56?
Use
executeScript()
method to scroll the element in to view as follows :WebElement elem = driver.findElement(By.xpath("element_xpath")); ((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", elem);
Here you will find a detailed discussion on Scrolling to top of the page in Python using Selenium
Incase element is having the attribute style="display: none;", remove the attribute through
executeScript()
method as follows :WebElement element = driver.findElement(By.xpath("element_xpath")); ((JavascriptExecutor)driver).executeScript("arguments[0].removeAttribute('style')", element) element.sendKeys("text_to_send");
To check if the element is within an
<iframe>
traverse up the HTML to locate the respective<iframe>
tag andswitchTo()
the desired iframe through either of the following methods :driver.switchTo().frame("frame_name"); driver.switchTo().frame("frame_id"); driver.switchTo().frame(1); // 1 represents frame index
Here you can find a detailed discussion on Is it possible to switch to an element in a frame without using driver.switchTo().frame("frameName") in Selenium Webdriver Java?.
If the element is not present/visible in the HTML DOM immediately, induce WebDriverWait with ExpectedConditions set to proper method as follows :
To wait for presenceOfElementLocated :
new WebDriverWait(driver, 20).until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@class='buttonStyle']//input[@id='originTextField']")));
To wait for visibilityOfElementLocated :
new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='buttonStyle']//input[@id='originTextField']")));
To wait for elementToBeClickable :
new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@class='buttonStyle']//input[@id='originTextField']")));
Reference
You can find Selenium's python client based relevant discussion in:
这篇关于NoSuchElementException,Selenium无法找到元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!