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

Jon*_*nik 54 java selenium webdriver selenium-ide selenium-webdriver

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

<tr>
    <td>waitForElementPresent</td>
    <td>id=saveButton</td>
    <td></td>
</tr>
Run Code Online (Sandbox Code Playgroud)

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

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

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

编码此类检查的最简洁的方法是什么?

Thread.sleep()在整个地方添加调用将是丑陋和脆弱的,并且滚动自己的while循环似乎也非常笨拙...

Pet*_*ček 97

隐式和显式等待

隐含的等待

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

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)

显式等待+ 预期条件

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

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

  • ExpectedConditions 是类还是接口?如果是这样,应该为此导入什么包? (2认同)

小智 9

WebElement myDynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));
Run Code Online (Sandbox Code Playgroud)

在抛出TimeoutException之前等待最多10秒,或者如果它发现元素将在0-10秒内返回它.WebDriverWait默认情况下每500毫秒调用一次ExpectedCondition,直到它成功返回.对于所有其他ExpectedCondition类型,ExpectedCondition类型的布尔返回true或非null返回值成功返回.


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

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

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