Đây là nỗ lực của tôi tại một giải pháp hoàn toàn chung chung, trong Python:
Đầu tiên, một chức năng "chờ" chung (sử dụng WebDriverWait nếu bạn thích, tôi thấy chúng xấu xí):
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__))
Tiếp theo, giải pháp dựa trên thực tế là selen ghi lại số id (nội bộ) cho tất cả các thành phần trên một trang, bao gồm cả thành <html>
phần cấp cao nhất. Khi một trang làm mới hoặc tải, nó nhận được một phần tử html mới với ID mới.
Vì vậy, giả sử bạn muốn nhấp vào một liên kết với văn bản "liên kết của tôi" chẳng hạn:
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)
Để có thêm trình trợ giúp chung, có thể tái sử dụng, Pythonic, bạn có thể tạo trình quản lý bối cảnh:
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)
Và sau đó bạn có thể sử dụng nó trên hầu hết mọi tương tác selen:
with wait_for_page_load(browser):
browser.find_element_by_link_text('my link').click()
Tôi nghĩ đó là chống đạn! Bạn nghĩ sao?
Thông tin thêm trong một bài đăng blog về nó ở đây