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