我目前正在使用 Selenium 运行 Chrome 实例来测试网页。每次我的脚本运行时,都会启动一个干净的 Chrome 实例(清除扩展、书签、浏览历史等)。我想知道是否可以使用 Chrome 扩展程序运行我的脚本。我试过搜索一个 Python 示例,但是当我用谷歌搜索它时什么都没有出现。
6 回答
您应该使用 Chrome WebDriver选项来设置要加载的扩展列表。这是一个例子:
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()
希望有帮助。
主要答案对我不起作用,因为我没有意识到您必须将 webdriver 选项指向.zip
文件。
即chrome_options.add_extension('path_to_extension_dir')
不起作用。
你需要:chrome_options.add_extension('path_to_extension_dir.zip')
在弄清楚这一点并阅读了几篇 关于如何通过命令行创建 zip 文件并将其加载到selenium
. 这实际上是一种自动更新您可能对扩展程序所做的任何更改的好方法:
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()
这是因为 selenium 期望打包的扩展作为扩展参数,它将与.crx
扩展一起使用。
我的 chrome 中已经有了扩展名。以下是我打包现有扩展所遵循的步骤,
- 单击您的扩展程序“详细信息”。在我的 Chrome 版本中,它是开启的
right top click (3 dots) -> 'More tools' -> 'Extensions'.
- 在您的 chrome 中启用开发者模式
- 点击“打包扩展”(如上图)并打包。
- 这将存储在扩展位置。对我来说,它在
/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 作为查询参数
如果你想在你的 selenium python 脚本中导入任何 chrome 扩展
将您的 extension.crx.crx 文件与您的代码放在同一文件夹中或提供路径
您可以复制粘贴此代码并更改文件 crx.crx 名称
从 selenium 导入 os 从 selenium.webdriver.chrome.options 导入 webdriver 导入选项
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")
如果此代码引发错误,也许这将解决它
I also needed to add an extention to chrome while using selenium. What I did was first open the browser using selenium then add extention to the browser in the normal way like you would do in google chrome.
另一种方法是使用解压文件夹方法。我发现 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)