Browsermob Proxy + Watir不会持续捕获流量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Browsermob Proxy + Watir不会持续捕获流量相关的知识,希望对你有一定的参考价值。

我使用Watir正确设置了BrowserMob代理,它捕获流量并保存HAR文件;然而,它没有做的是它不会持续捕获流量。以下是我正在努力实现的目标:

  1. 去首页
  2. 单击链接转到另一个页面,我需要等待某些事件发生
  3. 进入第二页后,在事件发生后开始捕获流量并等待特定呼叫发生并捕获其内容。

然而,我注意到的是,它遵循上述所有步骤,但在第3步,代理在该页面上甚至进行调用之前停止捕获流量。返回的HAR没有调用它,因此测试在它完成工作之前就失败了。以下是代码的样子。

class BMP
attr_accessor :server, :proxy, :net_har, :sel_proxy

 def initialize
    bm_path = File.path(Support::Paths.cucumber_root + "/browsermob- 
    proxy-2.1.4/bin/browsermob-proxy")
    @server = BrowserMob::Proxy::Server.new(bm_path, :port => 9999, 
       :log => false, :use_little_proxy => true, :timeout => 100)
    @server.start
    @proxy = @server.create_proxy
    @sel_proxy = @proxy.selenium_proxy

    @proxy.timeouts(:read => 50000, :request => 50000, :dns_cache => 
      50000)

    @net_har = @proxy.new_har("new_har", :capture_binary_content => 
      true, :capture_headers => true, :capture_content => true)
end

def fetch_har_entries(target_url)

  har_logs = File.join(Support::Paths.har_logs, "har_file # . 
  Time.now.strftime("%m%d%y_%H%M%S") .har")
  @net_har.save_to har_logs

  index = 0
  while (@net_har.entries.count > index) do

    if @net_har.entries[index].request.url.include?(target_url) && 
    entry.request.method.eql?("GET")
      logs = JSON.parse(entry.response.content.text) if not 
          entry.response.content.text.nil?
      har_logs = File.join(Support::Paths.har_logs, "json_file_# . 
          Time.now.strftime("%m%d%y_%H%M%S").json")
      File.open(har_logs, "w") do |json|
         json.write(logs)
      end
      break
    end 
  index += 1
  end
 end
end

在我的测试文件中,我有以下内容

Then("I navigate to the homepage") do
 visit(HomePage) do |page|
  page.element.click
 end
end

And("I should wait for event to capture traffic") do 
 visit(SecondPage) do |page|
  page.wait_untilpage.element2.present?)
  BMP.fetch_har_entries("target/url")
 end
end

我错过了什么导致代理不能完全捕获流量?

答案

如果有人从谷歌搜索到这里,我想出了如何解决这个问题(感谢stackoverflow社区什么都没有,哈哈)。所以为了解决这个问题,我使用了一个名为retriable loop的自定义eventually方法。

 logs = nil
eventually(timeout: 110, interval: 1) do
  @net_har = @proxy.new_har("har", capture_binary_content: true, capture_headers: true, capture_content: true)
  @net_har.entries.each do |entry|
    begin
      break if @net_har.entries.index entry == @net_har.entries.count
      next unless entry.request.url.include?(target_url) &&
                  entry.request.post_data.text.include?(target_body_text)

      logs = entry.request.post_data.text
      break
    rescue TypeError
      fail("Response body for the network call came back empty")
    end
  end
  raise EOFError if logs_hash.nil?
end
logs
end

基本上我假设发生的事情是BMP只会缓存或捕获30秒的har日志,如果我的网络事件在30秒内没有发生,我就是SOL。所以上面的代码正在做的是它正在等待logs变量不是nil,如果是,它会引发一个EOFError并返回循环再次初始化har并再次寻找网络调用。它一直这样做,直到它找到呼叫或110秒为止。以下是我正在使用的eventually方法

def eventually(options = )
  timeout = options[:timeout] || 30
  interval = options[:interval] || 0.1
  time_limit = Time.now + timeout
  loop do
    begin
     yield 
    rescue EOFError => error
  end
  return if error.nil?
  raise error if Time.now >= time_limit

  sleep interval
 end
end

以上是关于Browsermob Proxy + Watir不会持续捕获流量的主要内容,如果未能解决你的问题,请参考以下文章

BrowserMob proxy

同时使用 browsermob

Selenium:browsermob 可以在 RemoteWebDriver 上运行吗?

如何在 webdriver 中捕获页面发出的所有请求? Browsermob有啥替代品吗?

由于 SSL 证书使用 Selenium Webdriver 和 BrowserMob 代理来捕获 har 文件,因此无法加载资源

如何在 Python 上使用 selenium webdriver 和 browsermob 代理捕获网络流量?