Как заставить селен ждать несколько элементов для загрузки - PullRequest
1 голос
/ 03 октября 2019

Я использую следующий код, чтобы дождаться загрузки всех 4 элементов, прежде чем приступить к очистке экрана;однако код не ожидает всех 4 и не генерирует ошибку тайм-аута - он просто продолжается, и я получаю сообщение об ошибке для элементов, которые еще не были загружены.

Чего мне не хватает, чтобы заставить Selenium ждать, пока все четыре элемента будут присутствовать, прежде чем продолжить?

        CSSSelector1_toWaitOn = "#div1 table tbody tr td"
        CSSSelector2_toWaitOn = "#div2 table tbody tr:nth-child(5) td"
        CSSSelector3_toWaitOn = "#div3 table tbody tr:nth-child(5) td"
        CSSSelector4_toWaitOn = "#div4 table tbody tr td"


        browser.get(url)
        browser_delay = 15  # seconds
        try:
            WebDriverWait(browser, browser_delay).until(expected_conditions and (
                expected_conditions.presence_of_element_located((By.CSS_SELECTOR, CSSSelector1_toWaitOn)) and
                expected_conditions.presence_of_element_located((By.CSS_SELECTOR, CSSSelector2_toWaitOn)) and
                expected_conditions.presence_of_element_located((By.CSS_SELECTOR, CSSSelector3_toWaitOn)) and
                expected_conditions.presence_of_element_located((By.CSS_SELECTOR, CSSSelector4_toWaitOn))))
        except TimeoutException:
            print("Selenium timeout")```

Ответы [ 3 ]

0 голосов
/ 03 октября 2019

Вместо того, чтобы пытаться объединить их все в одно ожидание, вы можете назначить отдельное ожидание для каждого.

...

try:
    wait = WebDriverWait(browser, browser_delay)
    wait.until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, CSSSelector1_toWaitOn))
    wait.until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, CSSSelector2_toWaitOn))
    wait.until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, CSSSelector3_toWaitOn))
    wait.until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, CSSSelector4_toWaitOn))))
except TimeoutException:
    print("Selenium timeout")

Просто имейте в виду, что в Selenium есть 3 уровня взаимодействия для элементов:

  1. присутствует - элемент находится в DOM. Если вы попытаетесь щелкнуть или получить текст и т. Д. Имеющегося (но не видимого) элемента, будет выдано исключение ElementNotInteractable.
  2. visible - элемент находится в DOM и видим (например, нет)невидимый, дисплей: нет и т. д.)
  3. кликабельно - элемент видим и активирован. Для большинства случаев это просто ... это видно? Особые случаи - это элементы типа кнопки ВВОД, помеченные как отключенные. Элемент, который стилизован как отключенный (выделен серым цветом) с помощью CSS, не считается отключенным.
0 голосов
/ 03 октября 2019

WebDriverWait.until ожидает вызываемого объекта. Это фактический фрагмент из его источника:

while True:
    try:
        value = method(self._driver)
        if value:
            return value

Все expected_contidition s являются вызываемыми объектами. Так что в этом случае вам нужно составить их, должно сработать что-то вроде следующего.

class composed_expected_conditions:
    def __init__(self, expected_conditions):
        self.expected_conditions = expected_conditions

    def __call__(self, driver):
        for expected_condition in self.expected_conditions:
            if not expected_condition(driver):
                return False

            return True

и передать его в until

conditions = [
    expected_conditions.presence_of_element_located((By.CSS_SELECTOR, CSSSelector1_toWaitOn)), 
    expected_conditions.presence_of_element_located((By.CSS_SELECTOR, CSSSelector2_toWaitOn)),
    expected_conditions.presence_of_element_located((By.CSS_SELECTOR, CSSSelector3_toWaitOn)),
    expected_conditions.presence_of_element_located((By.CSS_SELECTOR, CSSSelector4_toWaitOn)),
]

WebDriverWait(browser, browser_delay).until(composed_expected_conditions(conditions))
0 голосов
/ 03 октября 2019

Метод presence_of_element_located(locator) только проверяет наличие элемента в DOM. Это не значит, что с элементом можно взаимодействовать. Кроме того, процесс поиска находит все элементы для данного locator и возвращает первый.

Пожалуйста, убедитесь, что элемент действителен, доступен и специфичен. Если в списке несколько элементов, убедитесь, что ваш локатор достаточно конкретен, чтобы найти один элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...