Customwait - 使用selenium webdriver可以看到/消失Check元素(元素在DOM中,但不可见)

时间:2017-10-10 17:20:54

标签: java selenium selenium-webdriver webdriver

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

此加载弹出窗口有自己的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();
            }
        };
    }

当加载仍然可见时,我的脚本会传递,我不知道为什么。

谢谢!

2 个答案:

答案 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的可用方法,并节省自己必须为已经存在且不需要调试/测试的事情编写自定义等待。