您可以在Java和Selenium中创建用于显式等待的通用或可重用方法吗?

时间:2018-07-05 16:33:17

标签: java selenium-webdriver

我们可以为Java和Selenium中的显式等待创建通用或可重用的方法吗?

使用预期的条件,例如,visibleOfElementLocated,presenceOfElementLocated,elementToBeClickable

感谢您的帮助。

谢谢

1 个答案:

答案 0 :(得分:1)

您完全可以。我是从这里写的另一个答案中摘录的:Selenium java SafariDriver wait for page to load after click

public ExpectedCondition<Boolean> myCustomCondition(/* some arguments from the outside */) {
return new ExpectedCondition<Boolean>() {
        public Boolean apply(WebDriver driver) {
            // Check something on the page and return either true or false,
            // this method will be run repeatedly until either the time
            // limit is exceeded, or true is returned
        }

        public String toString() {
            return "a description of what this is waiting for";
        }
    };
}

将其包装在函数中是我经验中最常见的方法。但是要知道的要点是,您想要获得ExpectedCondition的实例,该实例提供了apply()和toString()方法的实现。

apply()仅在满足条件时才返回true。

这是一个简单的真实示例:

public ExpectedCondition<Boolean> waitForElementToHaveText(final WebElement element, final String expectedText) {
    return new ExpectedCondition<Boolean>() {
        public Boolean apply(WebDriver driver) {
            try {
                return element.getText().equals(expectedText);
            } catch (Exception e) {
                return false; // catchall fail case
            }
        }

        public String toString() {
            return "an element to have specific text";
        }
    };
}

可以这样使用:

WebDriverWait wait = new WebDriverWait(driver, maxSecondsToWait);
wait.until(waitForElementToHaveText(anElement, "my visible text"));

编辑:

一些额外的注释,如果您注意到ExpectedCondition使用的声明的泛型类型为布尔值,则意味着您要返回true或false以确定是否满足条件。但是null也可以替代false。因此,您可以执行此操作的另一种方法是声明ExpectedCondition具有通用类型WebElement,并在不满足条件时返回null。

public static ExpectedCondition<WebElement> waitForElementToContainText(final String cssSelector, final String visibleText) {
    return new ExpectedCondition<WebElement>() {
        @Override
        public WebElement apply(WebDriver webDriver) {
            WebElement anElement = webDriver.findElement(By.cssSelector(cssSelector);
            if (anElement.getText().contains(visibleText)) {
                return anElement; // Condition passed
            }
            return null; // Condition failed
        }

        public String toString() {
            return "first occurance of text '" + visibleText + "' in element " + cssSelector;
        }
    };
}

当然,这些示例中的任何一个都可以使用<Boolean><WebElement>,并且只想为其选择合适的返回值。