Selenium 4.11.0 中 Selenium Manager 的新功能

Selenium 4.11.0 发布了 Selenium Manager 的非常相关的新功能:支持用于 chromedriver 管理的 Chrome for Testing (CfT) 端点以及自动化 Chrome 管理(也基于 CfT)。

4.6.0 版本开始,所有 Selenium 版本(Java、JavaScript、Python、Ruby 和 .Net)都附带 Selenium ManagerSelenium Manager 是一个二进制工具(用 Rust 实现),为 Selenium 提供自动化驱动程序管理。Selenium Manager 仍处于测试阶段,但它正成为 Selenium 的一个重要组件。

到目前为止,Selenium Manager 的主要功能被称为自动化驱动程序管理。我使用“管理”一词来描述此功能(而不仅仅是下载),因为此过程更广泛,并且涉及不同的步骤。

  1. 浏览器版本发现。Selenium Manager 发现执行 Selenium 的机器上安装的浏览器版本(例如,Chrome、Firefox、Edge)。对于此步骤,使用 shell 命令(例如,google-chrome --version)。
  2. 驱动程序版本发现。使用发现的浏览器版本,解析正确的驱动程序版本。对于此步骤,使用浏览器供应商维护的在线元数据(例如,chromedrivergeckodrivermsedgedriver)。
  3. 驱动程序下载。使用解析的驱动程序版本,获取驱动程序 URL;使用该 URL,下载、解压缩驱动程序工件并将其存储在本地。
  4. 驱动程序缓存。解压缩的驱动程序二进制文件存储在本地缓存文件夹(~/.cache/selenium)中。下次需要相同的驱动程序时,如果驱动程序已在缓存中,将从那里使用。

PATH 中的驱动程序

通过 Selenium Manager 进行驱动程序管理对于 Selenium 绑定是选择加入的。因此,用户可以继续手动管理其驱动程序(将驱动程序放入 PATH 或使用系统属性),或者依赖第三方管理器来自动执行此操作。Selenium Manager 仅作为备用方案运行:如果没有提供驱动程序,Selenium Manager 将会发挥作用。但是,Selenium Manager 还可以帮助用户识别 PATH 上驱动程序的潜在问题。

让我们考虑一个示例。假设您手动管理 Selenium 测试的 chromedriver。当您执行此管理时,Chrome 的稳定版本为 113,因此您下载 chromedriver 113 并将其放入您的 PATH 中。您的 Selenium 测试执行。一切都很好。但是,这里的问题是 Chrome 是常青的。此名称指的是 Chrome 能够在可用时自动且静默地升级到下一个稳定版本的功能。此功能对最终用户来说非常棒,但对于自动化测试来说可能很危险。让我们回到示例中来发现它。您的本地 Chrome 最终会更新到版本 115。那时,由于手动管理的驱动程序 (113) 和您的 Chrome (115) 不兼容,您的 Selenium 测试将中断。那天,您的测试仪表板将因以下错误消息而变为红色:“session not created: This version of ChromeDriver only supports Chrome version 113”

此问题是所谓的驱动程序管理器存在的主要原因。从 Selenium 4.11 开始,Selenium Manager 帮助理解与 PATH 中驱动程序相关的潜在问题。当在 PATH 中找到不兼容的驱动程序版本时,将向用户显示如下警告消息。

WARN    The chromedriver version (113.0.5672.63) detected in PATH at C:\my-drivers\chromedriver.exe might not be compatible with the detected chrome version (115.0.5790.110); currently, chromedriver 115.0.5790.102 is recommended for chrome 115.*, so it is advised to delete the driver in PATH and retry

进入 Chrome for Testing (CfT)

Chrome 团队在 2023 年启动了一项对测试社区非常重要的倡议:Chrome for Testing (CfT)。CfT 是一个主要用于测试用例的 Chrome 简化版本。

普通 Chrome 版本和 CfT 之间的主要区别之一是 Chrome 是常青的,但 CfT 不是。这样,CfT 允许固定用于测试的浏览器。CfT 版本是适用于不同版本的可移植二进制文件(适用于 Windows、Linux 和 macOS),包括稳定版、测试版、开发版和 Canary 版通道。可以使用 CfT JSON 端点以编程方式发现这些版本。

从 114 版本开始,chromedriver 团队已停止使用其传统的 chromedriver 下载存储库发布 chromedriver 版本和元数据。这样,从 115 版本开始,只能使用上述 CfT JSON 端点以编程方式发现 chromedriver 版本。

此更改对于所谓的驱动程序管理器非常重要。幸运的是,Selenium 已经支持这种新的 chromedriver 发现方式。最新版本的 Selenium Manager 使用 CfT 端点进行 chromedriver 管理。因此,如果您正在使用 Selenium Manager 和 Chrome,您必须更新到 Selenium 4.11.0 才能继续自动管理 chromedriver。

自动化浏览器管理

此外,从 Selenium 4.11.0 版本开始,Selenium Manager 基于 CfT 实现了自动浏览器管理。换句话说,Selenium Manager 使用 CfT 端点来发现、下载和缓存不同的 CfT 版本,使其能够无缝地被 Selenium 使用。

假设我们想用 Selenium 驱动 Chrome(请参阅有关如何使用 Selenium 启动会话的文档)。在会话开始之前,当驱动程序不可用时,Selenium Manager 会为我们管理 chromedriver。这样,与 CfT 端点、驱动程序版本等相关的所有复杂性都是透明的,我们可以依靠 Selenium Manager 来发现、下载和缓存适合我们的驱动程序。

此外,从 Selenium 4.11.0 开始的一个重要新功能是,如果在执行上一行代码时本地计算机上未安装 Chrome,则会发现、下载和缓存当前稳定的 CfT 版本(在 ~/.cache/selenium/chrome 中)。但不仅如此。除了稳定的 CfT 版本外,Selenium Manager 还允许下载旧版本的 CfT(从 113 版本开始,这是作为 CfT 发布的第一个版本)。

要使用 Selenium 设置浏览器版本,我们使用一个名为 browserVersion 的浏览器选项。到目前为止,当使用本地浏览器时,此选项的值不起作用,因为 Selenium 无法更改系统中安装的内容。但是,Selenium 4.11.0 的情况有所不同。

让我们考虑一个简单的例子。假设我们使用 Chrome 选项browserVersion 设置为 114。在这种情况下,Selenium Manager 将检查是否已安装 Chrome 114。如果已安装,则将使用它。如果未安装,Selenium Manager 将管理(即发现、下载和缓存)CfT 114。在这两种情况下,chromedriver 也都被管理。最后,Selenium 将启动 Chrome 以像往常一样进行编程驱动。

但还有更多。除了固定的浏览器版本(例如,113114115 等)之外,我们还可以为 browserVersion 使用以下标签:

  • stable:当前 CfT 版本。
  • beta:下一个稳定版本。
  • dev:当前正在开发的版本。
  • canary:为开发人员提供的每夜构建版本。

当指定这些标签时,Selenium Manager 首先检查是否已安装给定的 Chrome(betadev 等),如果未检测到,则会自动管理 CfT。

幕后揭秘

Selenium Manager 是一个用 Rust 实现并为 Windows、Linux 和 macOS 编译的 CLI(命令行界面)工具。Selenium Manager 二进制文件与每个 Selenium 版本一起发布。这样,每个 Selenium 绑定语言都会调用 Selenium Manager 来执行前面解释的自动化驱动程序和浏览器管理。

对于大多数用户,Selenium Manager 应该默默地且透明地工作。但是,如果您想使用 Selenium Manager 玩耍 或将其用于自己的用例(例如,下载驱动程序或 CfT 版本),您可以从 Selenium 主存储库获取 Selenium Manager 二进制文件。

例如,要管理 Chrome/chromedriver,我们需要从 shell 中调用的 Selenium Manager 命令如下(请注意,--debug 标志是可选的,但它有助于我们理解 Selenium Manager 在做什么)

> selenium-manager --browser chrome --debug
DEBUG   Checking chromedriver in PATH
DEBUG   Running command: chromedriver --version
DEBUG   Output: ""
DEBUG   chromedriver not found in PATH
DEBUG   chrome detected at C:\Program Files\Google\Chrome\Application\chrome.exe
DEBUG   Using shell command to find out chrome version
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=115.0.5790.110\r\r\n\r\r\n\r\r\n\r"
DEBUG   Detected browser: chrome 115.0.5790.110
DEBUG   Reading metadata from https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json
DEBUG   Required driver: chromedriver 115.0.5790.102
DEBUG   Driver URL: https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/115.0.5790.102/win64/chromedriver-win64.zip
INFO    Driver path: C:\Users\boni\.cache\selenium\chromedriver\win64\115.0.5790.102\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 --debug --browser-version beta
DEBUG   Checking chromedriver in PATH
DEBUG   Running command: chromedriver --version
DEBUG   Output: ""
DEBUG   chromedriver not found in PATH
DEBUG   Checking chrome in PATH
DEBUG   Running command: where chrome
DEBUG   Output: ""
DEBUG   chrome not found in PATH
DEBUG   chrome has not been discovered in the system
DEBUG   Reading metadata from https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json
DEBUG   Required browser: chrome 116.0.5845.49
DEBUG   Downloading chrome 116.0.5845.49 from https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/116.0.5845.49/win64/chrome-win64.zip
DEBUG   chrome 116.0.5845.49 has been downloaded at C:\Users\boni\.cache\selenium\chrome\win64\116.0.5845.49\chrome.exe
DEBUG   Reading metadata from https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json
DEBUG   Required driver: chromedriver 116.0.5845.49
DEBUG   Driver URL: https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/116.0.5845.49/win64/chromedriver-win64.zip
INFO    Driver path: C:\Users\boni\.cache\selenium\chromedriver\win64\116.0.5845.49\chromedriver.exe
INFO    Browser path: C:\Users\boni\.cache\selenium\chrome\win64\116.0.5845.49\chrome.exe

绑定中的故障排除

如果您想在使用 Selenium 绑定语言时获取 Selenium Manager 调试信息(如上一节所示),您可以启用 Selenium 的日志记录功能。请访问 Selenium 故障排除页面了解详细信息。

下一步

您可以在 Selenium Manager 项目仪表板中跟踪正在进行的工作。接下来在 Selenium Manager 中实现的功能将继续自动化浏览器管理机制,这次是针对 FirefoxEdge。敬请期待!