1

我使用BrowserStack和 Selenium-webdriver 在不同类型的设备和浏览器上运行测试。所以实际上测试是由 RemoteWebDriver 运行的。我知道可以使用BrowserMobProxy在 Selenium 测试中捕获网络,但据我所知,只有在本地机器上运行测试时它才有效。
有没有办法在像 BrowserStack 这样的跨平台基础上运行测试时捕获网络?

更新
按照我的建议,我设法使用独立的 BrowserMobProxy 和独立的本地 BrowserStack 捕获了 har 文件中的网络(来自链接“localhost:8080/proxy/8081/har”)。

我尝试从代码中自动执行相同的操作:

    BrowserMobProxy proxy = new BrowserMobProxyServer();
    proxy.start(8080);
    System.out.println("Proxy port: " + port);
    System.setProperty("java.net.useSystemProxies", "true");
    System.setProperty("http.proxyHost", "127.0.0.1");
    System.setProperty("http.proxyPort", "8080");
    System.setProperty("https.proxyHost", "127.0.0.1");
    System.setProperty("https.proxyPort", "8080");

    Local l = new Local();
        Map<String, String> options = new HashMap<String, String>();
        options.put("key", accessKey);
        options.put("forcelocal", "true");`

    //when I uncomment it i get an exception: 
    //com.browserstack.local.LocalException: Could not connect to www.browserstack.com! 

    //            options.put("forceproxy", "true");
    //            options.put("proxyHost", "localhost");
    //            options.put("proxyPort", "8080");
        l.start(options);
    }
    Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);
    capabilities.setCapability(CapabilityType.PROXY, seleniumProxy);
    proxy.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT);
    driver = new RemoteWebDriver(new URL("http://"+username+":"+accessKey+"@"+config.get("server")+"/wd/hub"), capabilities);'

    proxy.newHar("testHar.com");

    driver.get(testUrl);
    Thread.sleep(15000);
    Har har = proxy.getHar();
    FileOutputStream fos = new FileOutputStream("C:\\LoadingPage\\network\\testHar.har");
    har.writeTo(fos);

与 url 的连接正常,我可以看到它并制作屏幕截图。但!在 har 文件中,我只看到对“hub-cloud.browserstack.com/wd/hub/...”的请求,而不是来自页面本身的请求。

如何从代码中获得正确的 har? 代码中有什么不正确的地方?

4

2 回答 2

3

根据我的经验,我想对 BrowserStack 链接(由 Mikhail 共享)中给出的二进制命令进行小的修改。doc 中给出的 cmd 应该适用于私有 URL,但可能不适用于公共 URL。


  • 独立二进制文件的步骤:

1 - 从“ https://www.browserstack.com/local-testing#command-line ”下载 BrowserStackLocal 二进制文件。

通过运行以下命令启动二进制文件以启用您的代理来监控流量。

- BrowserStackLocal.exe --key --local-proxy-host --local-proxy-port --local-proxy-user --local-proxy-pass --force-proxy --force-local

有关所有修饰符的更多详细信息,请访问“ https://www.browserstack.com/local-testing#modifiers ”。

2 - 在您的测试脚本中包含“browserstack.local”功能。

“browserstack.local”=真



  • Java(BrowserStack Local)绑定的步骤:

1 - 按照以下步骤使用本地绑定。

2 - 使用,您可以使用最新版本的二进制文件中可用的更新选项。例如,如果您希望添加没有现有包装器的--local-proxy-*选项(例如内部映射到this的this),请尝试使用以下方法:

bsLocalArgs.put("-local-proxy-host", "Your BrowserMob proxy IP");

bsLocalArgs.put("-local-proxy-port", "Your BrowserMob proxy Port");

bsLocalArgs.put("-local-proxy-user", "Your BrowserMob proxy Username");

bsLocalArgs.put("-local-proxy-pass", "Your BrowserMob proxy Password");

3 - 在您的测试脚本中包含“browserstack.local”功能。

“browserstack.local”=真


工作原理: 默认情况下,BrowserStack 将解析其网络中的所有公共 URL。

使用--force-local选项将强制二进制文件通过您的网络而不是来自 BrowserStack 的网络来解析所有流量(甚至是公共 URL)。

添加--local-proxy-*选项将使二进制文件知道流量也需要通过本地代理进行路由。

现在您的本地 BrowserMob 可以捕获 HAR 中的所有流量。

于 2017-07-21T15:41:05.923 回答
1

我看到这个问题的 2 个解决方案

  1. BrowserMobProxy - 有 2 种方式运行它: 1. 从您的代码(添加库) 2. 独立代理(由 REST API 控制)。在这两种情况下,您都需要为 webdriver 提供代理并控制您的代理。这里要理解的一个更重要的事情是,您需要将来自browsermob的所有流量重定向到proxy所在的机器,请参阅本文浏览器堆栈本地执行。据我了解,问题描述了在一台机器上创建代理并且浏览器堆栈根本无法访问它的情况。使用 browsermob,您可以获得所有必需的信息:如请求、参数、响应代码、响应时间等。甚至等待请求完成。

  2. 检查性能日志。ChromeDriver 有一个选项可以捕获性能日志。此选项更容易,因为您不需要关心代理。但是,这种方法也有一定的局限性:您将无法获得响应时间和响应代码等请求统计信息,并且可能无法获得其他可能需要的统计信息。它只允许您获取基本信息,例如:请求类型、请求 url,当然您可以从 url 解析参数。

于 2017-07-20T14:11:34.060 回答