นี่คือความพยายามของฉันในการแก้ปัญหาทั่วไปใน 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__))
จากนั้นการแก้ปัญหาจะขึ้นอยู่กับข้อเท็จจริงที่ว่าซีลีเนียมบันทึกหมายเลขรหัส (ภายใน) สำหรับองค์ประกอบทั้งหมดในเพจรวมถึง<html>
องค์ประกอบระดับบนสุด เมื่อเพจรีเฟรชหรือโหลดหน้าจะได้รับองค์ประกอบ html ใหม่พร้อม ID ใหม่
ดังนั้นสมมติว่าคุณต้องการคลิกลิงก์ที่มีข้อความ "my link" เช่น:
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)
จากนั้นคุณสามารถใช้มันกับปฏิสัมพันธ์ซีลีเนียมใด ๆ :
with wait_for_page_load(browser):
browser.find_element_by_link_text('my link').click()
ฉันคิดว่ามันกันกระสุนได้! คุณคิดอย่างไร?
ข้อมูลเพิ่มเติมในบล็อกโพสต์เกี่ยวกับเรื่องนี้ที่นี่