码迷,mamicode.com
首页 > 编程语言 > 详细

python Selenium chromedriver 自动化超时报错:你需要使用多标签保护罩护体

时间:2019-10-11 12:21:15      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:baidu   java   trace   自己的   rip   自己   需求   关闭   color   

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

 

python Selenium chromedriver 自动化超时报错:你需要使用多标签保护罩护体

标签:baidu   java   trace   自己的   rip   自己   需求   关闭   color   

原文地址:https://www.cnblogs.com/stvadv/p/11653350.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!