Hết thời gian chờ Selenium của Python

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

Thông số
  • phương pháp - có thể gọi được (WebDriver)
  • tin nhắn – tin nhắn tùy chọn cho TimeoutException
trả lại

kết quả của lần gọi phương thức cuối cùng hoặc WebDriverWait1 nếu phương thức đưa ra một trong các ngoại lệ bị bỏ qua

def wait_until_visible(self, timeout=None). """Tìm kiếm phần tử và đợi cho đến khi phần tử đó hiển thị. thời gian chờ tham số. thời gian tối đa để chờ đợi. lợi nhuận. phiên bản phần tử trang """ hãy thử. bản thân. đồ dùng. wait_until_element_visible(self, timeout) ngoại trừ TimeoutException là ngoại lệ. parent_msg = " và bộ định vị gốc '{}'". định dạng (tự. cha mẹ) nếu bản thân. parent other '' msg = "Phần tử trang thuộc loại '%s' có định vị %s%s không tìm thấy hoặc không hiển thị sau %s giây" timeout = timeout if timeout other self. đồ dùng. get_explicitly_wait() tự. tiều phu. lỗi (tin nhắn, loại (tự). __tên__, bản thân. định vị, parent_msg, hết thời gian chờ) ngoại lệ. msg += "\n {}". định dạng (tin nhắn % (loại (tự). __tên__, bản thân. định vị, parent_msg, hết thời gian chờ)) tăng ngoại lệ tự trả về

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
  • Bàn luận
  • khóa học
  • Luyện tập
  • Băng hình
  • 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("https://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 seleniumimport webdriver

     

    # create webdriver object

    driver=

    driver.get("https://www.geeksforgeeks.org/")
    driver.set_page_load_timeout(30)
    0

     

    driver.get("https://www.geeksforgeeks.org/")
    driver.set_page_load_timeout(30)
    1

    driver.get("https://www.geeksforgeeks.org/")
    driver.set_page_load_timeout(30)
    2
    driver.get("https://www.geeksforgeeks.org/")
    driver.set_page_load_timeout(30)
    3
    driver.get("https://www.geeksforgeeks.org/")
    driver.set_page_load_timeout(30)
    4

     

    driver.get("https://www.geeksforgeeks.org/")
    driver.set_page_load_timeout(30)
    5

    driver.get("https://www.geeksforgeeks.org/")
    driver.set_page_load_timeout(30)
    6
    driver.get("https://www.geeksforgeeks.org/")
    driver.set_page_load_timeout(30)
    7
    driver.get("https://www.geeksforgeeks.org/")
    driver.set_page_load_timeout(30)
    4

    Đầu ra –
    Trình duyệt –
     

    Hết thời gian chờ Selenium của Python

     

    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

    Làm cách nào để đặt thời gian chờ trong Selenium Python?

    Chúng tôi có thể sử dụng khái niệm chờ ngầm định trong quá trình đồng bộ hóa để xác định thời gian chờ mặc định . Đây là thời gian chờ toàn cầu và được áp dụng cho mọi thành phần trong trang. Phương thức implicitly_wait được sử dụng để xác định chờ đợi ngầm định. Thời gian chờ tính bằng giây được truyền dưới dạng tham số cho phương thức.

    Làm cách nào để sửa lỗi ngoại lệ hết thời gian chờ trong Selenium Python?

    Giải pháp .
    Bạn có thể tăng thời gian chờ theo cách thủ công bằng cách nhấn và dùng thử. Nếu sự cố vẫn tiếp diễn trong một khoảng thời gian dài hơn, có thể có một số vấn đề khác và bạn nên tiếp tục giải pháp tiếp theo
    Bạn có thể thêm thời gian chờ một cách rõ ràng bằng cách sử dụng JavaScript Executor

    Python xử lý thời gian chờ của phiên trong Selenium như thế nào?

    1 câu trả lời .
    Cài đặt WebDriver mặc định cho thời gian chờ không bao giờ. WebDriver sẽ ngồi đó mãi mãi để chờ tải trang
    Thời gian chờ sau đây có sẵn
    Bạn có thể điều chỉnh thời gian chờ bằng cách đặt trình điều khiển. quản lý(). thời gian chờ(). pageLoadTimeout()

    Làm cách nào để hết thời gian chờ trong Selenium?

    setScriptTimeout là phương thức đặt thời gian cho webdriver. Điều này thường được áp dụng cho một bài kiểm tra không đồng bộ để hoàn thành một ngoại lệ trước khi ném. Giá trị mặc định của thời gian chờ là 0. .
    setScriptTimeout
    thời gian chờ tải trang
    chờ đợi ngầm