Selenium: ожидаемые условия для явного ожидания с использованием WebElement - PullRequest
1 голос
/ 03 апреля 2019

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

Синтаксис следующий:

WebDriverWait(self._driver, 20).until(EC.element_to_be_clickable(BY.ID, 'some-id')).click()

Это говорит программе подождать, пока какой-либо элемент (расположенный по его идентификатору) станет активным.

Под капотом EC.element_to_be_clickable() вызывает внутреннюю функцию _find_element(), считывающую параметры, указанные в element_to_be_clickable() .. В этом случае она ищет в DOM элементы, соответствующие идентификатору: some-id.

Однако я не могу напрямую передать объект WebElement в функцию element_to_be_clickable(), поскольку он завершается с ошибкой во внутреннем вызове _find_element().

Есть ли способ, которым я могу использовать эти явные ожидания (или любые другие альтернативы) при работе с самими WebElements?

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

Спасибо заранее.

1 Ответ

1 голос
/ 04 апреля 2019

Вы можете немного растянуть операции WebDriverWait - передав ему не объект драйвера, а сам элемент и лямбда-функцию в until().

Как вы видели в его коде, "мясо" until() WebDriverWait состоит в том, чтобы вызывать переданную функцию с аргументом переданный объект и возвращать результат:

value = method(self._driver)
if value:
    return value

Таким образом, теоретически, вы можете передать сам элемент и в качестве функции иметь выражение, которое возвращает элемент, если все проверки совпадают, или False, если нет.
Оригинал element_to_be_clickable ожидает две вещи от элемента (помимо присутствия) - is_displayed() и is_enabled(). Таким образом, выражение внутри лямбды будет:

lambda x: x if x.is_displayed() and x.is_enabled() else False

И весь призыв он:

WebDriverWait(self.your_webelemt_object, 20).until(lambda x: x if x.is_displayed() and x.is_enabled() else False).click()

Я сказал "в теории", потому что я набираю это на мобильном телефоне :), и я не проверял это на практике (но теория ясна;). Что может пойти не так? Возникающее исключение, которое отличается от того, что обычно обрабатывает WebDriverWait (по умолчанию он обрабатывает только NoSuchElementException). Если это так, вы должны передать эти дополнительные исключения его конструктору:

WebDriverWait(self.your_webelemt_object, 20, ignored_exceptions=[NoSuchElementException, the_other_exceptions]).  # the rest omitted for brevity
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...