1. 程式人生 > >python Selenium chromedriver 自動化超時報錯:你需要使用多標籤保護罩護體

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 '頁面訪問超時'