无头的黑名单 URL Chrome

Blacklist URLs with headless Chrome

我试图在我的规范中阻止 URL,实现了我在使用 capybara_webkit:

时的效果
Capybara::Webkit.configure do |config|
  config.block_url("*google*")
  config.allow_url('*my_website.com')
end

读完 this article 后,我尝试做类似的事情:

require 'webmock/rspec'

module WebmockConfig
  def self.default_disabled_urls
    [
      '*google*'
    ]
  end
end

WebMock.disable_net_connect!(allow_localhost: true)
WebMock.disable_net_connect!(allow: WebmockConfig.default_disabled_urls)

但我得到了

Real HTTP connections are disabled. Unregistered request: POST http://127.0.0.1/session

即使那应该由 WebMock.disable_net_connect!(allow_localhost: true) 解决。

当 运行 规格没有 WebMock.disable_net_connect!(allow: WebmockConfig.default_disabled_urls) 时,一切正常。

allow_localhost: true 设置被 allow: WebmockConfig.default_disabled_urls 覆盖,您必须使用这两种设置调用 WebMock.disable_net_connect! 一次,或者将 'localhost', '127.0.0.1' 条目添加到 self.default_disabled_urls

capybara-webkit white/blacklisting 影响浏览器发出的请求,而 WebMock 只能影响您的应用发出的请求。这意味着 WebMock 对于你想要的东西是无用的,因为它实际上不会阻止你的浏览器从 google 等加载任何东西。要在使用 selenium 驱动程序时做到这一点,你需要使用可编程代理,比如puffing-billy 这将允许您为浏览器发出的任何匹配请求自定义响应。

要使用无头 chrome 和 puffing_billy 配置驱动程序,您可以执行类似

的操作
Capybara.register_driver :headless_chrome do |app|
 browser_options = ::Selenium::WebDriver::Chrome::Options.new
 browser_options.headless!
 browser_options.add_argument("--proxy-server=#{Billy.proxy.host}:#{Billy.proxy.port}")
 Capybara::Selenium::Driver.new(app, browser: :chrome, options: browser_options)
end

您是否需要任何其他选项取决于您的系统配置等,但您应该能够通过查看当前的驱动程序注册来判断。