在使用Java硒的webdriver测试waitForVisible / waitForElemen

2019-05-17 11:17发布

随着“HTML” Selenium测试(硒IDE或手动创建的),你可以使用一些非常方便的命令一样WaitForElementPresentWaitForVisible

<tr>
    <td>waitForElementPresent</td>
    <td>id=saveButton</td>
    <td></td>
</tr>

当编码Selenium测试在Java中(的webdriver /硒RC -我不知道这里的术语), 有没有类似的东西内置的

例如,用于检查一个对话框(即需要一段时间才能打开)可见...

WebElement dialog = driver.findElement(By.id("reportDialog"));
assertTrue(dialog.isDisplayed());  // often fails as it isn't visible *yet*

什么是最干净的可靠的方法代码,支票?

添加Thread.sleep()调用所有的地方将是丑陋的,脆弱的,滚动自己的while循环看起来很笨拙太...

Answer 1:

隐式和显等待

隐等待

隐式的等待是为了告诉webdriver的努力,如果他们没有立即找到一种或多种元素时,轮询DOM一定量的时间。 默认设置为0。一旦设定,隐含等待被设置为webdriver的对象实例的生命。

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

明确的等待+ 预期时

一个明确的等待是你定义等待中的代码,然后再继续出现一定的条件码。 这种最坏的情况是Thread.sleep()方法,这设定条件到一个确切的时间段等。 有提供一些方便的方法,可以帮助你编写代码,只等待,只要需要。 WebDriverWait与ExpectedCondition组合是一种方法可以完成此。

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(
        ExpectedConditions.visibilityOfElementLocated(By.id("someid")));


Answer 2:

WebElement myDynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));

这也是在等待长达10秒抛出一个TimeoutException之前,或者如果它发现的元素将在0返回它 - 10秒。 默认情况下WebDriverWait调用ExpectedCondition每500毫秒,直到它成功返回。 一个成功的回报是ExpectedCondition类型是所有其他类型的ExpectedCondition布尔返回true,否则返回null值。


WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));

元素是可点击 - 它显示并启用。

从webdriver的文档:显性和隐性等待



Answer 3:

那么事情是,你可能其实不想测试无限期地运行。 你只需要等待更长的时间量图书馆决定因素不存在了。 在这种情况下,最好的解决方法就是使用隐式的等待,这是专为这一点:

driver.manage().timeouts().implicitlyWait( ... )


Answer 4:

对于个别元件下方的码可以使用:

private boolean isElementPresent(By by) {
        try {
            driver.findElement(by);
            return true;
        } catch (NoSuchElementException e) {
            return false;
        }
    }
for (int second = 0;; second++) {
            if (second >= 60){
                fail("timeout");
            }
            try {
                if (isElementPresent(By.id("someid"))){
                    break;
                }
                }
            catch (Exception e) {

            }
            Thread.sleep(1000);
        }


文章来源: Equivalent of waitForVisible/waitForElementPresent in Selenium WebDriver tests using Java?