如何为 Selenium 项目新增一个 Chrome DevTools Protocol 版本的支持
发布时间:2026/9/11 12:19:39 锦皓数字建站

如何为 Selenium 项目新增一个 Chrome DevTools Protocol 版本的支持【免费下载链接】seleniumA browser automation framework and ecosystem.项目地址: https://gitcode.com/GitHub_Trending/se/seleniumSelenium 仓库在 common/devtools/chromium 下同时保留多个 Chrome DevTools ProtocolCDP版本每个版本放在一个vXX目录中当前仓库有v150、v151、v152三个目录。当 Stable 渠道出现新的 Chrome 主版本时需要把对应版本的协议文件browser_protocol.pdl和js_protocol.pdl以及各语言绑定对该版本的引用加入仓库各语言客户端才能为新版 Chrome 生成 DevTools 绑定。这篇文章描述 Selenium 项目内置的自动化更新流程以及如何核对更新结果。仓库中的 CDP 版本布局每个版本目录包含三类文件以现有的 common/devtools/chromium/v152 为例browser_protocol.pdl来自 Chromium 源码third_party/blink/public/devtools_protocol/browser_protocol.pdl的协议描述js_protocol.pdl来自该 Chromium 版本所依赖的 V8 修订版中的include/js_protocol.pdlBUILD.bazel两条genrule用 common/devtools/BUILD.bazel 中的pdl_to_json二进制把两个.pdl转换为browser_protocol.json和js_protocol.json供 Java、.NET、JavaScript、Python、Ruby 各绑定消费。各语言绑定中的版本号引用是相互关联的例如 java/src/org/openqa/selenium/devtools/versions.bzl 的CDP_VERSIONS列表、rake_tasks/java.rake 顶部的JAVA_RELEASE_TARGETS发布目标列表。更新新版本时这些引用需要一起滚动这也是仓库提供自动化脚本的原因。前提条件仓库构建工具为 Bazel更新脚本注册在 scripts/BUILD.bazel 中目标名为//scripts:update_cdp入口是 scripts/update_cdp.py脚本会从 googlechromelabs.github.io 的 chrome-for-testing JSON 以及 raw.githubusercontent.com 下载协议文件需要能访问这些地址的网络环境运行前建议确保工作区干净因为脚本会删除和改写仓库中的多个文件见下节副作用说明。运行更新脚本仓库提供了两种等价的触发方式CI 中实际使用的是bazel run形式bazel run //scripts:update_cdp -- --chrome_channelStable或者使用 Rakefile 中定义的update_cdp任务rake update_cdp--chrome_channel是 scripts/update_cdp.py 的get_chrome_milestone函数解析的参数默认值就是StableCI 脚本 scripts/github-actions/update_browsers.sh 显式传入Stable。执行前必须了解该脚本的副作用它会直接修改仓库文件在common/devtools/chromium/下创建新版本目录v 新主版本号复制上一个版本目录作为起点然后用从 Chromium 对应版本 tag 下载到的browser_protocol.pdl覆盖它并把其中include domains/*.pdl引用的各域名文件拉取后拼接进同一文件flatten_browser_pdl函数从 Chromium 该版本的DEPS文件中解析v8_revision再下载对应 V8 修订版的include/js_protocol.pdl存入新版本目录找不到v8_revision时会直接报错退出删除common/devtools/chromium/下最旧版本的目录新主版本号减 3即仓库始终保持三个 CDP 版本同样地删除 Java 和 .NET 绑定下对应的旧版本源码目录更新各语言引用java/src/org/openqa/selenium/devtools/versions.bzl、rake_tasks/java.rake、dotnet/version.bzl、dotnet/src/webdriver/Selenium.WebDriver.csproj、dotnet/src/webdriver/DevTools/DevToolsDomains.cs及 .NET 测试文件、rb/lib/selenium/devtools/BUILD.bazel、rb/lib/selenium/devtools/version.rb、py/BUILD.bazel、javascript/selenium-webdriver/BUILD.bazel对browser_protocol.pdl做一处替换script改为script脚本注释说明原因是 javadocs 不兼容 script 标签。脚本正常结束时会打印一行汇总格式为示例实际版本号取决于当时 Stable 渠道adding CDP v153 and removing v150脚本中的每个下载函数fetch_and_save在 HTTP 状态码不是 200 时都会抛出ValueError: Fetch failed (HTTP ...)此时说明上游 tag 不存在或网络不通需要检查所用的 Chrome 版本号。验证更新结果检查新版本目录。确认common/devtools/chromium/v新主版本号/已创建且与 common/devtools/chromium/v152 一样包含browser_protocol.pdl、js_protocol.pdl、BUILD.bazel三个文件。CI 脚本 scripts/github-actions/update_browsers.sh 在重新生成 CDP 后做的就是这一步检查目录不存在时报错CDP regeneration did not produce common/devtools/chromium/v新主版本号并终止。检查语言绑定引用已滚动。查看 java/src/org/openqa/selenium/devtools/versions.bzl 的CDP_VERSIONS列表应包含新版本、不再包含被移除的旧版本rake_tasks/java.rake中的vNNN.publish目标列表同步变化。通过发布门禁核对。仓库的发布门禁脚本 scripts/github-actions/verify_cdp.sh 的逻辑是从 chrome-for-testing 的last-known-good-versions.json解析当前 Stable 主版本号然后检查common/devtools/chromium/v该主版本号目录是否存在。存在时输出CDP for Chrome v主版本号 is checked in不存在时输出::error::No CDP for Chrome v主版本号; merge the pending browser update before releasing并以失败退出。这个检查的含义是Stable 渠道的主版本必须有已入库的对应 CDP发布才能继续。Ruby 锁文件重解析。scripts/github-actions/update_browsers.sh 的注释说明selenium-devtools 的版本号变化后需要重新解析 lockfileCI 在 CDP 重新生成后执行bazel run //rb:bundle-lock如果你本地更新 CDP 后准备提交 Ruby 相关改动按同样方式重新生成锁文件。可选分支手动新增一个版本common/devtools/README.md 描述了不依赖脚本的手动流程适合需要把协议文件加入非 Stable 渠道、或理解自动化脚本每一步在做什么时使用。要点确定 Chrome Stable 更新的具体版本号如96.0.4664.45在//common/devtools/chromium下创建对应的vXX目录如v96从上一个版本目录vXX-1复制BUILD.bazel在 Chromium 源码中打开与发行号匹配的 tag把//third_party/blink/public/devtools_protocol/browser_protocol.pdl下载到//common/devtools/chromium/vXXREADME 中给出了 raw 下载链接在 Chromium 源码的//:DEPS中搜索v8_revision确定该 Chromium 版本使用的 V8 修订号在 V8 源码中切换到该修订号把//include/js_protocol.pdl下载到//common/devtools/chromium/vXX。手动流程只覆盖common/devtools/chromium下的协议文件各语言绑定的版本号引用仍需要按上文运行更新脚本一节列出的文件手动同步因此日常新增版本推荐优先走脚本。CI 中的自动化位置scripts/github-actions/update_browsers.sh 是仓库每日刷新固定浏览器的入口先执行bazel run //scripts:pinned_browsers更新common/repositories.bzl中固定的浏览器版本再检查 Stable Chrome 主版本是否已有对应的common/devtools/chromium/vXX目录没有时才执行bazel run //scripts:update_cdp -- --chrome_channelStable。脚本注释强调set -e是有意的update_cdp一旦失败任务在写出结果前就整体失败从而保证 Chrome 的固定版本永远不会领先于它的 DevTools 版本入库。发布时再由verify_cdp.sh做最终门禁。限制仓库同时保留三个 CDP 版本更新脚本会删除最旧版本在common/devtools/chromium/以及 Java、.NET 绑定中的目录提交前需要确认旧版本已无消费方依赖脚本依赖对 googlechromelabs.github.io 与 raw.githubusercontent.com 的访问任一上游地址不可达都会导致流程中断本文描述的是 Selenium 仓库内 CDP 版本引用的维护流程各语言客户端如何使用生成的browser_protocol.json不在本主题范围内。【免费下载链接】seleniumA browser automation framework and ecosystem.项目地址: https://gitcode.com/GitHub_Trending/se/selenium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。