【问题标题】:Is there a way to capture network using BrowserStack with Selenium?有没有办法使用带有 Selenium 的 BrowserStack 来捕获网络?
【发布时间】:2017-07-19 15:12:27
【问题描述】:

我使用 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? 代码中有什么不正确的地方?

【问题讨论】:

  • 您希望捕获什么样的流量以及想要获得什么样的信息?
  • @Mikhail 首先,我需要检查页面是否在一段时间后开始向确定的 url(GET 请求)发送请求(我们在页面内有一个视频播放器,视频开始后,它会发送请求到我们的统计服务器,所以我们可以分析播放视频的百分比)。请求url示例:stats-...com/?pid=....&atype=0&cvprogress=10 其次,点击按钮后,我还需要检查统计请求是否发送正确。

标签: java selenium-webdriver browserstack browsermob


【解决方案1】:

根据我的经验,我想对 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" = true



  • Java(BrowserStack 本地)绑定步骤:

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 选项将强制二进制文件通过您的网络而不是来自 BrowserStack 的网络来解析所有流量(甚至是公共 URL)。

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

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

【讨论】:

  • 我使用的不是独立的 BrowserStack,而是来自我的代码:我添加了对 pom 的依赖:&lt;dependency&gt; &lt;groupId&gt;com.browserstack&lt;/groupId&gt; &lt;artifactId&gt;browserstack-local-java&lt;/artifactId&gt; &lt;version&gt;1.0.2&lt;/version&gt; &lt;/dependency&gt;
  • 建立连接时:Local l = new Local(); Map&lt;String, String&gt; options = new HashMap&lt;String, String&gt;(); options.put("key", accessKey); options.put("forcelocal", "true"); options.put("forceproxy", "true"); options.put("proxyHost", "127.0.0.1"); options.put("proxyPort", String.valueOf(port)); l.start(options);' 出现异常:com.browserstack.local.LocalException: 无法连接到 www.browserstack.com!
  • 如果我只离开它就可以正常工作:Map&lt;String, String&gt; options = new HashMap&lt;String, String&gt;(); options.put("key", accessKey); options.put("forcelocal", "true"); l.start(options); 并删除其他选项(proxyHost、proxyPort...)
  • 127.0.0.1 可能无法与 proxyHost 一起使用,这就是他们拥有 --local-proxy-host (较新选项)的原因。我在之前的回答中添加了步骤,通过绑定包含新选项。
  • 我现在验证了你的代码,我建议删除这个代理 seleniumProxy = ClientUtil.createSeleniumProxy(proxy);能力.setCapability(CapabilityType.PROXY, seleniumProxy);远程浏览器不会理解您的本地代理,这就是二进制文件知道您的本地代理的原因。当代理是公共的并且您不需要二进制连接时,设置代理在远程浏览器上有效。
【解决方案2】:

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

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

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

【讨论】:

  • 嗨!感谢您的回答。我使用 BrowserMobProxy(嵌入模式 - 来自我的代码)和 browserstack 的本地测试功能。我设法在代理后面建立连接,所以我得到了 url 并可以制作屏幕截图......但是 BrowserMobProxy 创建的 har 文件只包含对hub-cloud.browserstack.com/wd/hub...的请求,而不是来自页面本身的请求。当在没有浏览器堆栈的情况下使用 BrowserMobProxy 时(例如,我的意思是当我使用本地 chromdriver 时),我会得到包含我需要的所有请求的 har 文件
  • 您尝试过使用独立代理的方法吗?您是否检查过性能日志是否足以满足您的需求?另外,我建议您在创建 WebDriver 并设置代理的原始帖子中添加代码示例
  • 刚试过:使用独立代理它似乎工作正常,我得到了我需要的 har 文件(来自链接localhost:8080/proxy/8081/har)。我不确定性能日志,因为我还需要检查 Firefox 的网络,而不仅仅是 Chrome。我将在帖子中添加代码更新。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多