有没有办法使用Selenium使用BrowserStack捕获网络?

时间:2017-07-19 15:12:27

标签: java selenium-webdriver browserstack browsermob

我使用BrowserStack和Selenium-webdriver在不同类型的设备和浏览器上运行测试。实际上,RemoteWebDriver正在运行测试。 我知道可以使用BrowserMobProxy在Selenium测试中捕获网络,但据我所知,只有当测试在本地计算机上运行时才能正常工作。
在BrowserStack等跨平台基础上运行测试时,有没有办法捕获网络?

更新
我设法在har文件中捕获网络(来自链接“localhost:8080 / proxy / 8081 / har”),使用独立的BrowserMobProxy和独立的本地BrowserStack,正如我所知。

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

    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);

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

如何从代码中获取正确的信息? 代码中的内容不正确?

2 个答案:

答案 0 :(得分: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 < / p>

https://www.browserstack.com/local-testing#modifiers”提供了有关所有修饰符的更多详细信息。

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

“browserstack.local”= true


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

1 - 关注these steps以使用本地绑定。

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

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”= true

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

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

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

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

答案 1 :(得分:1)

我看到2个解决此问题的方法

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

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