python selenium chromedriver 自动化超时报错:你需要使用多标签保护罩护体
在使用selenium + chrome 作自动化测试的时候,有可能会出现网页连接超时的情况
如果出现网页连接超时,将会导致 webdriver 也跟着无法响应,不能继续进行任何操作
即时是去打开新的连接也会报Time out错误
那么如果有很多连接要去做弹窗抓取,却不想因为其中一两个页面超时而中断进程该怎么办呢?
这时候你需要一个备用标签做金刚保护罩来护体!
具体的思路是在打开需求页面之后,再次开启一个新的标签去访问一个一定不会超时的页面(如百度),此时窗口句柄不要切换,依旧按照自己的逻辑去操作,当出现页面超时情况的时候,关闭原有标签,设置主窗口句柄到百度页面所在的标签通过get访问后续的连接,同时在开启一个标签做保护罩即可。
相关代码实现:
#!/usr/bin/python3# -*- coding: UTF-8 -*-import tracebackfrom xml import etreefrom selenium import webdriverfrom selenium.webdriver.chrome.options import Optionschrome_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) # 此处访问你需要的URLbody = browser.page_sourcehtml = 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 = winjs = 'window.open("https://www.baidu.com");'browser.execute_script(js)if 'time' in str(traceback.format_exc()):print '页面访问超时'
0 条评论