zoukankan      html  css  js  c++  java
  • 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 '页面访问超时'
  • 相关阅读:
    前沿技术解密——VirtualDOM
    Ques核心思想——CSS Namespace
    Unix Pipes to Javascript Pipes
    Road to the future——伪MVVM库Q.js
    聊聊CSS postproccessors
    【译】十款性能最佳的压缩算法
    Kafka Streams开发入门(9)
    Kafka Streams开发入门(8)
    【译】Kafka Producer Sticky Partitioner
    【译】99th Percentile Latency at Scale with Apache Kafka
  • 原文地址:https://www.cnblogs.com/stvadv/p/11653350.html
Copyright © 2011-2022 走看看