Browsermob Proxy + Watir не захватывает трафик непрерывно - PullRequest
0 голосов
/ 06 декабря 2018

У меня правильно настроен прокси-сервер BrowserMob с Watir, и он захватывает трафик и сохраняет файл 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_until{page.element2.present?)
  BMP.fetch_har_entries("target/url")
 end
end

Что мне не хватает, из-за чего прокси не захватывает трафик целиком?

1 Ответ

0 голосов
/ 12 апреля 2019

В случае, если кто-нибудь попадет сюда из поиска в Google, я разобрался, как решить эту проблему самостоятельно (спасибо сообществу 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 секунд.и если мое сетевое событие не происходило в течение этих 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
...