如何在webdriver中捕获页面发出的所有请求?是否有Browsermob的替代方案?

31
我正在使用Selenium2/WebDriver测试我的Web应用程序。所有测试都是用Java编写并通过Maven运行。
在使用WebDriver打开页面时,我希望捕获页面发出的所有请求(图像、js和css文件等)。我主要使用这些数据有两个原因:
检查调用中的404(和其他错误)。 检查分析代码是否正常工作(检查它是否发送正确的请求)。
根据项目的不同,我使用Firebug与Netexport或Browsermob代理。在这两种情况下,我可以轻松地获得HAR(HTML存档)文件,解析它并提取我想要的数据。
以下是问题: 我对这些解决方案都不满意。我尤其在页面包含加载时间过长的视频时无法获取HAR文件。我正在寻找更加稳定的方法。
那么问题是:
1. 是否有Browsermob的替代品? 我知道FiddlerCore,但它是一个.NET库,而我的测试是用Java编写的。我也听说过Ajax DynaTrace,并且我知道有一种方法将其与Selenium集成,但我找到的文档是针对 Selenium-RC 而非 WebDriver。
2. 有没有办法将DynaTrace与WebDriver集成或使用Java与FiddlerCore?
3. 是否有其他方式实现我提到的目标?我正在寻找可以轻松从我的代码控制的代理。将数据导出到HAR将是一个巨大的优势。

你可以创建一个C# Web服务,并从Java中调用它。 - Indraneel
1
这个问题与“如何使用Selenium WebDriver获取HTTP响应代码”不完全相同,但相当接近。https://dev59.com/n2w15IYBdhLWcg3wmc4J#51919201 - Ralph
3个回答


5

Firefox ver 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 is not defined”。我该如何包含这个依赖项呢?我的环境是Selenium3.0.0、FF 51和Mac OS。 - user2649233

3
我最近一直在开发这种代理软件。该项目还比较新,我仍在撰写文档,但是检查一下可能是值得的。源代码和示例在这里
  1. 将依赖项添加到您的项目中
"Original Answer"翻译成:"最初的回答"
    <dependency>
       <groupId>com.moxproxy</groupId>
       <artifactId>moxproxy.core</artifactId>
       <version>1.0.2</version>
    </dependency>
  1. 启动代理
    MoxProxy proxy = LocalMoxProxy.builder()
                .withPort(89)
                .build();
    proxy.startServer();

3. 设置selenium webdriver使用本地端口89的代理并运行测试 4. 收集流量
    List<MoxProxyProcessedTrafficEntry> requestTraffic = proxy.getAllRequestTraffic();
    List<MoxProxyProcessedTrafficEntry> responseTraffic = proxy.getAllResponseTraffic();

除了收集流量,代理还提供修改请求和响应的可能性 - 详情请见github的原始答案。

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