使用“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()
个电话会变得丑陋而且很脆弱,而你自己的循环播放也显得非常笨拙......
答案 0 :(得分:95)
隐含等待
隐式等待是告诉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")));
元素可点击 - 显示并启用。
答案 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);
}