Browsermob Proxy + Watir 不连续捕获流量
Browsermob Proxy + Watir not capturing traffic continuously
我使用 Watir 正确设置了 BrowserMob 代理,它正在捕获流量并保存 HAR 文件;但是,它没有做的是它没有持续捕获流量。所以以下是我想要实现的目标:
- 进入主页
- 单击 link 转到另一个页面,我需要在其中等待某些事件的发生
- 进入第二页后,在事件发生后开始捕获流量并等待特定调用发生并捕获其内容。
然而,我注意到的是,它遵循了上述所有步骤,但在第 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
我错过了什么导致代理无法完全捕获流量?
万一有人通过 google 搜索来到这里,我想出了如何自己解决这个问题(感谢 Whosebug 社区,大声笑)。因此,为了解决这个问题,我使用了一个名为 eventually
的自定义 retriable loop
方法。
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
我使用 Watir 正确设置了 BrowserMob 代理,它正在捕获流量并保存 HAR 文件;但是,它没有做的是它没有持续捕获流量。所以以下是我想要实现的目标:
- 进入主页
- 单击 link 转到另一个页面,我需要在其中等待某些事件的发生
- 进入第二页后,在事件发生后开始捕获流量并等待特定调用发生并捕获其内容。
然而,我注意到的是,它遵循了上述所有步骤,但在第 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
我错过了什么导致代理无法完全捕获流量?
万一有人通过 google 搜索来到这里,我想出了如何自己解决这个问题(感谢 Whosebug 社区,大声笑)。因此,为了解决这个问题,我使用了一个名为 eventually
的自定义 retriable loop
方法。
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