Oto moja próba stworzenia całkowicie ogólnego rozwiązania w Pythonie:
Po pierwsze, ogólna funkcja „czekaj” (jeśli chcesz, użyj WebDriverWait, uważam je za brzydkie):
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__))
Następnie rozwiązanie opiera się na fakcie, że selen rejestruje (wewnętrzny) numer identyfikacyjny dla wszystkich elementów na stronie, w tym elementu najwyższego poziomu <html>
. Gdy strona odświeża się lub ładuje, otrzymuje nowy element html z nowym identyfikatorem.
Więc zakładając, że chcesz kliknąć link z tekstem „mój link”, na przykład:
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)
Aby uzyskać więcej ogólnych pomocników w języku Pythonic, wielokrotnego użytku, możesz utworzyć menedżera kontekstu:
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)
A potem możesz go użyć do praktycznie każdej interakcji z selenem:
with wait_for_page_load(browser):
browser.find_element_by_link_text('my link').click()
Myślę, że to jest kuloodporne! Co myślisz?
Więcej informacji w poście na ten temat tutaj