在使用Java的Selenium WebDrivertesting中waitForVisible / waitForElementPresent的等效性?

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

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

在Java中编写Seleniumtesting(Webdriver / Selenium RC-I'm不确定这里的术语), 有没有类似的内置

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

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

什么是最简洁的方法来编码这种检查?

添加Thread.sleep()调用遍布整个地方将是丑陋和脆弱的,滚动自己的while循环似乎也很笨拙…

隐式和显式等待

隐式等待

一个隐含的等待就是告诉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"))); 
 WebElement myDynamicElement = (new WebDriverWait(driver, 10)) .until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement"))); 

在等待10秒之前抛出一个TimeoutException,或者如果它发现元素将在0-10秒内返回。 WebDriverWait默认每500毫秒调用ExpectedCondition,直到成功返回。 ExpectedCondition成功返回types为Boolean返回true或非null返回所有其他ExpectedConditiontypes的值。


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

元素是可点击的 – 显示并启用。

从WebDriver文档:显式和隐式等待

那么事情是,你可能实际上不希望testing无限期地运行。 您只是想在图书馆决定元素不存在之前等待更长的时间。 在这种情况下,最优雅的解决scheme是使用隐式等待,这是专门为此而devise的:

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

您可以使用“导出”菜单并查看生成的代码中的内容。

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

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