java - org.openqa.selenium.WebDriverException 错误的根本原因是什么?

标签 java selenium selenium-webdriver webdriver

我在 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+IF12)并使用元素检查器

    在这里您可以找到关于 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存在/可见,则引发 WebDriverWaitExpectedConditions设置为正确的方法如下:

    • 等待presenceOfElementLocated :

      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']")));
      
    • 等待elementToBeClickable :

      new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@class='buttonStyle']//input[@id='originTextField']")));
      
<小时/>

JDK版本问题

除了上述原因/解决方案之外,您的主要问题之一是您正在使用的二进制文件版本之间不兼容,如下所示:

  • 您的JDK版本1.8.0_60,它非常古老古老

因此,您使用的 JDK v8u60Selenium Client v3.13.0 之间存在明显的不匹配。

解决方案

关于java - org.openqa.selenium.WebDriverException 错误的根本原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51979073/

相关文章:

java - "java.lang.IllegalStateException: The driver executable does not exist"报告奇数附加路径

python - 等到加载器消失 python selenium

javascript - 如何过滤掉 Protractor 中启用的按钮?

html - 如何为动态数据表创建xpath?

java - 将文件路径更改为更常见的文件夹

java - 跨多个请求周期保留组件状态

java - java 应用程序中 drools 工作台的火灾规则

java - 是否可以用 Java 编写 "foreach"函数?

java - 为什么 Selenium WebDriver 不会切换到我的新选项卡(Excel 报告)

python - Selenium 文本不起作用