31

我正在使用 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 将是一大优势。

4

3 回答 3

14

我找到了关于该主题的 google 群组讨论。这些链接看起来像是 Browsermob 的有希望的替代品:

于 2012-12-19T06:30:35.330 回答
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"));
于 2015-12-02T13:01:19.043 回答
2

我最近一直在研究这种代理。项目很新鲜,我仍在处理文档,但可能值得检查。来源和例子在这里

  1. 将依赖项添加到您的项目
    <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();
  1. 设置 selenium webdriver 以在 localhost 上使用端口 89 的代理并运行测试

  2. 收集流量

    List<MoxProxyProcessedTrafficEntry> requestTraffic = proxy.getAllRequestTraffic();
    List<MoxProxyProcessedTrafficEntry> responseTraffic = proxy.getAllResponseTraffic();

除了收集流量代理之外,还提供修改请求和响应的可能性 - github上的详细信息

于 2019-03-16T22:44:42.553 回答