我在 UI 测试期间遇到以下错误。
org.openqa.selenium.WebDriverException: Element not found or not visible for xpath: (//div[@class='popupContent'])[last()]/div/div/div/div/div[2]/div/table/tbody Build info: version: '3.13.0', revision: '2f0d292', time: '2018-06-25T15:24:21.231Z' System info: host: 'x', ip: '172.25.x.x', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_60' Driver info: driver.version: unknown
谁能告诉我是什么原因导致了这个错误?
谢谢
最佳答案
此错误消息...
org.openqa.selenium.WebDriverException: Element not found or not visible for xpath: (//div[@class='popupContent'])[last()]/div/div/div/div/div[2]/div/table/tbody
...意味着 WebDriver 实例无法根据您使用的定位器策略找到任何元素。
<小时/>原因
错误元素未找到或不可见的原因可能是以下任一原因:
- 您采用的定位器策略未识别 HTML DOM 中的任何元素.
- 您采用的定位器策略无法识别该元素,因为它不在浏览器的 Viewport 内.
- 您采用的定位器策略标识了该元素,但由于属性style="display: none;"的存在而不可见。
- 您采用的定位器策略无法唯一标识HTML DOM中所需的元素,并且当前会找到一些其他隐藏/不可见元素。
- 您尝试查找的WebElement位于
<iframe>
内标签。 - 即使在 HTML DOM 中出现/可见该元素之前,WebDriver 实例也会寻找 WebElement。
解决方案
解决NoSuchElementException的解决方案可以是以下任一:
采用Locator Strategy它唯一标识所需的WebElement。您可以借助开发人员工具(Ctrl+Shift+I 或 F12)并使用元素检查器。
在这里您可以找到关于 how to inspect element in selenium3.6 as firebug is not an option any more for FF 56? 的详细讨论
使用
executeScript()
滚动元素查看的方法如下:WebElement elem = driver.findElement(By.xpath("element_xpath")); ((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", elem);
在这里您可以找到关于 Scrolling to top of the page in Python using Selenium 的详细讨论
如果元素具有属性style="display: none;",请通过
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
在这里您可以找到关于 Is it possible to switch to an element in a frame without using driver.switchTo().frame(“frameName”) in Selenium Webdriver Java? 的详细讨论.
如果该元素未立即在 HTML DOM 中存在/可见,则引发 WebDriverWait与 ExpectedConditions设置为正确的方法如下:
-
new WebDriverWait(driver, 20).until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@class='buttonStyle']//input[@id='originTextField']")));
等待visibilityOfElementLocated :
new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='buttonStyle']//input[@id='originTextField']")));
-
new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@class='buttonStyle']//input[@id='originTextField']")));
-
JDK版本问题
除了上述原因/解决方案之外,您的主要问题之一是您正在使用的二进制文件版本之间不兼容,如下所示:
- 您的JDK版本是1.8.0_60,它非常古老且古老。
因此,您使用的 JDK v8u60 和 Selenium Client v3.13.0 之间存在明显的不匹配。
解决方案
- 将 JDK 升级到最新级别 JDK 8u181 .
- 将Selenium升级到当前级别 Version 3.14.0 .
- 执行你的
@Test
.
关于java - org.openqa.selenium.WebDriverException 错误的根本原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51979073/