在使用Java的Selenium WebDrivertesting中waitForVisible / waitForElementPresent的等效性?
使用“HTML”Seleniumtesting(使用Selenium IDE或手动创build),您可以使用一些非常方便的命令,如WaitForElementPresent
或WaitForVisible
。
<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); }