Подтвердить что ты не робот

Эквивалент waitForVisible/waitForElementPresent в тестах Selenium WebDriver с использованием Java?

С тестами Selenium "HTML" (созданные с помощью Selenium IDE или вручную) вы можете использовать некоторые очень удобные команды, например WaitForElementPresent или WaitForVisible.

<tr>
    <td>waitForElementPresent</td>
    <td>id=saveButton</td>
    <td></td>
</tr>

При кодировании тестов Selenium в Java (Webdriver/Selenium RC-I'm не уверен в терминологии здесь), есть что-то подобное встроенное?

Например, для проверки того, что диалог (который занимает некоторое время, чтобы открыть), виден...

WebElement dialog = driver.findElement(By.id("reportDialog"));
assertTrue(dialog.isDisplayed());  // often fails as it isn't visible *yet*

Какой самый чистый надежный способ кодирования такой проверки?

Добавление Thread.sleep() звонков по всему месту было бы уродливым и хрупким, и катит ваш собственный, пока петли тоже выглядят довольно неуклюжими...

4b9b3361

Ответ 1

Неявные и явные ожидания

Неявная ожидаемая

Неявное ожидание - сообщить WebDriver о опросе DOM для определенного количество времени, когда вы пытаетесь найти элемент или элементы, если они не сразу доступны. Значение по умолчанию равно 0. После установки неявное ожидание задается для жизни экземпляра объекта WebDriver.

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

Явная ожидаемая + Ожидаемые условия

Явным ожиданиям является код, который вы определяете, чтобы ждать определенного условия чтобы произойти, прежде чем продолжить код. Худший случай этого это Thread.sleep(), который устанавливает условие на точный период времени для Подождите. Существуют некоторые методы удобства, которые помогут вам написать код, который будет ждать только столько, сколько потребуется. WebDriverWait в сочетание с ExpectedCondition - это один из способов, которым это может быть выполняется.

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(
        ExpectedConditions.visibilityOfElementLocated(By.id("someid")));

Ответ 2

WebElement myDynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));

Ожидается до 10 секунд, прежде чем бросать исключение TimeoutException или если он обнаруживает, что элемент вернет его за 0 - 10 секунд. WebDriverWait по умолчанию вызывает Ожидаемое условие каждые 500 миллисекунд, пока оно возвращается успешно. Успешное возвращение - для ExpectedCondition type is Boolean возвращает true или нет null возвращаемое значение для всех остальных Ожидаемые типы условий.


WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));

Элемент Clickable - он отображается и активируется.

От Документы WebDriver: Явные и неявные ожидания

Ответ 3

Хорошо, дело в том, что вы, вероятно, на самом деле не хотите, чтобы тест выполнялся бесконечно. Вы просто хотите подождать больше времени, прежде чем библиотека решит, что элемент не существует. В этом случае наиболее элегантным решением является использование неявного ожидания, которое предназначено только для этого:

driver.manage().timeouts().implicitlyWait( ... )

Ответ 4

Вы можете просто использовать меню "Экспорт" и посмотреть, что в сгенерированном коде.

Ответ 5

Другой способ ожидания максимума определенной суммы, скажем, 10 секунд времени для отображения элемента, как показано ниже:

(new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
            public Boolean apply(WebDriver d) {
                return d.findElement(By.id("<name>")).isDisplayed();

            }
        });

Ответ 6

Для отдельных элементов можно использовать следующий код:

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);
        }