我想实现一个自定义等待方法,它应该等到加载弹出窗口可见。
此加载弹出窗口有自己的id ="等待"。我使用这个自定义的expectedConditions(来自Stackoverflow)来检查它:
public static ExpectedCondition<Boolean> absenceOfElementLocated(
final WebElement element) {
return new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
try {
element.isDisplayed();
return false;
} catch (NoSuchElementException e) {
return true;
} catch (StaleElementReferenceException e) {
return true;
}
}
@Override
public String toString() {
return "element to not being present: " + element.getText();
}
};
}
当加载仍然可见时,我的脚本会传递,我不知道为什么。
谢谢!
答案 0 :(得分:0)
使用ExpectedConditions#invisibilityOfElementLocated(By locator)
你也可以使用否定 - &gt; ExpectedConditions#not(ExpectedCondition condition)
一个基本的例子:
转到此页面:Primefaces - dropdown
此页面上有Submit
按钮,如果您单击此按钮,屏幕上将显示Selected
消息,此消息将在几秒钟后消失。
因此,我们将在代码中等待以下事件:
WebDriver driver = new ChromeDriver();
try {
driver.get("https://www.primefaces.org/showcase/ui/ajax/dropdown.xhtml");
final By buttonSubmit = By.xpath("//button[ *[ text() = 'Submit' ]]");
final By message = By.xpath("//span[ text() = 'Selected' ]");
WebDriverWait wait = new WebDriverWait(driver, 50);
long time = System.currentTimeMillis();
wait.until(ExpectedConditions.elementToBeClickable(buttonSubmit)).click();
System.out.println(String.format("Button clicked after %d miliseconds", System.currentTimeMillis() - time));
wait.until(ExpectedConditions.visibilityOfElementLocated(message));
System.out.println(String.format("The message appeared after %d miliseconds", System.currentTimeMillis() - time));
// wait.until(ExpectedConditions.invisibilityOfElementLocated(message));
wait.until(ExpectedConditions.not(ExpectedConditions.visibilityOfElementLocated(message)));
System.out.println(String.format("The message dissapeared after %d miliseconds", System.currentTimeMillis() - time));
} finally {
driver.quit();
}
结果是:
Starting ChromeDriver 2.33.506120 (e3e53437346286c0bc2d2dc9aa4915ba81d9023f) on port 15827
.....
.....
.....
Button clicked after 153 miliseconds
The message appeared after 791 miliseconds
The message dissapeared after 6924 miliseconds
答案 1 :(得分:0)
如果没有更多代码,很难说明为什么你的代码无法运行。您在自定义等待中确实存在一些逻辑错误,但您不需要自定义等待,因为ExpectedConditions
已经具有可见性和隐身性。
使用此按钮等待弹出窗口
new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(By.id("wait")));
使用此按钮等待弹出窗口消失
new WebDriverWait(driver, 10).until(ExpectedConditions.invisibilityOfElementLocated(By.id("wait")));
有时,弹出窗口只是动态加载内容的容器。在这些情况下,您可能会等待弹出框架出现但帧的内容尚未完全加载,因此如果您尝试与它们进行交互,则会出现错误。在这些情况下,您需要等待容器内的元素可见。
对话框关闭时也是如此。我曾经有过等待关闭对话框容器的经历,但灰色叠加层仍然阻止了点击等。在这些情况下,我不得不等待叠加层变得不可见。
我建议您花一些时间熟悉ExpectedConditions
的可用方法,并节省自己必须为已经存在且不需要调试/测试的事情编写自定义等待。