2012-05-25 31 views
18

Tôi đang thử nghiệm một trang web có nhiều proxy và vấn đề là một số proxy đó rất chậm. Do đó, mã của tôi bị kẹt khi tải trang mỗi lần rồi.Thiết lập thời gian chờ thực để tải trang trong Selenium WebDriver?

from selenium import webdriver 

browser = webdriver.Firefox() 
browser.get("http://example.com/example-page.php") 
element = browser.find_element_by_id("someElement") 

Tôi đã thử rất nhiều thứ như explicit waits hay implicit waits và đã tìm kiếm xung quanh cho khá trong một nhưng vẫn chưa tìm thấy một giải pháp hoặc cách giải quyết. Không có gì thực sự ảnh hưởng đến dòng tải trang browser.get("http://example.com/example-page.php") và đó là lý do tại sao nó luôn bị kẹt ở đó.

Có ai có giải pháp cho việc này không?

Cập nhật 1: Câu trả lời

JimEvans' giải quyết vấn đề trước đây của tôi, và here bạn có thể tìm vá python cho tính năng mới này.

vấn đề mới:

browser = webdriver.Firefox() 
browser.set_page_load_timeout(30) 

browser.get("http://example.com/example-page.php") 

element = browser.find_element_by_id("elementA") 
element.click() ## assume it's a link to a new page http://example.com/another-example.php 

another_element = browser.find_element_by_id("another_element") 

Như bạn thấy browser.set_page_load_timeout(30) chỉ ảnh hưởng đến browser.get("http://example.com/example-page.php") có nghĩa là nếu trang này tải trong hơn 30 giây nó sẽ ném ra một ngoại lệ thời gian chờ, nhưng vấn đề là nó không có sức mạnh trên tải trang như element.click(), mặc dù nó không chặn cho đến khi trang mới hoàn toàn tải lên, another_element = browser.find_element_by_id("another_element") là nỗi đau mới trong ass, bởi vì explicit waits hoặc implicit waits sẽ chờ cho toàn bộ trang tải lên trước khi bắt đầu tìm kiếm yếu tố đó. Trong một số trường hợp cực đoan, điều này sẽ mất ngay cả HOURS. Tôi có thể làm gì với nó?

Trả lời

12

Bạn có thể thử sử dụng thời gian chờ tải trang được giới thiệu trong thư viện. Việc triển khai nó không phải là phổ quát, nhưng nó được trưng ra một cách chắc chắn bởi các ràng buộc .NET và Java, và đã được triển khai trong trình điều khiển Firefox và bây giờ, và trong trình điều khiển IE trong phiên bản 2.22 sắp tới. Trong Java, để thiết lập thời gian chờ tải trang đến 15 giây, đoạn code để thiết lập nó sẽ trông như thế này:

driver.manage().timeouts().pageLoadTimeout(15, TimeUnit.SECONDS); 

Nếu nó không được tiếp xúc trong các ràng buộc ngôn ngữ Python, tôi chắc chắn rằng nhà duy trì háo hức sẽ chấp nhận một bản vá đã triển khai nó.

+0

Tuyệt! Chắc chắn một tính năng tốt đẹp để có. –

+0

@JimEvans: Cảm ơn bạn đời, tôi vừa tìm thấy bản vá python cho http://code.google.com/p/selenium/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Stars%20Type% này 20Status% 20Priority% 20Milestone% 20Owner% 20Summary & groupby = & sort = & id = 687, và nó hoạt động rất tốt. – Shane

+0

@JimEvans: Này, hãy kiểm tra cập nhật của tôi. Có một vấn đề mới làm phiền tôi. – Shane

0

Bạn vẫn có thể tăng tốc độ thực thi tập lệnh bằng cách chờ đợi sự hiện diện (không chờ hiển thị) yếu tố dự kiến ​​trong khoảng 5-8 giây và sau đó gửi window.stop() JS Script (để dừng tải thêm các phần tử khác) mà không cần đợi toàn bộ trang để tải hoặc bắt ngoại lệ hết thời gian chờ tải trang sau 5-8 giây sau đó gọi đến window.stop()

Vì nếu trang không áp dụng kỹ thuật tải chậm (chỉ tải phần tử hiển thị và tải phần còn lại của phần tử chỉ sau khi cuộn) nó tải từng phần tử trước khi trở về trạng thái window.ready vì vậy nó sẽ chậm hơn nếu bất kỳ phần tử nào mất nhiều thời gian hơn để hiển thị.

Các vấn đề liên quan