Вы можете немного растянуть операции 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