有没有办法使用 BrowserStack 和 Selenium 捕获网络?
Is there a way to capture network using BrowserStack with Selenium?
我使用 BrowserStack 和 Selenium-webdriver 运行 在不同类型的设备和浏览器上进行测试。所以实际上测试是由 RemoteWebDriver 运行ning 进行的。
我知道可以使用 BrowserMobProxy 在 Selenium 测试中捕获网络,但据我所知,只有当测试在本地机器上 运行ning 时它才有效。
在像 BrowserStack 这样的跨平台基础上进行测试时 运行 是否有捕获网络的方法?
更新
我设法在 har 文件中捕获网络(来自 link "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);
与 url 的连接正常,我可以看到它并制作屏幕截图。
但!在 har 文件中,我只看到对 "hub-cloud.browserstack.com/wd/hub/..." 的请求,而不是来自页面本身的请求。
如何从代码中得到正确的har?
代码哪里不对?
我看到这个问题有 2 个解决方案
BrowserMobProxy - 有两种方法 运行 它: 1. 从您的代码(添加库) 2. 独立代理(由 REST API 控制)。在这两种情况下,您都需要向 webdriver 提供代理并控制您的代理。这里需要理解的还有一点很重要,就是需要把所有来自browsermob的流量都重定向到proxy所在的机器上,browserstack本地执行请参考this一文。据我了解,问题描述了在一台机器上创建代理并且 browserstack 根本无法访问它的情况。
使用 browsermob 你可以获得所有需要的信息:比如请求、参数、响应代码、响应时间等。甚至等待请求完成。
检查性能日志。 ChromeDriver 有一个选项可以捕获 performance logs。此选项更容易,因为您不需要关心代理。然而,这种方法也有一些局限性:您将无法获得请求统计信息,例如响应时间和响应代码以及可能需要的其他一些信息。它只允许您获取基本信息,例如:请求类型、请求 url,当然您可以从 url.
解析参数
根据我的经验,我想对 BrowserStack link(由 Mikhail 共享)中给出的二进制命令添加小的修改。文档中给出的 cmd 应该适用于私有 URL,但可能不适用于 public 个。
- 独立二进制文件的步骤:
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 Local)绑定的步骤:
1 - 按照 these steps 使用本地绑定。
2 - 使用 this you can use newer options available in latest versions of the binary. For instance if you wish to add --local-proxy-* options, for which there is no existing wrapper (like this which is internally mapped to 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" = true
工作原理:
默认情况下,BrowserStack 将从其网络中解析所有 public URL。
使用 --force-local 选项将强制二进制文件解析通过您的网络而不是来自 BrowserStack 网络的所有流量(甚至 public URL)。
添加 --local-proxy-* 选项将使二进制文件知道流量也需要通过本地代理进行路由。
现在您的本地 BrowserMob 可以捕获 HAR 中的所有流量。
我使用 BrowserStack 和 Selenium-webdriver 运行 在不同类型的设备和浏览器上进行测试。所以实际上测试是由 RemoteWebDriver 运行ning 进行的。
我知道可以使用 BrowserMobProxy 在 Selenium 测试中捕获网络,但据我所知,只有当测试在本地机器上 运行ning 时它才有效。
在像 BrowserStack 这样的跨平台基础上进行测试时 运行 是否有捕获网络的方法?
更新
我设法在 har 文件中捕获网络(来自 link "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);
与 url 的连接正常,我可以看到它并制作屏幕截图。 但!在 har 文件中,我只看到对 "hub-cloud.browserstack.com/wd/hub/..." 的请求,而不是来自页面本身的请求。
如何从代码中得到正确的har? 代码哪里不对?
我看到这个问题有 2 个解决方案
BrowserMobProxy - 有两种方法 运行 它: 1. 从您的代码(添加库) 2. 独立代理(由 REST API 控制)。在这两种情况下,您都需要向 webdriver 提供代理并控制您的代理。这里需要理解的还有一点很重要,就是需要把所有来自browsermob的流量都重定向到proxy所在的机器上,browserstack本地执行请参考this一文。据我了解,问题描述了在一台机器上创建代理并且 browserstack 根本无法访问它的情况。 使用 browsermob 你可以获得所有需要的信息:比如请求、参数、响应代码、响应时间等。甚至等待请求完成。
检查性能日志。 ChromeDriver 有一个选项可以捕获 performance logs。此选项更容易,因为您不需要关心代理。然而,这种方法也有一些局限性:您将无法获得请求统计信息,例如响应时间和响应代码以及可能需要的其他一些信息。它只允许您获取基本信息,例如:请求类型、请求 url,当然您可以从 url.
解析参数
根据我的经验,我想对 BrowserStack link(由 Mikhail 共享)中给出的二进制命令添加小的修改。文档中给出的 cmd 应该适用于私有 URL,但可能不适用于 public 个。
- 独立二进制文件的步骤:
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 Local)绑定的步骤:
1 - 按照 these steps 使用本地绑定。
2 - 使用 this you can use newer options available in latest versions of the binary. For instance if you wish to add --local-proxy-* options, for which there is no existing wrapper (like this which is internally mapped to 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" = true
工作原理: 默认情况下,BrowserStack 将从其网络中解析所有 public URL。
使用 --force-local 选项将强制二进制文件解析通过您的网络而不是来自 BrowserStack 网络的所有流量(甚至 public URL)。
添加 --local-proxy-* 选项将使二进制文件知道流量也需要通过本地代理进行路由。
现在您的本地 BrowserMob 可以捕获 HAR 中的所有流量。