尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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),仅供参考
RELATED

相关推荐

2026年电池争霸:二代刀片与犀牛电池技术对比解析

2026年电池争霸:二代刀片与犀牛电池技术对比解析

2026年元旦刚过,新能源市场的战火不是从某款新车的发布会烧起来的,而是从两块电池点燃的:一边是奇瑞在2025年秋天高调放出的犀牛电池,另一边是比亚迪已经装车汉L、唐L的二代刀片。这两套电池体系,将在2026年分别决定两…

📅 2026/9/10 20:01:53
Xposed框架Hook原理与安卓逆向实战指南

Xposed框架Hook原理与安卓逆向实战指南

1. Xposed框架入门指南 作为安卓系统最强大的Hook框架之一,Xposed让无数开发者又爱又恨。我第一次接触Xposed是在2015年开发一个自动化工具时,当时为了绕过某个应用的签名校验,折腾了整整三天才搞明白模块的开发逻辑。如今八年过去&#xff0…

📅 2026/9/10 20:01:53
用OpenClaw和ADB打造智能电视时间管理系统

用OpenClaw和ADB打造智能电视时间管理系统

1. 项目背景:当AI遇上育儿痛点作为一名长期与电子设备斗智斗勇的家长,我深刻理解控制孩子电视时间的艰难。直到在技术社区发现OpenClaw这个开源AI项目——它原本是用于智能家居控制的Python框架,却意外成为我家的"电子保姆"。这个外…

📅 2026/9/10 20:01:53
MORE NEWS

更多资讯

📰

打造带长期记忆的 AI Agent:Zep 记忆后端 + AutoGen 编排 + Ollama/Qwen 3 本地模型实战(Zep Memory Assistant)

打造带长期记忆的 AI Agent:Zep 记忆后端 AutoGen 编排 Ollama/Qwen 3 本地模型实战(Zep Memory Assistant) 【免费下载链接】ai-engineering-hub In-depth tutorials on LLMs, RAGs and real-world AI agent applications. 项目地址: ht…

📰

Spring @Async异步编程实战:线程池、事务与异常处理全解析

去年给一个电商团队做性能治理,他们在排查一笔下单接口偶发超时的时候,发现耗时大户竟然是同步调用的短信发送和邮件通知。后来把这两个动作改成Async,接口响应直接从 900ms 降到 120ms。当时团队成员说了一句话:原来 Spring 异步…

📰

CANN/GE CreateVector函数API文档

CreateVector 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前…

📰

Spring Boot构建食品安全管理系统的技术实践

1. 项目概述:食品安全信息管理系统的技术选型与价值去年帮学弟调试毕业设计时,发现用Spring Boot构建的食品安全管理系统在高校选题中热度居高不下。这类系统本质上是通过信息化手段解决食品生产、流通环节的溯源难题,而Spring Boot的快速开发…

📰

Reflex Build 应用通用设置指南:名称、ID、可见性、复用导出与删除

Reflex Build 应用通用设置指南:名称、ID、可见性、复用导出与删除 【免费下载链接】reflex 🕸️ Web apps in pure Python 🐍 项目地址: https://gitcode.com/GitHub_Trending/re/reflex 导读 在 Reflex Build(Reflex 的…

📰

daisyUI Status 组件完全指南:用纯 CSS 圆点优雅展示元素在线状态

daisyUI Status 组件完全指南:用纯 CSS 圆点优雅展示元素在线状态 【免费下载链接】daisyui 🌼 🌼 🌼 🌼 🌼  The most popular, free and open-source Tailwind CSS component library 项目地址: https…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬