python Selenium chromedriver 自動化超時報錯:你需要使用多標簽保護罩護體


在使用selenium + chrome 作自動化測試的時候,有可能會出現網頁連接超時的情況

如果出現網頁連接超時,將會導致 webdriver 也跟着無法響應,不能繼續進行任何操作

即時是去打開新的連接也會報Time out錯誤

那么如果有很多連接要去做彈窗抓取,卻不想因為其中一兩個頁面超時而中斷進程該怎么辦呢?

這時候你需要一個備用標簽做金剛保護罩來護體!

具體的思路是在打開需求頁面之后,再次開啟一個新的標簽去訪問一個一定不會超時的頁面(如百度),此時窗口句柄不要切換,依舊按照自己的邏輯去操作,當出現頁面超時情況的時候,關閉原有標簽,設置主窗口句柄到百度頁面所在的標簽通過get訪問后續的連接,同時在開啟一個標簽做保護罩即可。

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    chrome_options = Options()
    prefs = {
       'profile.default_content_setting_values': {
        'images': 2,    # 禁用圖片的加載
        'javascript': 2 ##禁用js,可能會導致通過js加載的互動數抓取失效
        }
    }
    chrome_options.add_experimental_option("prefs", prefs)
    # chrome_options.add_argument("--headless") # 不彈出瀏覽器
    browser = webdriver.Chrome(chrome_options=chrome_options)
    browser.implicitly_wait(5) # 操作、獲取元素時的隱式等待時間
    browser.set_page_load_timeout(10) # 頁面加載超時等待時間
    main_win = browser.current_window_handle #記錄當前窗口的句柄
    all_win = browser.window_handles
    # 開始訪問頁面
    print 'Opening page'
    urls = [] # 定義你想要抓取的全部的頁面
    for url in urls:
      try:
        if len(all_win) == 1:
            print '彈出保護罩'
            js = 'window.open("https://www.baidu.com");'
            browser.execute_script(js)
            # 還是定位在main_win上的
            for win in all_win:
                if main_win != win:
                    print '保護罩WIN', win, 'Main', main_win
                    browser.switch_to.window(main_win)
        browser.get(url) # 此處訪問你需要的URL
        body = browser.page_source
        html = etree.HTML(body)
        # 下面是你的抓取邏輯 省略
      except:
        # 超時
        print 'Time out'
        # 切換新的瀏覽器窗口
        for win in all_win:
            if main_win != win:
                print 'WIN', win, 'Main', main_win
                print '切換到保護罩'
                browser.close()
                browser.switch_to.window(win)
                main_win = win
                
        js = 'window.open("https://www.baidu.com");'
        browser.execute_script(js)
        if 'time' in str(traceback.format_exc()):
            print '頁面訪問超時'

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM