Selenium Manager(Beta 版)
动机
TL;DR: Selenium Manager 是 Selenium 项目的官方驱动管理器,它与每个 Selenium 版本一起开箱即用。
Selenium 使用每个浏览器实现的本地支持来执行自动化过程。因此,Selenium 用户需要在使用 Selenium API 的脚本和浏览器之间放置一个称为驱动(chromedriver、geckodriver、msedgedriver 等)的组件。多年来,管理这些驱动程序对 Selenium 用户来说是一个手动过程。这样,他们必须下载浏览器所需的驱动程序(Chrome 的 chromedriver,Firefox 的 geckodriver 等)并将其放置在 PATH
中,或将驱动程序路径导出为系统属性(Java、JavaScript 等)。但这个过程很繁琐,并导致了可维护性问题。
让我们考虑一个例子。假设您手动下载了驱动 Chrome 与 Selenium 所需的 chromedriver。当您执行此过程时,Chrome 的稳定版本是 113,因此您下载了 chromedriver 113 并将其放入 PATH
中。那时,您的 Selenium 脚本执行正确。但问题是 Chrome 是常青的。这个名称指的是 Chrome 能够在可用时自动且静默地升级到下一个稳定版本的能力。此功能对于最终用户来说非常出色,但对于浏览器自动化来说可能很危险。让我们回到这个例子来了解它。您的本地 Chrome 最终更新到版本 115。那时,由于手动下载的驱动程序 (113) 和 Chrome 版本 (115) 之间的不兼容,您的 Selenium 脚本被破坏了。因此,您的 Selenium 脚本失败并显示以下错误消息:“会话未创建:此版本的 ChromeDriver 仅支持 Chrome 版本 113”。
这个问题是所谓的驱动管理器(例如 Java 的 WebDriverManager,Python 的 webdriver-manager,JavaScript 的 webdriver-manager,C# 的 WebDriverManager.Net 和 Ruby 的 webdrivers)存在的主要原因。所有这些项目都是灵感,也是一个明确的信号,表明社区需要 Selenium 内置此功能。因此,Selenium 项目创建了 Selenium Manager,它是 Selenium 的官方驱动管理器,自 4.6 版起与每个 Selenium 版本一起提供。
用法
TL;DR: 当驱动程序(chromedriver、geckodriver 等)不可用时,Selenium 绑定使用 Selenium Manager。
通过 Selenium Manager 进行的驱动管理对于 Selenium 绑定是可选的。因此,用户可以继续手动管理他们的驱动程序(将驱动程序放入 PATH
或使用系统属性),或依赖第三方驱动管理器自动执行此操作。Selenium Manager 仅作为后备:如果没有提供驱动程序,Selenium Manager 将会出手相救。
Selenium Manager 是一个用 Rust 实现的 CLI(命令行界面)工具,允许跨平台执行,并为 Windows、Linux 和 macOS 编译。Selenium Manager 二进制文件随每个 Selenium 版本一起提供。这样,每个 Selenium 绑定语言都会调用 Selenium Manager 来执行以下部分中解释的自动化驱动程序和浏览器管理。
自动化驱动管理
TL;DR: 当这些驱动程序不可用时,Selenium Manager 会自动发现、下载和缓存 Selenium 所需的驱动程序。
Selenium Manager 的主要功能称为自动化驱动管理。让我们考虑一个例子来理解它。假设我们想用 Selenium 驱动 Chrome(请参阅关于如何使用 Selenium 启动会话的文档)。在会话开始之前,并且当驱动程序不可用时,Selenium Manager 会为我们管理 chromedriver。我们为这个功能使用管理这个术语(而不仅仅是下载),因为这个过程更广泛,并且意味着不同的步骤
- 浏览器版本发现。Selenium Manager 发现执行 Selenium 的机器上安装的浏览器版本(例如 Chrome、Firefox、Edge)。此步骤使用 shell 命令(例如
google-chrome --version
)。 - 驱动程序版本发现。使用发现的浏览器版本,解析出正确的驱动程序版本。对于此步骤,使用浏览器供应商维护的在线元数据/端点(例如 chromedriver、geckodriver 或 msedgedriver)。
- 驱动程序下载。使用已解析的驱动程序版本获取驱动程序 URL;使用该 URL,下载驱动程序工件,解压缩并本地存储。
- 驱动程序缓存。未压缩的驱动程序二进制文件存储在本地缓存文件夹 (
~/.cache/selenium
) 中。下次需要相同的驱动程序时,如果驱动程序已在缓存中,将从那里使用。
自动化浏览器管理
TL;DR: 当本地系统中未安装这些浏览器时,Selenium Manager 会自动发现、下载和缓存使用 Selenium 驱动的浏览器(Chrome、Firefox 和 Edge)。
从 Selenium 4.11.0 开始,Selenium Manager 还实现了自动化浏览器管理。借助此功能,Selenium Manager 允许我们发现、下载和缓存不同的浏览器版本,使其与 Selenium 无缝兼容。在内部,Selenium Manager 使用与前一节中解释的等效管理过程,但这次是针对浏览器版本。
Selenium Manager 自动管理的浏览器是
- Chrome。基于 Chrome for Testing (CfT),从 Selenium 4.11.0 开始。
- Firefox。基于 公共 Firefox 版本,从 Selenium 4.12.0 开始。
- Edge。基于 Edge 下载,从 Selenium 4.14.0 开始。
让我们再次考虑使用 Selenium 驱动 Chrome 的典型示例。这次,假设在启动新会话时,本地计算机上没有安装 Chrome。在这种情况下,Selenium Manager 将会发现、下载并缓存(在 ~/.cache/selenium/chrome
中)当前稳定的 CfT 版本。
但还有更多。除了稳定的浏览器版本外,Selenium Manager 还允许下载较旧的浏览器版本(对于 CfT,从 113 版本开始,这是第一个作为 CfT 发布的版本)。要使用 Selenium 设置浏览器版本,我们使用名为 browserVersion 的浏览器选项。
让我们考虑另一个简单的例子。假设我们使用 Chrome 选项 将 browserVersion
设置为 114
。在这种情况下,Selenium Manager 将检查是否已安装 Chrome 114。如果已安装,则将使用它。如果未安装,Selenium Manager 将管理(即,发现、下载并缓存)CfT 114。无论哪种情况,chromedriver 也会被管理。最后,Selenium 将启动 Chrome 以便像往常一样以编程方式驱动它。
但还有更多。除了固定的浏览器版本(例如,113
、114
、115
等)之外,我们还可以为 browserVersion
使用以下标签:
stable
:当前 CfT 版本。beta
:下一个稳定版本。dev
:目前正在开发中的版本。canary
:开发人员的每日构建版本。esr
:扩展支持版本(仅适用于 Firefox)。
当指定这些标签时,Selenium Manager 首先检查是否已安装给定的浏览器(beta
、dev
等),如果未检测到,则会自动管理该浏览器。
Windows 中的 Edge
Selenium Manager 在 Windows 中对 Edge 的自动管理与其他浏览器不同。Chrome 和 Firefox(以及 macOS 和 Linux 中的 Edge)都由 Selenium Manager 自动下载到本地缓存 (~/.cache/selenium
) 中。然而,这对于 Windows 中的 Edge 来说是行不通的。原因是 Windows 的 Edge 安装程序以 Microsoft 安装程序 (MSI) 文件分发,该文件旨在以管理员权限执行。这样,当在 Windows 中使用非管理员会话尝试使用 Selenium Manager 安装 Edge 时,Selenium Manager 将显示如下警告消息:
edge can only be installed in Windows with administrator permissions
因此,需要管理员权限才能通过 Selenium Manager 在 Windows 中自动安装 Edge,并且 Edge 最终会安装在通常的程序文件文件夹中(例如,C:\Program Files (x86)\Microsoft\Edge
)。
数据收集
Selenium Manager 会向 Plausible 报告匿名化的使用情况统计数据。这使 Selenium 团队可以更多地了解 Selenium 的使用方式,以便我们更好地集中开发工作。收集的数据是:
数据 | 目的 |
---|---|
Selenium 版本 | 这使 Selenium 开发人员可以安全地弃用和删除功能,并确定哪些新功能可能对您可用 |
语言绑定 | 用于执行 Selenium 脚本的编程语言(Java、JavaScript、Python、.Net、Ruby) |
Selenium Manager 运行所在的操作系统和架构 | Selenium 开发人员可以使用此信息来帮助确定错误报告的优先级,并确定是否存在与操作系统相关的系统性问题 |
浏览器和浏览器版本 | 有助于确定错误报告的优先级 |
粗略的地理位置 | 从您连接的 IP 地址推导得出。这有助于确定我们需要在哪里集中我们的文档工作 |
Selenium Manager 每天向 Plausible 发送一次这些数据。此时间段基于 TTL 值(请参阅配置)。
选择退出数据收集
默认情况下启用数据收集。要禁用它,请将 SE_AVOID_STATS
环境变量设置为 true
。您还可以在配置文件(见下文)中通过设置 avoid-stats = true
来禁用数据收集。
配置
总结: Selenium Manager 应该为大多数用户静默透明地工作。然而,在某些情况下(例如,指定自定义缓存路径或全局设置代理)可能需要自定义配置。
Selenium Manager 是一个 CLI 工具。因此,在底层,Selenium 绑定通过调用 shell 命令来调用 Selenium Manager。像任何其他 CLI 工具一样,可以使用参数来指定 Selenium Manager 中的特定功能。可以通过运行以下命令来检查 Selenium Manager 支持的不同参数:
$ ./selenium-manager --help
除了 CLI 参数外,Selenium Manager 还允许两种额外的配置机制:
- 配置文件。Selenium Manager 使用一个名为
se-config.toml
的文件,该文件位于 Selenium 缓存中(默认情况下,位于~/.cache/selenium
),用于自定义配置值。此 TOML 文件包含用于自定义配置的键值集合。 - 环境变量。每个配置键在环境变量中都有等效项,方法是将每个键名称转换为大写,将破折号 (
-
) 符号替换为下划线 (_
),并添加前缀SE_
。
当配置文件存在且未指定相应的 CLI 参数时,Selenium Manager 会使用该配置文件。此外,当未指定之前的任何选项(CLI 参数和配置文件)时,会使用环境变量。换句话说,Selenium Manager 自定义配置的优先级顺序如下:
- CLI 参数。
- 配置文件。
- 环境变量。
请注意,Selenium 绑定使用 CLI 参数来指定配置值,而配置值又使用 浏览器选项在每个绑定中定义。
下表总结了 Selenium Manager 支持的所有支持参数及其在配置文件和环境变量中的对应键。
CLI 参数 | 配置文件 | 环境变量 | 描述 |
---|---|---|---|
--browser BROWSER | browser = "BROWSER" | SE_BROWSER=BROWSER | 浏览器名称:chrome 、firefox 、edge 、iexplorer 、safari 、safaritp 或 webview2 |
--driver <DRIVER> | driver = "DRIVER" | SE_DRIVER=DRIVER | 驱动程序名称:chromedriver 、geckodriver 、msedgedriver 、IEDriverServer 或 safaridriver |
--browser-version <BROWSER_VERSION> | browser-version = "BROWSER_VERSION" | SE_BROWSER_VERSION=BROWSER_VERSION | 主要浏览器版本(例如,105 、106 等。还接受:beta 、dev 、canary - 或 nightly - 和 esr - 在 Firefox 中 -) |
--driver-version <DRIVER_VERSION> | driver-version = "DRIVER_VERSION" | SE_DRIVER_VERSION=DRIVER_VERSION | 驱动程序版本(例如,106.0.5249.61, 0.31.0 等) |
--browser-path <BROWSER_PATH> | browser-path = "BROWSER_PATH" | SE_BROWSER_PATH=BROWSER_PATH | 用于浏览器版本检测的浏览器路径(绝对路径)(例如,/usr/bin/google-chrome 、/Applications/Google Chrome.app/Contents/MacOS/Google Chrome 、C:\Program Files\Google\Chrome\Application\chrome.exe ) |
--driver-mirror-url <DRIVER_MIRROR_URL> | driver-mirror-url = "DRIVER_MIRROR_URL" | SE_DRIVER_MIRROR_URL=DRIVER_MIRROR_URL | 驱动程序存储库的镜像 URL |
--browser-mirror-url <BROWSER_MIRROR_URL> | browser-mirror-url = "BROWSER_MIRROR_URL" | SE_BROWSER_MIRROR_URL=BROWSER_MIRROR_URL | 浏览器存储库的镜像 URL |
--output <OUTPUT> | output = "OUTPUT" | SE_OUTPUT=OUTPUT | 输出类型:LOGGER (使用 INFO 、WARN 等)、JSON (自定义 JSON 表示法)、SHELL (类 Unix)或 MIXED (INFO 、WARN 、DEBUG 等输出到 stderr,最小的 JSON 输出到 stdout)。默认值:LOGGER |
--os <OS> | os = "OS" | SE_OS=OS | 驱动程序和浏览器的操作系统(即 windows 、linux 或 macos ) |
--arch <ARCH> | arch = "ARCH" | SE_ARCH=ARCH | 驱动程序和浏览器的系统架构(即 x32 、x64 或 arm64 ) |
--proxy <PROXY> | proxy = "PROXY" | SE_PROXY=PROXY | 网络连接的 HTTP 代理(例如,myproxy:port 、myuser:mypass@myproxy:port ) |
--timeout <TIMEOUT> | timeout = TIMEOUT | SE_TIMEOUT=TIMEOUT | 网络请求的超时时间(以秒为单位)。默认值:300 |
--offline | offline = true | SE_OFFLINE=true | 离线模式(即禁用网络请求和下载) |
--force-browser-download | force-browser-download = true | SE_FORCE_BROWSER_DOWNLOAD=true | 强制下载浏览器,例如,当系统已经安装了浏览器,但您希望 Selenium Manager 下载并使用它时 |
--avoid-browser-download | avoid-browser-download = true | SE_AVOID_BROWSER_DOWNLOAD=true | 避免下载浏览器,例如,当浏览器应该由 Selenium Manager 下载,但您希望避免下载时 |
--debug | debug = true | SE_DEBUG=true | 显示 DEBUG 消息 |
--trace | trace = true | SE_TRACE=true | 显示 TRACE 消息 |
--cache-path <CACHE_PATH> | cache-path="CACHE_PATH" | SE_CACHE_PATH=CACHE_PATH | 用于存储下载的资源(驱动程序和浏览器)、本地元数据和配置文件的本地文件夹。有关详细信息,请参阅下一节。默认值:~/.cache/selenium 。对于 TOML 配置文件中的 Windows 路径,需要使用双反斜杠(例如,C:\\custom\\cache )。 |
--ttl <TTL> | ttl = TTL | SE_TTL=TTL | 生存时间(以秒为单位)。有关详细信息,请参阅下一节。默认值:3600 (1 小时) |
--language-binding <LANGUAGE> | language-binding = "LANGUAGE" | SE_LANGUAGE_BINDING=LANGUAGE | 调用 Selenium Manager 的语言(例如,Java、JavaScript、Python、DotNet、Ruby) |
--avoid-stats | avoid-stats = true | SE_AVOID_STATS=true | 避免将使用情况统计信息发送到 plausible.io。默认值:false |
除了之前表格中指定的配置键外,还有一些特殊情况,即:
- 浏览器版本。除了
browser-version
之外,我们还可以使用特定的配置键来指定每个受支持浏览器的自定义版本。这样,支持chrome-version
、firefox-version
、edge-version
等键。同样适用于环境变量(即,SE_CHROME_VERSION
、SE_FIREFOX_VERSION
、SE_EDGE_VERSION
等)。 - 驱动程序版本。按照相同的模式,我们可以使用
chromedriver-version
、geckodriver-version
、msedgedriver-version
等(在配置文件中)和SE_CHROMEDRIVER_VERSION
、SE_GECKODRIVER_VERSION
、SE_MSEDGEDRIVER_VERSION
等(作为环境变量)。 - 浏览器路径。按照相同的模式,我们可以使用
chrome-path
、firefox-path
、edge-path
等(在配置文件中)和SE_CHROME_PATH
、SE_FIREFOX_PATH
、SE_EDGE_PATH
等(作为环境变量)。Selenium 绑定还允许使用选项指定浏览器路径的自定义位置,即:Chrome)、Edge 或 Firefox。 - 驱动程序镜像。按照相同的模式,我们可以使用
chromedriver-mirror-url
、geckodriver-mirror-url
、msedgedriver-mirror-url
等(在配置文件中)和SE_CHROMEDRIVER_MIRROR_URL
、SE_GECKODRIVER_MIRROR_URL
、SE_MSEDGEDRIVER_MIRROR_URL
等(作为环境变量)。 - 浏览器镜像。按照相同的模式,我们可以使用
chrome-mirror-url
、firefox-mirror-url
、edge-mirror-url
等(在配置文件中),以及SE_CHROME_MIRROR_URL
、SE_FIREFOX_MIRROR_URL
、SE_EDGE_MIRROR_URL
等(作为环境变量)。
se-config.toml 示例
browser = "chrome" # --browser BROWSER
driver = "chromedriver" # --driver DRIVER
browser-version = "106" # --browser-version BROWSER_VERSION
driver-version = "106.0.5249.61" # --driver-version DRIVER_VERSION
browser-path = "/usr/bin/google-chrome" # --browser-path BROWSER_PATH
driver-mirror-url = "https://custom-driver-mirror.com" # --driver-mirror-url DRIVER_MIRROR_URL
browser-mirror-url = "https://custom-browser-mirror.com" # --browser-mirror-url BROWSER_MIRROR_URL
output = "LOGGER" # --output OUTPUT
os = "linux" # --os OS
arch = "x64" # --arch ARCH
proxy = "myproxy:8080" # --proxy PROXY
timeout = 300 # --timeout TIMEOUT
offline = true # --offline
force-browser-download = true # --force-browser-download
avoid-browser-download = false # --avoid-browser-download
debug = true # --debug
trace = true # --trace
cache-path = "/custom/cache/path" # --cache-path CACHE_PATH
ttl = 3600 # --ttl TTL
language-binding = "Python" # --language-binding LANGUAGE
avoid-stats = true # --avoid-stats
缓存
概括: Selenium Manager 管理的驱动程序和浏览器存储在本地文件夹 (~/.cache/selenium
) 中。
Selenium Manager 中的缓存是一个本地文件夹(默认为 ~/.cache/selenium
),其中存储下载的资源(驱动程序和浏览器)。为了提高性能,当驱动程序或浏览器已在缓存中(即存在缓存提示)时,Selenium Manager 会直接从那里使用它。
除了下载的驱动程序和浏览器之外,缓存的根目录中还存在两个附加文件
- 配置文件 (
se-config.toml
)。此文件是可选的,如上一节所述,允许存储 Selenium Manager 的自定义配置值。此文件由最终用户维护并由 Selenium Manager 读取。 - 元数据文件 (
se-metadata.json
)。此文件包含 Selenium Manager 通过网络请求发现的版本(例如,使用 CfT JSON 端点)以及它们有效的生存时间 (TTL)。Selenium Manager 会自动维护此文件。
Selenium Manager 中的 TTL 的灵感来自 DNS 的 TTL,这是一种众所周知的机制,指的是在自动刷新之前缓存某些值的时长。在 Selenium Manager 的情况下,这些值是通过网络请求查找驱动程序和浏览器版本时发现的版本。默认情况下,TTL 为 3600
秒(即 1 小时),可以使用配置值进行调整,或者通过将此配置值设置为 0
来禁用。
TTL 机制是一种提高 Selenium 整体性能的方法。它基于以下事实:发现的驱动程序和浏览器版本(例如,Chrome 115 的正确 chromedriver 版本为 115.0.5790.170)在短期内很可能保持不变。因此,发现的版本会被写入元数据文件并从中读取,而不是进行相同的连续网络请求。这样,在驱动程序版本发现期间(之前介绍的自动化驱动程序管理过程的步骤 2),Selenium Manager 首先读取元数据文件。当找到新鲜的分辨率(即在 TTL 期间有效的驱动程序/浏览器版本)时,将使用该版本(从而节省了进行新网络请求的时间)。如果未找到或 TTL 已过期,则会发出网络请求,并将结果存储在元数据文件中。
让我们考虑一个例子。Selenium 绑定要求 Selenium Manager 解析 chromedriver。Selenium Manager 检测到已安装 Chrome 115,因此它会向 CfT 端点发出网络请求以发现正确的 chromedriver 版本(此时为 115.0.5790.170)。此版本存储在元数据文件中,并在接下来的一小时内(TTL)被视为有效。如果在此期间要求 Selenium Manager 解析 chromedriver(这很可能在执行测试套件时发生),则通过读取元数据文件而不是向 CfT 端点发出新请求来发现 chromedriver 版本。一小时后,缓存中存储的 chromedriver 版本将被视为过时,Selenium Manager 将通过向相应端点发出新的网络请求来刷新它。
Selenium Manager 包含两个用于处理缓存的附加参数,即
--clear-cache
:删除缓存文件夹(等效于环境变量SE_CLEAR_CACHE=true
)。--clear-metadata
:删除元数据文件(等效于环境变量SE_CLEAR_METADATA=true
)。
版本控制
Selenium Manager 遵循与 Selenium 相同的版本控制方案。尽管如此,我们对 Selenium Manager 版本使用主版本 0,因为它仍处于测试阶段。例如,Selenium 4.12.0 附带的 Selenium Manager 二进制文件对应于版本 0.4.12。
获取 Selenium Manager
对于大多数用户,不需要直接与 Selenium Manager 交互,因为 Selenium 绑定在内部使用它。尽管如此,如果您想玩 Selenium Manager 或将其用于涉及驱动程序或浏览器管理的用例,您可以通过不同的方式获取 Selenium Manager 二进制文件
- 来自 Selenium 存储库。Selenium Manager 源代码存储在主 Selenium 存储库的 rust 文件夹下。此外,您可以在 Selenium Manager Artifacts 存储库中找到 Windows、Linux 和 macOS 的编译版本。稳定的 Selenium Manager 二进制文件(即在最新稳定 Selenium 版本中分发的二进制文件)链接在此 文件中。
- 来自构建工作流。Selenium Manager 使用 GitHub Actions 工作流 进行编译。此工作流创建 Windows、Linux 和 macOS 的二进制文件。您可以从这些工作流执行中下载这些二进制文件。
- 来自缓存。从 Selenium Java 绑定版本 4.15.0 开始,Selenium Manager 二进制文件被提取并复制到缓存文件夹。例如,Selenium 4.15.0 附带的 Selenium Manager 二进制文件存储在
~/.cache/selenium/manager/0.4.15
文件夹中。
示例
让我们考虑一个典型的例子:我们想自动管理 chromedriver。为此,我们按如下方式调用 Selenium Manager(请注意,标志 --debug
是可选的,但它有助于我们了解 Selenium Manager 正在做什么)
$ ./selenium-manager --browser chrome --debug
DEBUG chromedriver not found in PATH
DEBUG chrome detected at C:\Program Files\Google\Chrome\Application\chrome.exe
DEBUG Running command: wmic datafile where name='C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe' get Version /value
DEBUG Output: "\r\r\n\r\r\nVersion=116.0.5845.111\r\r\n\r\r\n\r\r\n\r"
DEBUG Detected browser: chrome 116.0.5845.111
DEBUG Discovering versions from https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json
DEBUG Required driver: chromedriver 116.0.5845.96
DEBUG Downloading chromedriver 116.0.5845.96 from https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/116.0.5845.96/win64/chromedriver-win64.zip
INFO Driver path: C:\Users\boni\.cache\selenium\chromedriver\win64\116.0.5845.96\chromedriver.exe
INFO Browser path: C:\Program Files\Google\Chrome\Application\chrome.exe
在这种情况下,Selenium Manager 检测到本地 Chrome(在 Windows 中)。然后,使用其版本和 CfT 端点,将正确的 chromedriver 版本(在此示例中为 115)下载到本地缓存。最后,Selenium Manager 提供两个结果:i) 驱动程序路径(已下载)和 ii) 浏览器路径(本地)。
让我们考虑另一个例子。现在我们想使用 Chrome beta。因此,我们按如下方式调用 Selenium Manager,指定该版本标签(请注意,CfT beta 被发现、下载并存储在本地缓存中)
$ ./selenium-manager --browser chrome --browser-version beta --debug
DEBUG chromedriver not found in PATH
DEBUG chrome not found in PATH
DEBUG chrome beta not found in the system
DEBUG Discovering versions from https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json
DEBUG Required browser: chrome 117.0.5938.22
DEBUG Downloading chrome 117.0.5938.22 from https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/117.0.5938.22/win64/chrome-win64.zip
DEBUG chrome 117.0.5938.22 has been downloaded at C:\Users\boni\.cache\selenium\chrome\win64\117.0.5938.22\chrome.exe
DEBUG Discovering versions from https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json
DEBUG Required driver: chromedriver 117.0.5938.22
DEBUG Downloading chromedriver 117.0.5938.22 from https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/117.0.5938.22/win64/chromedriver-win64.zip
INFO Driver path: C:\Users\boni\.cache\selenium\chromedriver\win64\117.0.5938.22\chromedriver.exe
INFO Browser path: C:\Users\boni\.cache\selenium\chrome\win64\117.0.5938.22\chrome.exe
在脚本中实现 Selenium Manager
先前
def setup_without_selenium_manager():
chrome_service = Service(executable_path='path/to/chrome.exe')
driver = webdriver.Chrome(chrome_service)
return driver
Selenium Manager
def setup_with_selenium_manager():
driver = webdriver.Chrome()
return driver
Selenium Grid
在设置 Selenium Grid 时,Selenium Manager 允许您自动配置驱动程序。为此,您需要在启动 Selenium Grid 的命令中包含参数 --selenium-manager true
。有关更多详细信息,请访问 Selenium Grid 起始页面。
此外,Selenium Manager 还允许自动管理 Selenium Grid 版本。为此,按如下方式使用参数 --grid
$ ./selenium-manager --grid
执行此命令后,Selenium Manager 会发现最新版本的 Selenium Grid,并将 selenium-server.jar
存储在本地缓存中。
可选地,参数 --grid
允许指定 Selenium Grid 版本 (--grid <GRID_VERSION>
)。
已知限制
连接问题
Selenium Manager 会请求远程端点(如 Chrome for Testing (CfT) 等)从在线存储库中发现和下载驱动程序和浏览器。当此操作在具有代理或防火墙的企业环境中完成时,可能会导致以下连接问题
error sending request for url (https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json)
error trying to connect: dns error: failed to lookup address information
error trying to connect: An existing connection was forcibly closed by the remote host. (os error 10054)
发生这种情况时,请考虑以下解决方案
- 使用 Selenium 的代理功能(请参阅文档)。或者,使用环境变量
SE_PROXY
设置代理 URL,或使用配置文件(请参阅配置)。 - 检查您的网络设置,以启用 Selenium Manager 所需的远程请求和下载。
自定义包管理器
如果您使用的是需要为浏览器使用特定驱动程序的 Linux 包管理器(Anaconda、snap 等),则您需要指定驱动程序位置、浏览器位置或两者,具体取决于要求。
替代架构
Selenium 支持 Google Chrome for Testing 管理的所有五种架构,以及 Microsoft Edge 提供的所有六种驱动程序。
每个 Selenium 绑定版本都附带三个独立的 Selenium Manager 二进制文件 — 一个用于 Linux、Windows 和 Mac。
- Mac 版本支持 x64 和 aarch64(Intel 和 Apple)。
- Windows 版本应该适用于 x86 和 x64(32 位和 64 位操作系统)。
- Linux 版本仅经验证可用于 x64。
不支持更多架构的原因
- Chrome for Testing 和 Microsoft Edge 都不支持其他架构,因此 Selenium Manager 需要管理一些非官方的东西才能工作。
- 我们目前从现有的 GitHub actions 运行器构建二进制文件,这些运行器不支持这些架构
- 任何其他架构都将与所有 Selenium 版本一起分发,从而增加总构建大小
如果您在 arm64/aarch64、32 位架构或 Raspberry Pi 上运行 Linux,则 Selenium Manager 将无法为您工作。人们面临的最大问题是他们过去常常获取自定义构建的驱动程序并将它们放在 PATH 上,并且它们可以工作。现在 Selenium Manager 负责在 PATH 上查找驱动程序,这种方法不再有效,用户需要使用 Service
类并直接设置位置。让 Selenium Manager 在 PATH 上查找驱动程序而不是在每个绑定中管理该逻辑有很多优点,因此这目前是我们乐于接受的权衡。
但是,从 Selenium 4.13.0 开始,Selenium 绑定允许使用名为 SE_MANAGER_PATH
的环境变量来定位 Selenium Manager 二进制文件。如果设置了此变量,绑定将使用其值作为本地文件系统中 Selenium Manager 的路径。此功能将允许用户提供 Selenium Manager 的自定义编译版本,例如,如果默认二进制文件(为 Windows、Linux 和 macOS 编译)与给定系统(例如,Linux 中的 ARM64)不兼容。
浏览器依赖项
在 Linux 中自动管理浏览器时,Selenium Manager 依赖于浏览器供应商(即 Chrome、Firefox 和 Edge)发布的版本。这些版本在大多数情况下是可移植的。尽管如此,可能存在需要现有库的情况。在 Linux 中,尝试运行 Firefox 时可能会遇到此问题,例如,如下所示
libdbus-glib-1.so.2: cannot open shared object file: No such file or directory
Couldn't load XPCOM.
如果发生这种情况,解决方案是安装该库,例如,如下所示
sudo apt-get install libdbus-glib-1-2
尝试在 Linux 中执行 Chrome for Testing 时,可能会发生类似的问题
error while loading shared libraries: libatk-1.0.so.0: cannot open shared object file: No such file or directory
在这种情况下,要安装的库如下所示
sudo apt-get install libatk-bridge2.0-0
使用环境变量指定驱动路径
可以使用环境变量来指定驱动程序路径,而无需使用 Selenium Manager。支持以下环境变量
SE_CHROMEDRIVER
SE_EDGEDRIVER
SE_GECKODRIVER
SE_IEDRIVER
SE_SAFARIDRIVER
例如,要指定 chromedriver 的路径,您可以将 SE_CHROMEDRIVER
环境变量设置为 chromedriver 可执行文件的路径。以下绑定允许您使用环境变量指定驱动程序路径
- Ruby
- Java
- Python
此功能在 Selenium Ruby 绑定中从 4.25.0 版本开始提供,在 Python 绑定中从 4.26.0 版本开始提供。
构建自定义 Selenium Manager
为了构建您自己的自定义 Selenium Manager,使其在当前不支持的架构中工作,您可以利用以下步骤
- 安装 Rust Dev 环境
- 将 Selenium 克隆到您的本地计算机
git clone https://github.com/SeleniumHQ/selenium.git --depth 1
- 导航到您的克隆
cd selenium/rust
- 构建 Selenium
cargo build --release
- 为驱动程序路径设置以下环境变量
SE_MANAGER_PATH=~/selenium/rust/target/release/selenium-manager
- 将您想要的驱动程序放在系统 PATH 中的某个位置
- Selenium 现在将使用内置的 Selenium Manager 来定位 PATH 上手动下载的驱动程序
路线图
您可以在Selenium Manager 项目仪表板中追踪正在进行的工作。此外,您可以在其更新日志文件中查看每个 Selenium Manager 版本发布的新功能。