相当于 waitForVisible/waitForElementPresent 在使用 Java 的 Selenium WebDriver 测试中出现?

使用“HTML”Selenium测试(使用Selenium IDE或手动创建),您可以使用一些非常方便的命令,例如WaitForElementPresentWaitForVisible

<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()


答案 1

隐式和显式等待

隐式等待

隐式等待是告诉 WebDriver 在尝试查找一个或多个元素(如果它们不能立即可用)时轮询 DOM 一段时间。默认设置为 0。设置后,将设置 WebDriver 对象实例生存期的隐式等待。

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

显式等待 + 预期条件

显式等待是您定义的代码,用于在代码中继续执行特定条件之前等待特定条件发生。最糟糕的情况是Thread.sleep(),它将条件设置为要等待的确切时间段。提供了一些方便的方法,可帮助您编写仅在需要时等待的代码。WebDriverWait与ExestCondition相结合是实现这一目标的一种方式。

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

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

这将在引发 TimeoutException 之前等待长达 10 秒,或者如果它找到该元素,则会在 0 - 10 秒内返回该元素。默认情况下,WebDriverWait 每 500 毫秒调用一次预期条件,直到它成功返回。对于预期条件类型,成功的返回是布尔返回 true 或对于所有其他预期条件类型不为 null 返回值。


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

元素是可单击的 - 它被显示并启用。

来自 WebDriver 文档:显式和隐式等待


推荐