Java FluentWait в Python

В пакете java selenium-webdriver существует класс FluentWait:

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

Другими словами, это нечто большее, чем неявное и явное ожидание, дает вам больше возможностей для ожидания элемента. Это может быть очень удобно и, безусловно, имеет прецеденты.

Есть ли что-либо подобное в пакете python selenium или я должен сам реализовать его?

(Я просмотрел документацию для Waits - ничего там).

Ответ 1

Я считаю, что вы можете сделать это с Python, однако он не упакован так просто, как класс FluentWait. Некоторые из них были освещены в документации, которую вы предоставили не широко.

Класс WebDriverWait имеет необязательные аргументы для тайм-аутов, poll_frequency и ignored_exceptions. Таким образом, вы можете поставить его там. Затем объедините его с ожидаемым условием, чтобы ждать появления элементов, быть кликабельными и т.д. Вот пример:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import *

driver = webdriver.Firefox()
# Load some webpage
wait = WebDriverWait(driver, 10, poll_frequency=1, ignored_exceptions=[ElementNotVisibleException, ElementNotSelectableException])
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//div")))

Очевидно, вы можете комбинировать wait/element в один оператор, но я понял, что вы можете увидеть, где это реализовано.

Ответ 2

Ответ iChar описывает, как использовать WebDriverWait в Python, чтобы сделать то, что FluentWait делает в Java. Некоторые аспекты вопроса остались без внимания:

Другими словами, [ FluentWait] является чем-то большим, чем неявным и явным ожиданием

Нет. Начиная с версии 2.42.x Selenium существует только два вида ожиданий, которые Selenium реализует: неявный и явный. FluentWait не является чем-то дополнительным для этих двух видов ожидания. Это просто явное ожидание.

Есть ли что-то подобное в пакете pelon selenium или я должен сам реализовать его?

Единственная вещь, о которой я могу думать, отсутствует в реализации Python WebDriverWait, которая имеет FluentWaitWebDriverWait, по расширению), есть следующее:

[FluentWait (и, в добавлении, WebDriverWait)] может иметь свой тайм-аут и интервал опроса, настроенный на лету.

[Цитата из this.]

Класс WebDriverWait в Python сконструирован таким образом, что его значения конфигурации устанавливаются раз и навсегда, когда они создаются. FluentWait позволяет изменять конфигурацию после создания. Таким образом, один объект FluentWait (или любой WebDriverWait в Java) можно было бы повторно использовать для ожидания различных условий с разными частотами опроса. В Python вам нужно будет создать новый объект WebDriverWait для использования другой частоты опроса.

Итак, что-то не реализовано в реализации Python, но я бы не счел это достаточно значительным, чтобы гарантировать реализацию.

Ответ 3

Вышеприведенная реализация не сработала в моем случае использования, поэтому я также поделюсь своей реализацией. Для быстрого ожидания также неплохо проверить некоторые другие критерии при опросе, например, мы можем проверить, изменился ли там атрибут элемента. Итак, в моем состоянии страница должна быть обновлена. Ниже приведен код [он настраивается на 30 секунд (6 раз за цикл и 5 раз за каждую секунду)]:

element = None
i = 6
while element is None:
    try:
        wait = WebDriverWait(driver, 5, poll_frequency=1)
        element = wait.until(expected_conditions.visibility_of_element_located(el))
    except:
        driver.refresh()
        i = i - 1
        print(i)
        if i < 0:
            raise Exception('Element not found')