Java Customwait-Check元素在SeleniumWebDriver中可见/消失(元素在DOM中,但不可见)

Java Customwait-Check元素在SeleniumWebDriver中可见/消失(元素在DOM中,但不可见),java,selenium,selenium-webdriver,webdriver,Java,Selenium,Selenium Webdriver,Webdriver,我想实现一个自定义的等待方法,应该等到加载弹出窗口可见 此加载弹出窗口有自己的id=“等待”。我使用此自定义expectedConditions(来自Stackoverflow)检查它: public static ExpectedCondition<Boolean> absenceOfElementLocated( final WebElement element) { return new ExpectedCondition<Bool

我想实现一个自定义的等待方法,应该等到加载弹出窗口可见

此加载弹出窗口有自己的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();
            }
        };
    }
公共静态预期条件元素缺失已定位(
最终网页元素){
返回新的ExpectedCondition(){
@凌驾
公共布尔应用(WebDriver驱动程序){
试一试{
元素。isDisplayed();
返回false;
}捕获(无接触元素例外e){
返回true;
}捕获(StaleElementReferenceException e){
返回true;
}
}
@凌驾
公共字符串toString(){
返回“元素不存在:”+element.getText();
}
};
}
我的脚本在加载仍然可见时传递,我不知道为什么

谢谢

使用

您也可以使用否定->

一个基本的例子:
转到此页面:

此页面上有
Submit
按钮,如果单击此按钮,屏幕上将显示
Selected
消息,几秒钟后此消息将消失。

因此,我们将在代码中等待以下事件:

  • 按钮出现并可单击(在不可单击之前无法单击)
  • 该消息将显示并可见
  • 消息消失,但不可见


结果是:

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
使用

您也可以使用否定->

一个基本的例子:
转到此页面:

此页面上有
Submit
按钮,如果单击此按钮,屏幕上将显示
Selected
消息,几秒钟后此消息将消失。

因此,我们将在代码中等待以下事件:

  • 按钮出现并可单击(在不可单击之前无法单击)
  • 该消息将显示并可见
  • 消息消失,但不可见


结果是:

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

如果没有更多的代码,很难说为什么您的代码不能工作。您的自定义等待中确实存在一些逻辑错误,但您不需要该自定义等待,因为
ExpectedConditions
已经涵盖了可见性和不可见性

使用此选项等待弹出窗口出现

new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(By.id("wait")));
使用此选项等待弹出窗口消失

new WebDriverWait(driver, 10).until(ExpectedConditions.invisibilityOfElementLocated(By.id("wait")));
有时,弹出窗口只是动态加载内容的容器。在这些情况下,您可能会等待弹出窗口的框架出现,但框架的内容尚未完全加载,因此如果您尝试与它们交互,则会出现错误。在这些情况下,您需要等待容器中的元素可见

对话框关闭时也是如此。我曾经有过这样的经历:我一直在等待对话框容器关闭,但灰色的覆盖层仍然在阻止点击,等等。在这种情况下,我不得不等待覆盖层变得不可见


我建议您花一些时间熟悉
ExpectedConditions
的可用方法,避免编写自定义等待,以等待已经存在且不需要调试/测试的内容。

如果没有更多的代码,很难说代码为什么不能工作。您的自定义等待中确实存在一些逻辑错误,但您不需要该自定义等待,因为
ExpectedConditions
已经涵盖了可见性和不可见性

使用此选项等待弹出窗口出现

new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(By.id("wait")));
使用此选项等待弹出窗口消失

new WebDriverWait(driver, 10).until(ExpectedConditions.invisibilityOfElementLocated(By.id("wait")));
有时,弹出窗口只是动态加载内容的容器。在这些情况下,您可能会等待弹出窗口的框架出现,但框架的内容尚未完全加载,因此如果您尝试与它们交互,则会出现错误。在这些情况下,您需要等待容器中的元素可见

对话框关闭时也是如此。我曾经有过这样的经历:我一直在等待对话框容器关闭,但灰色的覆盖层仍然在阻止点击,等等。在这种情况下,我不得不等待覆盖层变得不可见


我建议您花一些时间熟悉
ExpectedConditions
的可用方法,避免编写自定义等待,以等待已经存在且不需要调试/测试的内容。

您可以使用WebDriverWait暂停执行,直到预期条件为真。ex:WebDriverWait wait=新的WebDriverWait(驱动程序,30000);wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(“yourPopUpId”));谢谢,我试过了,但没用。驱动程序无法识别弹出窗口更改。请尝试使用JavascriptExecutor并执行操作您可以使用WebDriverWait暂停执行,直到预期条件为真。ex:WebDriverWait wait=新的WebDriverWait(驱动程序,30000);wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(“yourPopUpId”));谢谢,我试过了,但没用。驱动程序无法识别弹出窗口更改..请尝试使用JavascriptExecutor并执行操作Hello Jeff,感谢您的回复。主要问题是,所有提到的方法都不起作用,因此我尝试了自定义等待方法。预期条件非常简单,但在本例中并非如此。我想,(只是假设)主要问题是,这个wait元素总是在dom中,我每次都可以在源代码中找到它,每个页面,只是可见性在变化,webdriver无法识别差异。我在其他网站上尝试过这些方法,效果很好,但在这种情况下,我无法使用它。有些把戏是不可能的