使用Java的Selenium WebDriver测试中等效的waitForVisible / waitForElementPresent?

时间:2012-06-07 23:19:17

标签: java selenium webdriver selenium-webdriver selenium-ide

使用“HTML”Selenium测试(使用Selenium IDE或手动创建),您可以使用某些very handy commands,例如 WaitForElementPresent WaitForVisible < /强>

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

在用Java编写Selenium测试时(Webdriver / Selenium RC-我不确定这里的术语),是否有类似的内置

例如,检查对话框(需要一段时间才能打开)是可见的......

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

对此类检查进行编码的最简洁强大的方法是什么?

在整个地方添加Thread.sleep()个电话会变得丑陋而且很脆弱,而你自己的循环播放也显得非常笨拙......

5 个答案:

答案 0 :(得分:95)

Implicit and Explicit Waits

隐含等待

  

隐式等待是告诉WebDriver对DOM进行轮询   尝试查找一个或多个元素的时间量   没有立即可用。默认设置为0.一旦设置,   隐式等待是为WebDriver对象实例的生命周期设置的。

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

明确等待+ Expected Conditions

  

显式等待是您定义的等待某个条件的代码   在进一步执行代码之前发生。最坏的情况   是Thread.sleep(),它将条件设置为精确的时间段   等待。提供了一些便于您编写的便捷方法   只需要等待的代码。 WebDriver等待   与ExpectedCondition的结合是一种可行的方式   来完成的。

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

答案 1 :(得分:8)

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

在抛出TimeoutException之前等待最多10秒或者等待   它发现元素将在0-10秒内返回。 WebDriverWait   默认情况下,每500毫秒调用一次ExpectedCondition直到它   成功返回。成功的回报是针对ExpectedCondition   type is Boolean返回true或not null返回所有其他值的值   预期的条件类型。


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

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

来自WebDriver docs: Explicit and Implicit Waits

答案 2 :(得分:0)

好吧,你可能实际上不希望测试无限期地运行。您只想在库决定元素不存在之前等待更长的时间。在这种情况下,最优雅的解决方案是使用隐式等待,它仅用于:

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

答案 3 :(得分:0)

另一种等待最大数量的方法,例如10秒钟的时间,该元素将显示如下:

(new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
            public Boolean apply(WebDriver d) {
                return d.findElement(By.id("<name>")).isDisplayed();

            }
        });

答案 4 :(得分:-3)

对于单个元素,可以使用以下代码:

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);
        }