在 Selenium 中避免 NoSuchElementException 的最佳方法是什么?

新手上路,请多包涵

我使用 Java 在 Selenium WebDriver 中编写了一些测试用例,并在网格(集线器和多个节点)上执行它们。我注意到一些测试用例由于 NoSuchElementException 而失败。避免 NoSuchElementException 并确保始终找到该元素的最佳和可靠方法是什么?

原文由 Parminder Singh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 712
2 个回答

您永远无法确定会找到该元素,实际上这是功能测试的目的 - 告诉您页面上是否有任何更改。但是绝对有帮助的一件事是添加等待经常导致 NoSuchElementException 的元素—

 WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id<locator>));

原文由 Petr Mensik 发布,翻译遵循 CC BY-SA 3.0 许可协议

我完全同意上面的 Petr Mensik。你永远不能说元素是否存在的问题。您应该清楚地了解为什么会发生。根据我的经验,我应该说它的发生是由于以下原因:

  • 1)页面还在渲染中,你已经完成了元素搜索,没有元素异常。
  • 2)第二个原因是AJAX还没有返回,你已经得到 NoSuchElementException
  • 3)第三个最明显:该元素实际上不在页面上。

因此,恕我直言,使用一个函数调用来处理所有这三种情况的最可靠方法是使用 fluentWait 正如 Amith003 所建议的那样。

所以代码如下:

让你的元素有定位器:

 String elLocXpath= "..blablabla";
WebElement myButton= fluentWait(By.xpath(elLocXpath));
myButton.click();

public WebElement fluentWait(final By locator){
        Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
                .withTimeout(30, TimeUnit.SECONDS)

                .pollingEvery(5, TimeUnit.SECONDS)

        .ignoring(org.openqa.selenium.NoSuchElementException.class);
        WebElement foo = wait.until(
                new Function<WebDriver, WebElement>() {
                    public WebElement apply(WebDriver driver) {
                        return driver.findElement(locator);
                    }
                }
        );
        return  foo;
    };

此外,如果您的目的是使用 try{} catch{} 块进行健壮的代码包装 fluentWait()

也不要忘记

 public boolean isElementPresent(By selector)
   {

              return driver.findElements(selector).size()>0;
}

这也很有用。

因此,总结所有提到的内容,如果您想避免 NoElement 异常,只需正确处理它,因为没有人可以确保页面上的元素存在。

希望现在你更清楚了。问候

原文由 eugene.polschikov 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题