我一直在尝试将BrowserMob集成到我的selenium测试中。它适用于使用http的网站,但使用https网站,浏览器停止工作,HAR文件不包含任何请求。
导航到https网站时,我在浏览器上收到此错误消息。
"代理服务器出现问题或地址不正确。"
这是我的代码。
public class Browsermob {
BrowserMobProxy proxy = new BrowserMobProxyServer();
@Test
public void browsermobtest() {
proxy.start(9091);
// get the Selenium proxy object
Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);
// configure it as a desired capability
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.PROXY, seleniumProxy);
System.setProperty("webdriver.chrome.driver", "C:/Users/Madis/Documents/chromedriver.exe");
WebDriver driver = new ChromeDriver(capabilities);
// enable more detailed HAR capture, if desired (see CaptureType for the complete list)
proxy.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT);
// create a new HAR with the label "google.com"
proxy.newHar("http://www.google.com/");
// open google.com
driver.get("https://www.google.ee/#gfe_rd=cr");
driver.findElement(By.cssSelector("#gb_70")).click();
}
@AfterMethod
public void Afterthetest() {
// get the HAR data
Har har = proxy.getHar();
File harFile = new File("C:/Users/Madis/Documents/har.har");
try {
har.writeTo(harFile);
} catch (IOException e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:2)
您无需在Selenium Proxy对象上指定sslProxy。 ClientUtil.createSeleniumProxy
为您执行此操作,在大多数简单情况下,它会选择合适的默认值(使用InetAddress.getLocalHost();如果这适用于HTTP,它也适用于HTTPS)
要记住的一些事项:
--user-data-dir=/tmp/insecurechrome
。结合所有这些东西,你的代码看起来像这样:
BrowserMobProxy proxy = new BrowserMobProxyServer();
proxy.setTrustAllServers(true);
proxy.start(9091);
// get the Selenium proxy object
Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);
// NOTE: there is no call to .setSslProxy() here
// configure it as a desired capability
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.PROXY, seleniumProxy);
System.setProperty("webdriver.chrome.driver", "C:/Users/Madis/Documents/chromedriver.exe");
ChromeOptions options = new ChromeOptions();
options.addArgument("--ignore-certificate-errors");
// replace 'somedirectory' with a suitable temp dir on your filesystem
options.addArgument("--user-data-dir=somedirectory");
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
WebDriver driver = new ChromeDriver(capabilities);
// [...]
答案 1 :(得分:1)
我有这个问题。经过多次试验,我知道如果你连接到公司代理,我们必须添加setmitmManager和上游代理。它对我有用。
以下是示例代码。
BrowserMobProxy proxy = new BrowserMobProxyServer();
proxy.setTrustAllServers(true);
//Add below line if you are under corporate proxy.
proxy.setChainedProxy(new InetSocketAddress("XXX.XXX.com", 8080));
proxy.setMitmManager(ImpersonatingMitmManager.builder().trustAllServers(true).build());
proxy.start(9091);
// get the Selenium proxy object
Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);
// configure it as a desired capability
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.PROXY, seleniumProxy);
System.setProperty("webdriver.chrome.driver","C:/Users/Madis/Documents/chromedriver.exe");
WebDriver driver = new ChromeDriver(capabilities);
// your code to start, get har
答案 2 :(得分:0)
您混淆了浏览器mob代理对象和selenium代理对象。
您的代理变量proxy
是您的浏览器将连接到的实际代理。
您的seleniumProxy
变量是代表浏览器代理设置的对象。
您告诉您的浏览器使用" trustAllSSLCertificates"作为代理服务器的地址,这就是您收到错误的原因。相反,您应该告诉browsermob(proxy
)到trustAllSSLCertificates
,并且您的sslProxy需要引用您的browsermob代理。
像这样启动代理:
public void startProxy() {
proxy = new BrowserMobProxyServer();
proxy.setTrustAllServers(true);
proxy.start(9091);
}
像这样启动驱动程序:
public void startBrowserWithProxy() {
Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);
seleniumProxy.setSslProxy("localhost:" + proxy.getPort());
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.PROXY, seleniumProxy);
System.setProperty("webdriver.chrome.driver", "C:/Users/Madis/Documents/chromedriver.exe");
WebDriver driver = new ChromeDriver(capabilities);
}
答案 3 :(得分:0)
我设法让它发挥作用。添加log4j并调试browsermob日志后,问题是由
引起的Caught an exception on ClientToProxyConnection
java.lang.NoSuchMethodError: com.google.common.net.HostAndPort.fromHost(Ljava/lang/String;)Lcom/google/common/net/HostAndPort;
为了使它工作,我不得不为我的maven项目添加一个依赖项。这解决了这个问题,我能够看到捕获https网站上的流量以及http网站。
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>20.0</version>
</dependency>
答案 4 :(得分:0)
我在功能,选项等方面有很多东西,但是没有用 就我而言,我更改了pom中的存在依赖项
<artifactId>browsermob-core-littleproxy</artifactId>
到
<dependency>
<groupId>net.lightbody.bmp</groupId>
<artifactId>browsermob-core</artifactId>
<version>2.1.5</version>
</dependency>
以及“番石榴”版本。 之后一切都变好了