Selenium 之 操作 ChromeDriver 可配置项

作者: 别摸我蒙哥 | 来源:发表于2017-12-26 14:14 被阅读118次

    WebDriver 是一个开源的工具,一般用于web应用的自动化测试,或者抓取浏览器中元素。

    在使用 Selenium 过程中,我们需要对 Chrome 做一些初始化设置,以便浏览器完成我们期望的行为。

    ChromeOptions 属性

    ChromeOptions 可以在浏览器启动之前设置加载的选项,可以通过 Selenium 源码看到:

    class Options(object):
        KEY = "goog:chromeOptions"
    
        def __init__(self):
            self._binary_location = ''
            self._arguments = []
            self._extension_files = []
            self._extensions = []
            self._experimental_options = {}
            self._debugger_address = None
    

    ChromeOoptions 主要提供以下功能:

    • 设置 chrome 文件位置(binary_location)
    • 添加启动配置(arguments)
    • 添加插件(add_extension)
    • 添加设置参数(add_experimental_options)

    下面就根据这几个参数展开描述:

    测试代码如下
    import time
    from selenium import webdriver
    
    options = webdriver.ChromeOptions()
    options.add_argument('lang=zh_CN.UTF-8')
    
    # 最常见的场景是设置 user-argument 来模拟移动设备
    # 比如下面模拟 iphone6
    options.add_argument(
        'user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) '
        'AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 '
        'Mobile/13B143 Safari/601.1"')
    
    # 禁止加载图片
    prefs = {
        'profile.default_content_setting_values.images': 2
    }
    options.add_experimental_option('prefs', prefs)
    
    driver = webdriver.Chrome(chrome_options=options)
    
    urls = [
        'http://www.touxiangzhan.com/qinglvtouxiang/',
        'http://www.touxiangzhan.com/nanshengtouxiang/',
        'http://www.touxiangzhan.com/nvshengtouxiang/',
        'http://www.touxiangzhan.com/oumeitouxiang/',
        'http://www.touxiangzhan.com/daizitouxiang/',
        'http://www.touxiangzhan.com/katongtouxiang/',
        'http://www.touxiangzhan.com/gexingtouxiang/',
        'http://www.touxiangzhan.com/weixintouxiang/',
        'http://www.touxiangzhan.com/touxiang/',
        'http://www.touxiangzhan.com/qinglvtouxiang/daizi/',
        'http://www.touxiangzhan.com/qinglvtouxiang/katong/',
        'http://www.touxiangzhan.com/qinglvtouxiang/oumei/',
        'http://www.touxiangzhan.com/qinglvtouxiang/baqi/',
        'http://www.touxiangzhan.com/qinglvtouxiang/feizhuliu/',
        'http://www.touxiangzhan.com/qinglvtouxiang/yizuoyiyou/',
        'http://www.touxiangzhan.com/qinglvtouxiang/jiewen/',
        'http://www.touxiangzhan.com/qinglvtouxiang/weimei/',
        'http://www.touxiangzhan.com/qinglvtouxiang/heibai/',
        'http://www.touxiangzhan.com/qinglvtouxiang/haokan/',
        'http://www.touxiangzhan.com/qinglvtouxiang/xiaoqingxin/',
        'http://www.touxiangzhan.com/qinglvtouxiang/yinanyinv/',
        'http://www.touxiangzhan.com/qinglvtouxiang/keai/'
    ]
    start_time = time.time()
    for url in urls:
        try:
            driver.get(url)
        except Exception as e:
            print(e)
    print(time.time() - start_time)
    
    driver.quit()
    
    

    修改 chrome 设置

    一、禁止加载图片

    在页面加载过程中,我们或许不需要图片相关信息,这个时候,就需要浏览器加载页面时屏蔽图片,可以使用下面这种方式:

    options = webdriver.ChromeOptions()
    prefs = {
        'profile.default_content_setting_values.images': 2
    }
    prefs = {
        'profile.default_content_setting_values':
            {'images': 2}
    } # 这两行代码表达的意思相同,只要给prefs参数一个明确的json格式就可以
    options.add_experimental_option('prefs', prefs)
    
    二、添加chrome插件

    在使用 ChromeDriver 过程中,经常会碰到这样的问题,我不想加载什么?除了上文说到的图片,我们第一反应就是广告了,这绝对不是我们想获取的有效信息,什么办法解决呢?
    简单!日常过程中我们怎么使用 chrome屏蔽广告,现在也怎么做。

    第一步,不用说,要下载离线版的 插件
    Chrome 的插件都是crx格式,如果在应用商店直接安装插件,插件在安装完毕后会自动被Chrome 清理,所以需要下载离线版本的插件。(这里以屏蔽广告的 Adblock Plus 为例)


    搜索并获取插件id

    第二步:进入这个神奇的网站 https://yurl.sinaapp.com/crx.php,复制 插件ID ,按照提示另存为到当前文件某个目录下(这里涉及到文件的相对路径,所以要自己把控)

    根据插件ID下载离线文件

    目前为止已经有了插件,设置 crx 文件到插件选项

    options = webdriver.ChromeOptions()
    options.add_extension('../source/extension_1_13_4.crx')
    # 特别申明,这里的相对路径是我本地代码的路径,如果有问题,修改为下载好 
    # 的crx文件位置,如果不了解相对路径,可以先用绝对路径测试
    driver = webdriver.Chrome(chrome_options=options)
    

    启动后效果如下:


    启动效果
    三、巨无霸初始化方式

    毋庸置疑,巨无霸方式可以把初始化的过程够囊括进来
    这里的侧重点是如何设置浏览器代理

    CHROME = {
    "browserName": "chrome",
            "version": "",
            "platform": "ANY",
            "javascriptEnabled": True,
            "chrome.prefs": {"profile.managed_default_content_settings.images": 2},
            "proxy": {
                "httpProxy":"localhost:8118",
                "ftpProxy":None,
                "sslProxy":None,
                "noProxy":None,
                "proxyType":"MANUAL",
                "class":"org.openqa.selenium.Proxy",
                "autodetect":False
                },
            "chrome.switches": ["window-size=1003,719", "allow-running-insecure-content", "disable-web-security", "disk-cache-dir=/var/www/cake2.2.4/app/tmp/cache/selenium-chrome-cache", "no-referrers"],
            }
    self.selenium = webdriver.Chrome(desired_capabilities=CHROME)
    # 参考来源 https://stackoverflow.com/questions/15165593/set-chrome-prefs-with-python-binding-for-selenium-in-chromedriver
    
    四、小结

    总体来说,所有的 options 设置选项都是根据 ChromeDriver 暴露出来的配置项,塞入我们需要的 dict 格式文件,一旦格式正确,就可以获得期望的结果。这就是工具的使用,

    光说不练假把式

    最后我们来看看去除非有效信息后页面加载的效果:(效果相差两个数量级)

    没有设置过滤信息前:
    打开22个包含图片页面耗费时间 144.80
    设置过滤信息后:
    打开22个包含图片页面耗费时间 6.07

    (这里针对的是图片较多网站做的测试,效果明显点)

    过滤后结果

    相关文章

      网友评论

      • 来个芒果:您好,请问Chrome options 可以配置的选项包括哪一些啊?官网貌似查不到啊。、。

      本文标题:Selenium 之 操作 ChromeDriver 可配置项

      本文链接:https://www.haomeiwen.com/subject/fzudgxtx.html