转载 

python Selenium chromedriver 超时后后面URL 也超时 无法刷新

分类:爬虫,selenium    975人阅读    IT小君  2021-09-15 23:33

现象及原因

在使用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 '页面访问超时'

转载于:http://www.xiaomilu.top/archives/106

 

小编亲测说明

以上方法会报异常:没有当前窗口,父窗口不存在

可以通过关闭当前浏览器 新建一个解决,代码Demo 如下:

    def createBrower(self):
        self.browser.close()
        self.browser = webdriver.Chrome(#executable_path=r'F:\Program Files (x86)\webdriver\chromedriver.exe',
                                        chrome_options=self.chrome_options, desired_capabilities=self.capabilities)
        self.browser.set_page_load_timeout(10)
        self.browser.set_script_timeout(10)  # 这两种设置都进行才有效
支付宝打赏 微信打赏

如果文章对你有帮助,欢迎点击上方按钮打赏作者

 工具推荐 更多»