尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Selenium Ruby 绑定维护指南:为 Chromium DevTools Protocol 添加新版本支持并发布 selenium-devtools Gem

Selenium Ruby 绑定维护指南:为 Chromium DevTools Protocol 添加新版本支持并发布 selenium-devtools Gem Selenium Ruby 绑定维护指南为 Chromium DevTools Protocol 添加新版本支持并发布 selenium-devtools Gem【免费下载链接】seleniumA browser automation framework and ecosystem.项目地址: https://gitcode.com/GitHub_Trending/se/seleniumselenium-devtools 是 Selenium Ruby 绑定中负责承载 Chromium DevTools ProtocolCDP客户端代码的独立 Gem它随浏览器协议演进持续生成对应版本的 Ruby 封装。本文基于 rb/lib/selenium/devtools/README.md 的维护流程结合仓库中版本构建、代码生成器与版本回退机制等实现细节完整讲解「新增一个 CDP 版本」与「发布 selenium-devtools Gem」两条维护链路并补充底层原理帮助维护者理解每一步操作背后的实际影响。selenium-devtools Gem 在 Selenium Ruby 生态中的定位selenium-devtools 是一个与 selenium-webdriver 配套的独立 Gem其定位在 rb/selenium-devtools.gemspec 中描述为 DevTools Code for use with Selenium它把 CDP 协议按浏览器版本生成对应的 Ruby 领域类供 WebDriver 的 DevTools 交互能力使用。Gem 的版本号独立管理定义于 rb/lib/selenium/devtools/version.rb当前为Selenium::DevTools::VERSION 0.152.0与它所覆盖的最新 Chrome 主版本号保持对应关系0.152.0 → v152。从 Gem 依赖看selenium-devtools 依赖selenium-webdriver ~ 4.2并声明 Ruby 3.3。而运行时真正消费这些协议封装的是 rb/lib/selenium/webdriver/devtools.rb 中的Selenium::WebDriver::DevTools类——它负责建立 WebSocket 连接、按目标类型如pageattach 会话并通过method_missing把driver.devtools.page这类调用动态解析到Selenium::DevTools::V#{版本}::Page等生成类上。因此整个维护链条是协议源PDL→ JSON → Ruby 生成代码按版本命名→ 版本加载器 → WebDriver 运行时消费。README 中两条维护命令正是对这一链条中「版本登记」和「制品发布」两个环节的浓缩。新增 CDP 版本第一步登记版本号到 BUILD.bazelREADME 的第一步是把最新的版本号加入 rb/lib/selenium/devtools/BUILD.bazel。该文件顶部维护着当前受支持的 CDP 版本列表CDP_VERSIONS [ v152, v150, v151, ]对应地仓库 common/devtools/chromium 目录下为每个受支持版本保留了协议源文件如 v150、v151、v152 各自的browser_protocol.pdl与js_protocol.pdl。新增一个 CDP 版本时需要同时准备新版本的协议源并把版本号追加进CDP_VERSIONS。把版本号加入CDP_VERSIONS后BUILD.bazel 中的循环生成规则会自动为该版本生成目标[ run_binary( name cdp- version, srcs [ //common/devtools/chromium/ version :browser_protocol, //common/devtools/chromium/ version :js_protocol, ], outs [version .rb], args [ $(location //common/devtools/chromium/ version :browser_protocol), $(location //common/devtools/chromium/ version :js_protocol), $(location : version .rb), version, ], out_dirs [version], tool :cdp-generate, ) for version in CDP_VERSIONS ]规则含义是以:cdp-generate即生成器二进制为工具把该版本目录下的browser_protocol和js_protocol两个协议源作为输入产出version.rb加载器文件及按版本命名的out_dirs即存放各 domain 类的目录工具参数依次为两个协议 JSON 路径、输出路径和版本号。也就是说只需登记版本号构建系统就会自动为新版本跑一遍完整代码生成。新增 CDP 版本第二步同步更新 version.rbREADME 的第二步是更新 rb/lib/selenium/devtools/version.rb 中的版本号module Selenium module DevTools VERSION 0.152.0 end end版本号同时被两处消费一是 rb/selenium-devtools.gemspec 中通过require selenium/devtools/version读取作为 Gem 的s.version二是 rb/selenium/webdriver/devtools.rb 中Selenium::DevTools.version的默认来源。维护者应把版本号更新为与新增 CDP 版本对应的数字例如新增 v152 支持时版本号即为0.152.0保证Gem 版本与所覆盖的最新 CDP 版本可一一对应。深入生成器新版本代码是如何从协议 JSON 产出的登记版本号之后实际的代码生成由:cdp-generate目标完成其源码为 rb/lib/selenium/devtools/support/cdp_client_generator.rb。生成器的工作流程如下读取输入的browser_protocol.json与js_protocol.json这两个 JSON 由 PDL 协议源转换而来对应 common/devtools/chromium 下各版本目录将两个协议的domains合并逐个调用process_domain生成 domain 类文件最后调用process_loader生成按版本命名的加载器loader。生成的文件带有标准的 generated, DO NOT EDIT 标记通过 rb/support/generated_note.rb 与 scripts/generated_note_template.txt 渲染并在注释中注明重新生成命令为bazel build //rb/lib/selenium/devtools:all——维护者不应手改生成产物而应重新构建。生成逻辑本身由两个 ERB 模板驱动rb/lib/selenium/devtools/support/cdp/domain.rb.erb为每个 CDP domain 生成一个 Ruby 类。类内含EVENTS常量事件名 → 事件 key 映射、initialize(devtools)、on(event, block)注册回调到devtools.callbacks[Domain.event]以及每个 command 对应的方法——带参数的 command 会被渲染为带关键字参数的方法最终通过devtools.send_cmd(Domain.Command, ...)发送。rb/lib/selenium/devtools/support/cdp/loader.rb.erb生成按版本命名的加载器通过Dir.glob(.../vXxx/*)批量require该版本目录下所有 domain 类并定义METHODS_TO_CLASSES哈希把 snake_case 域名如network映射到 CDP 官方域名如Network供运行时method_missing动态解析使用。生成器中还处理了 Ruby 语言与协议命名的兼容问题snake_case会把JavaScript特殊处理为Javascript把驼峰命名转换为下划线命名同时RESERVED_KEYWORDS %w[end]这类与 Ruby 关键字冲突的参数名会被加下划线前缀。可选参数在生成的关键字参数中默认值为nil必选参数则为无默认值的关键字参数——这保证了生成的 Ruby API 既贴近协议语义又符合 Ruby 惯例。运行时版本加载与自动回退机制版本登记与代码生成只是静态产物真正的运行时加载由 rb/lib/selenium/devtools.rb 中的Selenium::DevTools.load_version完成这是理解为什么要维护版本号的关键def load_version require selenium/devtools/v#{version} rescue LoadError WebDriver.logger.warn Could not load selenium-devtools v#{version}. Trying older versions., id: :devtools load_older_version end当请求的版本不可用时会自动向前回退最多两个版本load_old_version(version - 1)失败后再尝试version - 2并打印警告 Using selenium-devtools version v#{version}, some features may not work as expected.如果仍然失败则抛出WebDriver::Error::WebDriverError提示使用更新版本的 selenium-devtools Gem。这一设计意味着浏览器升级到新主版本而 Gem 尚未跟上时旧版协议封装仍可能兼容工作但过度回退会存在功能缺失风险因此 README 要求及时更新版本号以保持协议封装与浏览器版本同步。对应的单测位于 rb/spec/unit/selenium/devtools_spec.rb当请求版本号高于当前版本current_version 1时断言会依次输出 Could not load selenium-devtools v#{version}. Trying older versions 与回退成功后的版本警告验证回退路径的行为符合预期。发布 selenium-devtools GemREADME 的发布流程分为构建与推送两步。第一步使用 Bazel 构建 Gem 制品bazel build //rb:selenium-devtools构建产物输出到 Bazel 的 bin 目录即bazel-bin/rb/selenium-devtools.gem。该目标由 rb/BUILD.bazel 定义Gem 内容来自 gemspec 中声明的文件列表lib/selenium/devtools.rb及lib/selenium/devtools/**/*包含 version.rb、各版本生成代码与 support 下的模板和生成器。第二步将构建出的 Gem 推送到 RubyGemsgem push bazel-bin/rb/selenium-devtools.gem执行前请确认 Gem 的版本号已在 rb/lib/selenium/devtools/version.rb 中正确更新——gemspec 直接读取该常量作为s.versionRubyGems 不允许重复推送相同版本号因此「先升版本号再构建再推送」是保证发布成功的前提。此外 gemspec 中声明了required_ruby_version 3.3与rubygems_mfa_required true发布环境需满足相应 Ruby/RubyGems 版本要求。维护流程小结把 README 的两条命令与仓库实现串起来完整的维护闭环是为新 Chromium 版本准备协议源common/devtools/chromium 下对应版本目录将新版本号加入 rb/lib/selenium/devtools/BUILD.bazel 的CDP_VERSIONS构建时由cdp-generatecdp_client_generator.rb基于协议 JSON 自动生成 domain 类与加载器将 rb/lib/selenium/devtools/version.rb 的版本号更新为对应值保证 Gem 版本与最新 CDP 版本一致运行bazel build //rb:selenium-devtools构建 Gem运行gem push bazel-bin/rb/selenium-devtools.gem发布到 RubyGems。理解生成器、加载器与回退机制的实现细节后维护者不仅能照单执行 README 中的步骤还能在协议演进、版本兼容出问题时快速定位是「协议源」「生成代码」还是「版本登记」环节需要调整。【免费下载链接】seleniumA browser automation framework and ecosystem.项目地址: https://gitcode.com/GitHub_Trending/se/selenium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表