Это не желаемое решение, а обходной путь, который у меня сейчас работает.
Мои функции ожидания
from time import sleep
from functools import wraps
from selenium.common.exceptions import NoSuchElementException
def wrap_in_wait(func, retires=5):
@wraps(func)
def wrapper(*args, **kwargs):
return wait(func, *args, retires=retires, **kwargs)
return wrapper
def wait(func, *args, retires=10, exceptions=[AssertionError, NoSuchElementException], **kwargs):
for i in range(retires):
try:
return func(*args, **kwargs)
except Exception as e:
print('retry', i)
if type(e) not in exceptions:
raise e
if i == retires-1:
raise e
sleep(0.5 + i*.2)
Проверка функции с Обойти решение
def test_question_form_is_loaded_with_existing_answer(self):
'''Test question form pre-loads'''
self.browser.get(self.live_server_url + self.url)
inp = self.browser.find_element_by_css_selector("input#id_response")
inp.send_keys("This is my answer")
self.browser.find_element_by_id('btn-next').click()
@wrap_in_wait
def click_previous_button():
btn_previous = self.browser.find_element_by_id('btn-previous')
btn_previous.click()
inp = self.browser.find_element_by_css_selector("input#id_response")
self.assertEqual(inp.get_attribute('value'), "This is my answer")
click_previous_button()
Это решение повторяет попытку click_previous_button
10 раз, если возникает исключение AssertionError or NoSuchElementException
. Он работает со 2-й попытки.
Но я все еще не уверен, почему событие javascript не вызывается, даже когда кнопка активна, и если есть прямой способ проверки, когда javascript готов