Контроль частоты опроса браузера .wait() (Свободная ожидание)

История:

В языковых привязках Java selenium существует FluentWait class, что позволяет строго контролировать, как будет проверяться ожидаемое условие:

Каждый экземпляр FluentWait определяет максимальное время ожидания для условия, а также частоты, с помощью которой можно проверить состояние. Кроме того, пользователь может настроить ожидание, чтобы игнорировать определенные типы исключений во время ожидания, такие как NoSuchElementExceptions при поиске элемента на странице.

Другими словами, можно изменить интервал опроса, в котором применяется ожидаемая проверка состояния, которая по умолчанию равна 500 мс. Кроме того, можно установить исключения для игнорирования.

Это возможно в Python, существуют соответствующие аргументы poll_frequency и ignored_exceptions для класса WebDriverWait.

Вопрос:

Можно ли контролировать частоту опроса, в котором ожидаемое условие проверяется при использовании browser.wait() в Protractor/WebDriverJS?


Согласно browser.wait() документации, существует только 3 возможных аргумента: функция, которая является ожидаемым условием, значением таймаута и необязательное сообщение об ошибке таймаута. Я надеюсь, что есть другая настройка или способ изменить частоту опроса.

Ответ 1

С помощью @Kirill S. после дальнейших исследований и проверки исходного кода WebdriverJS, я могу заключить, что нет такого как "частота опроса" в привязках selenium javascript. Интервал между последующими вызовами проверки условий не может быть настроен - он выполняет проверку как можно быстрее.

Это не то же самое, что в случае, например, связок Python или Java selenium, где есть настраиваемый таймаут между проверками состояния ожидаемого состояния. По умолчанию он будет ждать 500 мс до следующей проверки:

WebDriverWait по умолчанию вызывает ExpectedCondition каждые 500 миллисекунды, пока он не вернется успешно. Успешное возвращение для Тип ExpectedCondition - это Boolean return true или not null return value для всех других типов ExpectedCondition.

Ответ 2

Ну, в соответствии с документами, которые я прочитал, похоже, не существует реального метода, который отражает функциональность FluentWait. Вместо этого этот фрагмент можно использовать для изменения частоты опроса, и он избегает почти всех исключений (почти все).

def wait_until(predicate, timeout_seconds, period=0.25, show_log=True):
    """
    @summary Call repeatedly the predicate until it returns true or timeout_seconds passed.
    @param predicate: a condition, modelized as a callable,  that will valued either as True or False
    @param timeout_seconds: the timeout in second
    @param period: the time to sleep between 2 calls to predicate. Defaults to 0.25s.
    @return True if a call to predicate returned True before timeout_seconds passed, else False
    """
    if show_log:
        myLogger.logger.info("waiting until predicate is true for {end} seconds".format(end=timeout_seconds))
    ultimatum = time.time() + timeout_seconds
    while time.time() < ultimatum:
        myLogger.logger.debug("checking predicate for wait until : {spent} / {end}".format(spent=str(time.time() - (ultimatum - timeout_seconds)), end=timeout_seconds))
        try:
            if predicate():
                return True
            time.sleep(period)
        except Exception as e:
            myLogger.logger.warn("Exception found: {}".format(e))
    return False

Следовательно, предикат может быть lambda, который вы передаете, который проверяет состояние рассматриваемого WebElement.