【问题标题】:Using Extensions with Selenium (Python)使用 Selenium 扩展 (Python)
【发布时间】:2013-05-06 20:34:26
【问题描述】:

我目前正在使用 Selenium 运行 Chrome 实例来测试网页。每次我的脚本运行时,都会启动一个干净的 Chrome 实例(清除扩展、书签、浏览历史等)。我想知道是否可以使用 Chrome 扩展程序运行我的脚本。我已经尝试搜索 Python 示例,但是当我用 google 搜索时没有任何结果。

【问题讨论】:

    标签: python google-chrome selenium selenium-webdriver


    【解决方案1】:

    您应该使用 Chrome WebDriver options 设置要加载的扩展程序列表。这是一个例子:

    import os
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    
    executable_path = "path_to_webdriver"
    os.environ["webdriver.chrome.driver"] = executable_path
    
    chrome_options = Options()
    chrome_options.add_extension('path_to_extension')
    
    driver = webdriver.Chrome(executable_path=executable_path, chrome_options=chrome_options)
    driver.get("http://stackoverflow.com")
    driver.quit()
    

    希望对您有所帮助。

    【讨论】:

    • 嗨,我测试了你的代码。但事情似乎已被弃用。我正在获取有关扩展名IsADirectoryError [Error 21] 的目录的回溯。我只想知道如何编写扩展的完整路径。我这里是path/to/XXXXXXXXXXXXXXXXX/1.2.345 我应该把这个版本号放在路径中吗??
    • 希望对您有所帮助。我已经使用这个answer 来获取扩展的路径,所以你知道为什么我会遇到这个错误吗? IsADirectoryError [Error 21]。提前致谢。
    • 一个问题:有没有一个设置可以让你阻止“感谢安装...”标签?
    【解决方案2】:

    主要答案对我不起作用,因为我没有意识到您必须将 webdriver 选项指向 .zip 文件。

    chrome_options.add_extension('path_to_extension_dir') 不起作用。
    你需要:chrome_options.add_extension('path_to_extension_dir.zip')

    在弄清楚并阅读coupleposts关于如何通过命令行创建 zip 文件并将其加载到selenium 之后,对我有用的唯一方法是将我的扩展文件压缩到相同的python脚本。这实际上是一种自动更新您可能对扩展程序所做的任何更改的好方法:

    import os, zipfile
    from selenium import webdriver
    
    # Configure filepaths
    chrome_exe = "path/to/chromedriver.exe"
    ext_dir = 'extension'
    ext_file = 'extension.zip'
    
    # Create zipped extension
    ## Read in your extension files
    file_names = os.listdir(ext_dir)
    file_dict = {}
    for fn in file_names:
        with open(os.path.join(ext_dir, fn), 'r') as infile:
            file_dict[fn] = infile.read()
    
    ## Save files to zipped archive
    with zipfile.ZipFile(ext_file), 'w') as zf:
        for fn, content in file_dict.iteritems():
            zf.writestr(fn, content)
    
    # Add extension
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_extension(ext_file)
    
    # Start driver
    driver = webdriver.Chrome(executable_path=chrome_exe, chrome_options=chrome_options)
    driver.get("http://stackoverflow.com")
    driver.quit()
    

    【讨论】:

    • 经过无数小时后,这对我有用。谢谢。
    • 不幸的是它对我不起作用,你能提供一个需要进入 ext_dir = 'extension' ext_file = 'extension.zip' 的值的例子
    • ext_dir 应该是包含您要加载的 chrome 扩展的目录。我发布的脚本会压缩该目录并创建ext_file,然后将其添加到浏览器选项中。最简单的扩展文件夹只包含一个mainfest.json 和一个background.js 脚本。有关扩展的更多信息,您可以查看此入门指南 (developer.chrome.com/extensions/getstarted) 和此示例 (github.com/GoogleChrome/chrome-app-samples/tree/master/samples/…)。
    【解决方案3】:

    如果你想在你的 selenium python 脚本中导入任何 chrome 扩展

    1. 将您的 extension.crx.crx 文件与您的代码放在同一文件夹中或提供路径

    2. 您可以复制粘贴此代码并更改文件 crx.crx 名称

      导入操作系统 从硒导入网络驱动程序 从 selenium.webdriver.chrome.options 导入选项

      executable_path = "/webdrivers"
      os.environ["webdriver.chrome.driver"] = executable_path
      
      chrome_options = Options()
      
      chrome_options.add_extension('  YOUR - EXTIONTION  - NAME    ')
      
      driver = webdriver.Chrome(chrome_options=chrome_options)
      driver.get("http://stackoverflow.com")
      

    如果这段代码抛出错误,也许this 会解决它

    【讨论】:

      【解决方案4】:

      我还需要在使用 selenium 时为 chrome 添加扩展。我所做的是首先使用 selenium 打开浏览器,然后像在 google chrome 中那样以正常方式向浏览器添加扩展。

      【讨论】:

      • 如果您对一些手动步骤没问题,这将有效。对于那些试图完全自动化他们在 selenium 中所做的一切的人来说,这并不理想。
      【解决方案5】:

      这是因为 selenium 期望打包扩展作为扩展参数,该参数将带有 .crx 扩展。

      我的 chrome 中已经有了扩展程序。以下是我打包现有扩展所遵循的步骤,

      1. 单击您的扩展“详细信息”。在我的 Chrome 版本中,它位于 right top click (3 dots) -> 'More tools' -> 'Extensions'.
      2. 在您的 chrome 中启用开发者模式
      3. 点击“打包扩展”(如上图)并打包。
      4. 这将存储在扩展位置。对我来说,它在/home/user/.config/google-chrome/Default/Extensions/fdjsidgdhskifcclfjowijfwidksdj/2.3.4_22.crx

      就是这样,你可以在你的 selenium 中配置扩展作为参数。

      extension='/home/user/.config/google-chrome/Default/Extensions/fdjsidgdhskifcclfjowijfwidksdj/2.3.4_22.crx'
      options = webdriver.ChromeOptions()
      options.add_extension(extension)
      

      注意:您还可以在扩展 url 中找到 'fdjsidgdhskifcclfjowijfwidksdj' id 作为查询参数

      【讨论】:

        【解决方案6】:

        另一种方法是使用解压文件夹方法。我发现 crx 和 zip 方法在 Selenium Grid 上根本不起作用。在这种方法中,您需要将扩展​​程序从您已经手动安装的 Chrome 版本中的用户数据复制到由 Selenium 控制的 Chrome 的用户数据目录(您可以在运行时使用此代码的第一行选择它,它将自动填充)。它应该位于相同的等效目录(即扩展)中。该路径必须一直带您到存在 manifest.json 的目录,因此在此示例中为“1.1.0”

        chrome_options.add_argument("user-data-dir=C:/Users/charl/OneDrive/python/userprofile/profilename"
        unpacked_extension_path = 'C:/Users/charl/OneDrive/python/userprofile/profilename/Default/Extensions/pehaalcefcjfccdpbckoablngfkfgfgj/1.1_0'
        chrome_options.add_argument('--load-extension={}'.format(unpacked_extension_path))
        driver = webdriver.Chrome(options=chrome_options)   
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-05-14
          • 1970-01-01
          • 1970-01-01
          • 2013-08-21
          • 1970-01-01
          • 2022-08-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多