如何在 webdriver 中捕获页面发出的所有请求? Browsermob有啥替代品吗?
Posted
技术标签:
【中文标题】如何在 webdriver 中捕获页面发出的所有请求? Browsermob有啥替代品吗?【英文标题】:How to capture all requests made by page in webdriver? Is there any alternative to Browsermob?如何在 webdriver 中捕获页面发出的所有请求? Browsermob有什么替代品吗? 【发布时间】:2012-06-01 02:22:36 【问题描述】:我正在使用 Selenium2/WebDriver 来测试我的 Web 应用程序。所有测试均使用 Java 编写并使用 Maven 运行。
在使用 webdriver 打开页面时,我想捕获页面发出的所有请求(图像、js 和 css 文件等)。我使用这些数据主要有两个原因
在调用中检查 404(和其他错误) 检查分析代码是否正常工作(检查它是否发送正确的请求)根据项目,我使用带有 Netexport 的 Firebug 或 Browsermob 代理。在这两种情况下,我都可以轻松获取 HAR(html ARchive)文件,对其进行解析并提取我想要的数据。
问题来了: 我对这两种解决方案都不满意。当页面包含加载时间过长的视频时,我在获取 HAR 文件时尤其遇到问题。我正在寻找更稳定的东西。
所以,问题是:
有没有 Browsermob 的替代品?我知道 FiddlerCore,但它是一个 .NET 库,我的测试是用 Java 编写的。我也听说过 Ajax DynaTrace,我知道有一些方法可以将它与 Selenium 集成,但我发现的文档是针对 Selenium-RC 而不是 WebDriver。
有没有办法将 DynaTrace 与 WebDriver 集成或将 FiddlerCore 与 Java 结合使用?
还有其他方法可以实现我提到的目标吗?我正在寻找一个可以从我的代码轻松控制的代理。将数据导出到 HAR 将是一大优势。
【问题讨论】:
您可以使用创建 C# webservice 并从 java 调用它 这个问题不一样但完全等于:“How to get HTTP Response Code using Selenium WebDriver”***.com/questions/6509628/… 【参考方案1】:我找到了一个 google 群组讨论 on the topic。这些链接看起来像是 Browsermob 的有希望的替代品:
A Selenium CaptureNetworkTraffic Example in Java HOWTO: Collect WebDriver HTTP Request and Response Headers Automating the Capture of Web Timings with Selenium 2【讨论】:
【参考方案2】:firefox 版本 42+ 有一个替代方案,有一个名为 Firefox HarExport 的插件
File harExportApi = new File(System.getProperty("user.dir")
+ "/src/main/resources/firebug/harexporttrigger-0.5.0-beta.7.xpi");
netExportProfile.addExtension(harExportApi);
netExportProfile.setPreference("extensions.netmonitor.har.enableAutomation", true);
netExportProfile.setPreference("extensions.netmonitor.har.contentAPIToken", "test");
netExportProfile.setPreference("extensions.netmonitor.har.autoConnect", true);
cap.setCapability(FirefoxDriver.PROFILE, netExportProfile);
运行以下脚本将为我们提供所有请求响应
String getHarLogScript = "var options = \n" +
" token: \"test\",\n" +
" getData: true,\n" +
" title: \"my custom title\",\n" +
" jsonp: false,\n" +
" ;\n" +
"\n" +
" HAR.triggerExport(options).then(result => \n" +
" var har = JSON.parse(result.data);\n" +
"\n" +
" // Use performance.timing to provide onContentLoad\n" +
" +
" +
" var t = performance.timing;\n" +
" var pageTimings = har.log.pages[0].pageTimings;\n" +
" pageTimings.onContentLoad = t.domContentLoadedEventStart - t.navigationStart;\n" +
" pageTimings.onLoad = t.loadEventStart - t.navigationStart;\n" +
"\n" +
" window.HarEntries=har.log.entries\n" +
"\n" +
" console.log(\"HAR log (\" + result.data.length + \") \", har.log);\n" +
" , err => \n" +
" console.error(err);\n" +
" );"
LOG.info("Loading HAR log entries object into browser HarEntries object");
SeleniumUtils.executeScript(driver, getHarLogScript);
harEntries = ((List<Object>) SeleniumUtils.executeScript(driver, "return window.HarEntries"));
【讨论】:
我试过上面的代码。它说〜org.openqa.selenium.javascriptException:ReferenceError:未定义HAR〜我如何包含此依赖项。 Selenium3.0.0,FF 51,Mac OS。【参考方案3】:我最近一直在研究这种代理。项目很新鲜,我仍在处理文档,但可能值得检查。来源和例子是here
-
为您的项目添加依赖项
<dependency>
<groupId>com.moxproxy</groupId>
<artifactId>moxproxy.core</artifactId>
<version>1.0.2</version>
</dependency>
-
启动代理
MoxProxy proxy = LocalMoxProxy.builder()
.withPort(89)
.build();
proxy.startServer();
设置 selenium webdriver 以在 localhost 上使用端口 89 的代理并运行测试
收集流量
List<MoxProxyProcessedTrafficEntry> requestTraffic = proxy.getAllRequestTraffic();
List<MoxProxyProcessedTrafficEntry> responseTraffic = proxy.getAllResponseTraffic();
除了收集流量代理之外,还提供修改请求和响应的可能性 - github 上的详细信息
【讨论】:
以上是关于如何在 webdriver 中捕获页面发出的所有请求? Browsermob有啥替代品吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Selenium Webdriver 捕获特定元素而不是整个页面的屏幕截图?我尝试了已经可用的答案
如何用selenium webdriver 捕获js error
如何在不调整窗口大小的情况下使用 Java 在 Selenium Webdriver 中捕获屏幕截图 [重复]
如何在 Python 上使用 selenium webdriver 和 browsermob 代理捕获网络流量?