我使用带有Selenium-webdriver的BrowserStack在不同类型的设备和浏览器上运行测试。所以实际上测试是由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);
与 url 的连接正在工作,我可以看到它并进行屏幕喊叫。 但!在har文件中,我只看到对"hub-cloud.browserstack.com/wd/hub/..."的请求,而不是来自页面本身的请求。
如何从代码中获取正确的 har?代码中的内容不正确?
根据我的经验,我想对 BrowserStack 链接(由 Mikhail 共享(中给出的二进制命令进行小的修改。文档中给出的cmd应该适用于私有URL,但可能不适用于公共URL。
- 独立二进制文件的步骤:
1 - 从"https://www.browserstack.com/local-testing#command-line"下载 BrowserStackLocal 二进制文件。
通过运行以下命令启动二进制文件,以使代理能够监控流量。
-浏览器堆栈本地.exe --键 --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 - 按照以下步骤使用本地绑定。
2 - 使用此功能,您可以使用最新版本的二进制文件中提供的较新选项。例如,如果您希望添加 --local-proxy-*选项,而这些选项没有现有的包装器(就像内部映射到此包装器一样(,请尝试使用以下选项:
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-*选项将使二进制文件知道流量也需要通过本地代理路由。
现在,您的本地浏览器Mob可以捕获HAR中的所有流量。
我看到这个问题的 2 种解决方案
-
BrowserMobProxy - 有两种运行方法:1.从你的代码(添加库(2.独立代理(由REST API控制(。在这两种情况下,您都需要向 Web 驱动程序提供代理并控制您的代理。这里要理解的另一件重要事情是,您需要通过代理所在的机器重定向来自 browsermob 的所有流量,请参阅本文了解浏览器堆栈本地执行。据我了解,问题描述了在一台机器上创建代理并且浏览器堆栈根本无法访问它的情况。 使用browsermob,您可以获得所有必需的信息:例如请求,参数,响应代码,响应时间等。甚至等待请求完成。
-
检查性能日志。ChromeDriver有一个选项可以捕获性能日志。此选项更容易,因为您不需要关心代理。但是,这种方法也存在某些限制:您将无法获取请求统计信息,例如响应时间和响应代码,以及可能需要的其他一些统计信息。它只允许您获取基本信息,例如:请求类型,请求网址,当然,您可以从网址解析参数。