这是我在 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__))
接下来,该解决方案依赖于 selenium 记录页面上所有元素(包括顶级元素)的(内部)id-number 的事实<html>
。当页面刷新或加载时,它会获得一个具有新 ID 的新 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)
要获得更多 Pythonic、可重用、通用的帮助器,您可以创建一个上下文管理器:
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)
然后你可以在几乎任何 selenium 交互中使用它:
with wait_for_page_load(browser):
browser.find_element_by_link_text('my link').click()
我认为这是防弹的!你怎么看?
更多信息请参见此处的博客文章。