【问题标题】:Can I automate Chrome request blocking using Selenium-webdriver for Ruby?我可以使用 Selenium-webdriver for Ruby 自动阻止 Chrome 请求吗?
【发布时间】:2018-04-04 02:47:23
【问题描述】:

我是一名 QA 自动化分析师,负责测试多平台网上银行应用程序。对于我们的自动化测试,我们使用 RubyMine 套件和 Gherkin/Cucumber、Ruby 脚本步骤和 Selenium-webdriver、Watir 和页面对象 gems/库。

我有许多脚本,如果没有人工干预,我无法完全自动化,其中包括通过 Telerik Fiddler 阻止某些网络调用以生成警告页面或错误消息等。我们自动化的未来将通过 RubyMine 来实现而不是 Fiddler 用于网络阻塞。我知道有一种方法可以在 Chrome 中使用 Inspect Element 和使用 启用请求阻止 的网络菜单来执行此操作。但是,我想不出一种通过 Ruby/Selenium 强制 Chrome 阻止给定请求的方法。唯一的方法是自己手动完成,因此我实际上无法根据需要自动执行这些操作。

那么,我的问题是——这是否有可能使用 Selenium-webdriver 自动阻止请求?如果是这样,我应该从哪里开始寻求帮助?

谢谢。

【问题讨论】:

  • 要阻止 URI,请在自定义代理上启动浏览器或通过 Selenium 调用 DevTool API 或使用 Web 扩展。
  • 谢谢!我现在就看看这个!
  • 因此研究一下,DevTools API 是我们可以使用的最有可能的解决方案。但是,我没有看到如何将其用于我们想做的事情的示例。我正在考虑调用 RequestPattern 并使用 YAML 变量代替我希望阻止的请求,但我没有看到失败的调用或返回 404 错误的能力,例如。您是否知道该 API 中的哪些调用可以完成此操作?
  • 似乎无法使用 Selenium/DevTool 更改响应/状态,因为它需要直接侦听套接字以获取事件。 puppeter 看起来相当简单。

标签: ruby google-chrome selenium network-programming browser-automation


【解决方案1】:

使用 DevTool API 阻止使用 Selenium 加载 URL:

def send_cmd(driver, cmd, params={})
  bridge = driver.send(:bridge)
  resource = "session/#{bridge.session_id}/chromium/send_command_and_get_result"
  response = bridge.http.call(:post, resource, {'cmd':cmd, 'params': params})
  raise response[:value] if response[:status]
  return response[:value]
end

send_cmd(driver, "Network.setBlockedURLs", {'urls': ["*"]})
send_cmd(driver, "Network.enable")

【讨论】:

  • 谢谢。我花了一天时间尝试在没有“Network.enable”调用的情况下完成这项工作。
【解决方案2】:

它没有很好的记录,但您也可以通过将 host-resolver-rules 选项传递给 chrome 并将域映射到 localhost 或无效 IP 来实现请求阻止。像这样的东西应该适合你:

options = Selenium::WebDriver::Chrome::Options.new
options.add_argument('--host-resolver-rules=MAP www.google-analytics.com 127.0.0.1')
driver = Selenium::WebDriver.for :chrome, options: options

【讨论】:

  • 我使用了主机规则,但概念是一样的,也可以在量角器中完成。救命稻草,因为量角器 onPageLoad 在角度加载之前没有触发。
【解决方案3】:

试试https://github.com/lightbody/browsermob-proxy

我不知道它是否能满足您的要求,因为我不是网络专家,我确​​实广泛使用 browsermob-proxy 和 selenium 来捕获网络请求,并且有一种方法可以将某些请求列入黑名单

https://browsermob-proxy-py.readthedocs.io/en/stable/client.html#browsermobproxy.Client.blacklist

How to disable loading external urls on seleniumlibrary/robotframework

【讨论】:

  • 太棒了。我也会看看这个!谢谢!
【解决方案4】:

对于那些想知道的人来说,python版本只是:

driver.execute_cdp_cmd('Network.setBlockedURLs', {"urls": ["www.baidu.com"]})
driver.execute_cdp_cmd('Network.enable', {})

【讨论】:

  • 这不适用于remote webdriver。为了解决这个问题,我不得不使用this workaround
猜你喜欢
  • 1970-01-01
  • 2018-11-24
  • 2022-01-09
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多