我能否使用Selenium-webdriver for Ruby自动化Chrome请求阻止?

11
我是一名QA自动化分析员,负责测试一个多平台的在线银行应用程序。我们使用RubyMine套件与Gherkin/Cucumber、Ruby脚本和Selenium-webdriver、Watir和page-object宝石/库进行自动化测试。
我有许多脚本无法完全自动化,需要手动干预,其中包括通过Telerik Fiddler阻止某些网络调用以产生警告页面或错误消息等。我们未来的自动化将通过RubyMine而不是Fiddler实现网络阻塞。我知道在Chrome中使用Inspect Element和Network菜单的"启用请求阻止"可以做到这一点。然而,我无法想出一种方法强制Chrome通过Ruby/Selenium阻止给定的请求。唯一的办法是手动去做,因此我不能像想要的那样自动化这些过程。
所以,我的问题是--是否可能使用Selenium-webdriver自动化请求阻止?如果可能,我应该从哪里开始寻求帮助呢?
谢谢。

1
{btsdaf} - Florent B.
https://chromedevtools.github.io/devtools-protocol/tot/Network/#method-setBlockedURLs - Florent B.
{btsdaf} - centuryfall
{btsdaf} - centuryfall
{btsdaf} - Florent B.
4个回答

14

虽然没有非常详细的说明,但您也可以通过向Chrome传递host-resolver-rules选项并将域名映射到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

我使用了host-rules,但概念是相同的,也可以在Protractor中完成。这是一个救命稻草,因为在Angular加载之前,Protractor onPageLoad没有触发。 - William Neely
我将添加Java代码: options.addArguments("--host-rules=MAP *.google.com 127.0.0.1, MAP *.amazon.com 127.0.0.1"); - liaombro

10

使用 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")

1
谢谢。我花了一天的时间尝试让它在没有“Network.enable”调用的情况下工作。 - codesnik

8

对于想了解的人,Python版本只有:

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

这对于“remote” webdriver 不起作用。为了解决这个问题,我不得不使用这个解决方法 - Marco Antônio

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接