Gọi phương thức được cung cấp cùng với trình điều khiển làm đối số cho đến khi giá trị trả về không ước tính thành False
- phương pháp - có thể gọi được [WebDriver]
- tin nhắn – tin nhắn tùy chọn cho
TimeoutException
kết quả của lần gọi phương thức cuối cùng hoặc WebDriverWait
1 nếu phương thức đưa ra một trong các ngoại lệ bị bỏ qua
phương thức trình điều khiển set_page_load_timeout – Selenium Python
Cải thiện bài viết
Lưu bài viết
Thích bài viết
- Cập nhật lần cuối. 24 tháng 10 năm 2021
Cải thiện bài viết
Lưu bài viết
Mô-đun Python của Selenium được xây dựng để thực hiện kiểm tra tự động với Python. Các ràng buộc Selenium Python cung cấp một API đơn giản để viết các bài kiểm tra chức năng/chấp nhận bằng cách sử dụng Selenium WebDriver. Để mở một trang web bằng Selenium Python, hãy kiểm tra – Điều hướng liên kết bằng phương thức get – Selenium Python. Chỉ có thể đi đến những nơi không hữu ích lắm. Điều chúng tôi thực sự muốn làm là tương tác với các trang hoặc cụ thể hơn là các phần tử HTML trong một trang. Có nhiều chiến lược để tìm một phần tử bằng Selenium, hãy thanh toán – Chiến lược định vị. Selenium WebDriver cung cấp nhiều phương pháp hữu ích khác nhau để kiểm soát phiên, hay nói cách khác, trình duyệt. Ví dụ: thêm cookie, nhấn nút quay lại, điều hướng giữa các tab, v.v.
Bài viết này xoay quanh phương thức trình điều khiển set_page_load_timeout trong Selenium. Phương thức set_page_load_timeout đặt lượng thời gian chờ tải trang hoàn tất trước khi đưa ra lỗi
Cú pháp –
driver.set_page_load_timeout[time_To_wait]
Thí dụ -
Bây giờ, người ta có thể sử dụng phương thức set_page_load_timeout làm phương thức trình điều khiển như bên dưới –
driver.get["//www.geeksforgeeks.org/"] driver.set_page_load_timeout[30]
Làm cách nào để sử dụng phương thức trình điều khiển set_page_load_timeout trong Selenium Python?
Để chứng minh, phương thức set_page_load_timeout của WebDriver trong Selenium Python. Hãy truy cập https. //www. chuyên viên máy tính. org/ và hoạt động trên đối tượng trình điều khiển
Chương trình -
Python3
# import webdriver
from
selenium
import
webdriver
# create webdriver object
driver
=
driver.get["//www.geeksforgeeks.org/"] driver.set_page_load_timeout[30]0
driver.get["//www.geeksforgeeks.org/"] driver.set_page_load_timeout[30]1
driver.get["//www.geeksforgeeks.org/"] driver.set_page_load_timeout[30]2
driver.get["//www.geeksforgeeks.org/"] driver.set_page_load_timeout[30]3
driver.get["//www.geeksforgeeks.org/"] driver.set_page_load_timeout[30]4
driver.get["//www.geeksforgeeks.org/"] driver.set_page_load_timeout[30]5
driver.get["//www.geeksforgeeks.org/"] driver.set_page_load_timeout[30]6
driver.get["//www.geeksforgeeks.org/"] driver.set_page_load_timeout[30]7
driver.get["//www.geeksforgeeks.org/"] driver.set_page_load_timeout[30]4
Đầu ra –
Trình duyệt –
Ghi chú cá nhân của tôi arrow_drop_up
Tiết kiệm
Vui lòng Đăng nhập để nhận xét.
Đây là phần 3 trong quá trình khám phá selen của tôi khi cố gắng tìm nạp các câu chuyện từ NY Times [[với tư cách là người đăng ký]
Ở cuối Phần II, Selenium đang chạy trên máy chủ được cài đặt số lượng thư viện X và GTK tối thiểu
Nhưng bây giờ nó có thể chạy tự do, không còn vấn đề gì nữa. có tất cả các cách mà điều này có thể thất bại và tập lệnh của bạn cần xử lý những lỗi đó bằng cách nào đó
Trước khi đi sâu vào, tôi nên đề cập rằng đối với mục tiêu ban đầu của tôi, lấy các câu chuyện từ NY Times với tư cách là người đăng ký, hóa ra tôi không cần selen. Do việc xử lý các lỗi Selenium trở nên quá dễ vỡ [như tôi sẽ mô tả trong bài viết này], nên tôi hiện đang sử dụng các yêu cầu kết hợp với Python CookieJar. Tôi sẽ viết về điều đó trong một bài báo trong tương lai. Trong khi đó
Xử lý lỗi và thời gian chờ
Thời gian chờ là một vấn đề cụ thể với Selenium, vì dường như không có cách nào đáng tin cậy để thay đổi chúng để tập lệnh Selenium không bị treo trong thời gian dài một cách lố bịch
Và quá trình tìm nạp selen đặc biệt dễ bị hết thời gian, so với các lần tìm nạp đơn giản hơn như requests.get[]
, bởi vì selen không coi một trang được tải đầy đủ cho đến khi tất cả các tài nguyên mà nó sử dụng đã được tìm nạp. mọi hình ảnh, mọi tập lệnh, mọi quảng cáo được tham chiếu từ tập lệnh trong trang -- và cho đến khi tất cả tập lệnh trên trang chạy xong
Một điều được cho là hữu ích là tải trang "háo hức"
options.page_load_strategy = "eager"Theo tài liệu, "eager" yêu cầu trình điều khiển web "đợi cho đến khi tài liệu HTML ban đầu được tải và phân tích cú pháp hoàn chỉnh, đồng thời loại bỏ việc tải biểu định kiểu, hình ảnh và khung con. ". Bạn cũng có thể đặt thành "không", có nghĩa là "chờ cho đến khi trang ban đầu được tải xuống. "
Đó là một suy nghĩ hay, nhưng tôi không tin rằng họ tạo ra bất kỳ sự khác biệt nào; . Khi bạn đang tìm nạp hàng chục trang, vài phút trên mỗi trang sẽ kéo dài thành một khoảng thời gian dài
Một cách tiếp cận khác là đặt thời gian chờ khác nhau trên trình điều khiển web. Đây là ba cài đặt tôi đã thử
webdriver.set_page_load_timeout[25] webdriver.implicitly_wait[20]; webdriver.set_script_timeout[20];
Một lần nữa, ngay cả khi hết thời gian chờ này, tôi vẫn thấy các trang bị treo trong nhiều phút
Tồi tệ hơn, nếu bạn làm gián đoạn .get[url]
của Selenium [chẳng hạn với Ctrl-C KeyboardInterrupt
], nó sẽ ném trình điều khiển web vào trạng thái không thể tìm nạp thêm bất kỳ trang nào nữa, vì vậy tất cả các cuộc gọi webdriver.get[]
trong tương lai đều không thành công. Tôi chưa tìm ra cách đặt lại nó, thiếu việc tạo một đối tượng webdriver hoàn toàn mới. Tìm kiếm các giải pháp, tôi thấy một số người ủng hộ việc gọi điện cho webdriver.back[]
nhưng điều đó không bao giờ tạo ra bất kỳ sự khác biệt nào đối với tôi
Cuối cùng tôi đã thử tất cả những cách trên, với hy vọng rằng mỗi người có thể giúp ích cho một số trang;
Nhưng ngay cả việc theo dõi các lỗi cũng khó khăn vì có rất nhiều ngoại lệ khác nhau được xác định ở những nơi khác nhau. Và chúng có thể xảy ra trong webdriver.get[url]
hoặc sau đó khi bạn cố gắng đạt được
webdriver.set_page_load_timeout[25] webdriver.implicitly_wait[20]; webdriver.set_script_timeout[20];0. Đây là mã để nắm bắt các ngoại lệ mà tôi đã thấy trong một tuần thử nghiệm
from urllib3.exceptions import MaxRetryError, NewConnectionError from selenium.common.exceptions import TimeoutException num_timeouts = 0 MAX_TIMEOUTS = 3 def fetch_article[url]: global num_timeouts if num_timeouts >= MAX_TIMEOUTS: return timeout_boilerplate[url, "Gave up after earlier timeout"] try: webdriver.get[url] except TimeoutException as e: num_timeouts += 1 print["EEK! TimeoutException", e, file=sys.stderr] return timeout_boilerplate[url, "TimeoutException"] except [ConnectionRefusedError, MaxRetryError, NewConnectionError] as e: # MaxRetryError and NewConnectionError come from urllib3.exceptions # ConnectionRefusedError is a Python builtin. num_timeouts += 1 print["EEK! Connection error", e, file=sys.stderr] traceback.print_exc[file=sys.stderr] except Exception as e: num_timeouts += 1 print["EEK! Unexpected exception in webdriver.get: " + str[e]] try: fullhtml = webdriver.page_source except Exception as e: num_timeouts += 1 print["EEK! Fetched page but couldn't get html: " + str[e]] # Got it, whew! Proceed with processing fullhtml.
Cùng với đó, cộng với việc cố gắng đặt thời gian chờ ngắn hơn mà tôi đã đề cập trước đó, phần lớn thời gian Selenium tự động của tôi đã tìm nạp ít nhất hầu hết các câu chuyện. Nhưng còn một vấn đề
Giết Firefox
Tại một thời điểm, sau khi thực hiện một số thay đổi đối với thời gian chờ, tôi đã cố gắng ssh đến máy chủ để xác minh tập lệnh đã chạy chưa. Và tôi thấy máy chủ không cho phép kết nối ssh, mặc dù nó đã phản hồi ping
Đăng nhập vào giao diện điều khiển của máy cho biết nó đã hết bộ nhớ. Hóa ra Firefox vẫn tiếp tục chạy sau khi thoát Selenium;
Vì vậy, tôi đã thêm một số mã để tiêu diệt firefox ở cuối công việc định kỳ [tập lệnh shell] chạy tập lệnh Selenium Python
echo "Killing firefox" pkill -e firefox sleep 10 echo "Killing -9 firefox, just in case" pkill -e --signal 9 firefox
Tôi chắc chắn rằng nếu tôi tiếp tục sử dụng tập lệnh selen hàng ngày, tôi sẽ phát hiện ra nhiều vấn đề như thế hơn. Công việc tự động hóa firefox-qua-selenium này mang tính nghệ thuật hơn là khoa học và đó là một thế giới đau đớn so với việc chỉ tìm nạp các câu chuyện bằng các yêu cầu python như tôi có thể làm với mọi trang web khác. May mắn cho tôi, như tôi đã đề cập ở phần đầu, trong trường hợp cụ thể của NY Times, hóa ra tôi không thực sự cần Selenium, tôi chỉ cần cookie từ hồ sơ Firefox của mình
Tuy nhiên, nếu không có gì khác, nó đã thúc đẩy tôi học Selenium. Tôi có thể sử dụng kiến thức đó để viết bài kiểm tra tự động cho một số ứng dụng web JavaScript mà tôi chưa thể kiểm tra cho đến bây giờ
Và vì điều này ban đầu được lấy cảm hứng từ một câu hỏi từ cuộc họp LUG địa phương, nên tôi sẽ đưa ra một hướng dẫn không chính thức về selen tại cuộc họp NMGLUG tối nay [11/11/2021], 5. Múi giờ 30-7. Đó là trên jitsi, vì vậy hãy thoải mái xuất hiện ngay cả khi bạn không phải là người địa phương, nếu bạn muốn nói chuyện về selen hoặc cạo hoặc bất cứ thứ gì khác