如何通过Monkey Patch拦截Selenium Driver并提取Capabilities?
解决方案
问题定位
你之前的Monkey Patch失败,核心原因是没有返回桥接实例——原create_bridge方法需要返回创建好的bridge对象,否则Driver初始化流程会中断。以下是适配Chrome和Remote驱动的通用拦截实现:
方案1:重写create_bridge方法(推荐)
此方法会拦截所有Selenium Driver子类的创建过程,自动提取Capabilities:
class Selenium::WebDriver::Driver # 保存原方法的引用 original_create_bridge = instance_method(:create_bridge) define_method(:create_bridge) do # 调用原逻辑创建桥接 bridge = original_create_bridge.bind(self).call # 桥接创建完成后,提取当前Driver的所有Capabilities capabilities = self.capabilities puts "[DRIVER CREATED] 已提取Capabilities:" capabilities.each do |key, value| puts " #{key}: #{value}" end # 必须返回桥接实例,否则Driver初始化会失败 bridge end end # 测试Chrome驱动 def create_chrome_driver @driver = Selenium::WebDriver.for :chrome end # 测试Remote驱动(替换为你的Remote服务地址) def create_remote_driver @remote_driver = Selenium::WebDriver.for :remote, url: "http://localhost:4444/wd/hub", capabilities: Selenium::WebDriver::Remote::Capabilities.chrome end # 执行测试 create_chrome_driver create_remote_driver
方案2:拦截Selenium::WebDriver.for入口方法
如果你更倾向于从驱动创建的入口点拦截,可使用此方案:
module Selenium module WebDriver class << self original_for = method(:for) def for(browser, *args) # 调用原逻辑创建Driver实例 driver = original_for.call(browser, *args) # 提取并打印Capabilities puts "[DRIVER CREATED via #{browser}] 已提取Capabilities:" driver.capabilities.each do |key, value| puts " #{key}: #{value}" end # 返回Driver实例,不破坏原有业务逻辑 driver end end end end # 测试代码 create_chrome_driver create_remote_driver
关键说明
- 通用支持所有驱动类型:两种方案都基于Selenium的核心类扩展,无需针对Chrome/Remote单独适配。
- 无侵入式拦截:不需要修改原有Driver创建代码,自动捕获所有Driver实例的创建事件。
- 保留原有逻辑:所有实现都先调用原方法完成Driver初始化,再执行Capabilities提取,不会影响业务流程。
内容的提问来源于stack exchange,提问作者saurav
相关产品推荐
相关产品推荐

