Вот моя попытка полностью общее решение , в Python:
во-первых, общая функция «ожидание» (используйте WebDriverWait, если вы хотите, я нахожу их уродливыми):
def wait_for(condition_function):
start_time = time.time()
while time.time() < start_time + 3:
if condition_function():
return True
else:
time.sleep(0.1)
raise Exception('Timeout waiting for {}'.format(condition_function.__name__))
Далее, решение основывается на том факте, что селен записывает (внутренний) id-number для всех элементов на странице, включая элемент верхнего уровня <html>
. Когда страница обновляется или загружается, она получает новый элемент html с новым идентификатором.
Итак, если вы хотите перейти по ссылке с текстом «моя ссылкой», например:
old_page = browser.find_element_by_tag_name('html')
browser.find_element_by_link_text('my link').click()
def page_has_loaded():
new_page = browser.find_element_by_tag_name('html')
return new_page.id != old_page.id
wait_for(page_has_loaded)
Для более вещего, многоразового, общего помощника, вы можете сделать контекстный менеджер:
from contextlib import contextmanager
@contextmanager
def wait_for_page_load(browser):
old_page = browser.find_element_by_tag_name('html')
yield
def page_has_loaded():
new_page = browser.find_element_by_tag_name('html')
return new_page.id != old_page.id
wait_for(page_has_loaded)
И тогда вы можете использовать его практически на любой селен взаимодействия:
with wait_for_page_load(browser):
browser.find_element_by_link_text('my link').click()
Я считаю, что это Булла TProof! Как вы думаете?
Более подробная информация в blog post about it here
Почему, что вы не хотите использовать ждать? – Amey
Вы имеете в виду явное ожидание? Это занимает много времени, я тестирую несколько 10 тыс. Страниц. – Girish
Я имею в виду, добавление исправления ожидания может быть не очень хорошей идеей, если я тестирую большое количество ссылок, не так ли? – Girish