Не совсем понятно, в какой момент вы ищете элемент.
Очевидно, что между этими событиями элемент успевает обновится через ajax. Я рекомендую вам искать элемент прямо перед взаимодействием с ним.
Например, ваш метод проверки можно обернуть в декоратор, который перед этим найдет элемент и отдаст его как параметр вашей фукнции.
Если и это не поможет, то можно реализовать explict_wait: который в случае StaleElementReferenceException будет выполнять поиск и взаимодействовать с элементом:
def explict_wait():
timeout = time.time() + timeout.
while time.time() < timeout:
try:
find_element
do action with element
except StaleElementReferenceException:
pass
Dzmitry_Ihnatsyeu, зачем что то реализовывать, когда все есть из коробки?
maaxlee, если Вы изучаете driver+python, то и учите его, в первую очередь, а потом возьметесь за фреймворки.
Для того что бы решить вашу задачу, Вы должны перед каждым обращением к элементу, узнать есть ли он на странице. Проще всего это сделать, с помощью конструкции @property, которая будет перед отдачей элемента, искать его на странице. А вообще по хорошему, это делается в базовом классе, с идентификатором поиска (visible, clickable, present) и для всех элементов.
Что касается ожидания, то в selenium есть уже описанные методы поиска по критериям.
from selenium.webdriver.support import expected_conditions as ec
login_but = WebDriverWait(self.driver, 5).until(ec.element_to_be_clickable((By.CSS_SELECTOR, '#header > a')))
login_but.click()
Как уже написали выше, используйте встроенный wait_unitl. Добавлю только что возможно его будет не достаточно в случае ajax подгрузки информации. В таком случае необходимо вставлять топорный time.sleep() или дожидаться завершения ajax запроса. Для jQuery как то так:
def wait_for_ajax(self, xpath, timeout=5):
wait = WebDriverWait(self.driver, timeout=int(timeout))
message = "Element '%s' was not visible in %s second(s)." % (xpath, str(timeout))
wait.until(lambda driver: driver.find_element_by_xpath(xpath).is_displayed()
and driver.execute_script("return $.active") == 0, message=message)