Selenium(Chrome)和BrowserMob不适用于https

时间:2016-09-06 11:46:16

标签: java selenium browsermob

我一直在尝试将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();
    }

  }
}

5 个答案:

答案 0 :(得分:2)

您无需在Selenium Proxy对象上指定sslProxy。 ClientUtil.createSeleniumProxy为您执行此操作,在大多数简单情况下,它会选择合适的默认值(使用InetAddress.getLocalHost();如果这适用于HTTP,它也适用于HTTPS)

要记住的一些事项:

  1. 您将在浏览器中收到SSL警告,除非您要求浏览器忽略证书错误(在Chrome上,使用--ignore-certificate-errors命令行标志),或者安装BMP CA浏览器的信任存储区(对于Windows上的Chrome,您必须将其安装在Windows信任存储区中)。
  2. 根据您的Chrome和操作系统版本,您可能需要使用命令行选项指定备用user-data-dir。例如,--user-data-dir=/tmp/insecurechrome
  3. BMP拥有自己的可信证书来源(Java信任存储+来自Mozilla的最新列表),因此,如果您尝试使用私有CA颁发的证书连接到内部网站,则需要告知BMP要么信任私有CA或使用.setTrustAllServers(true)跳过证书验证。
  4. 在调用createSeleniumProxy()之前,必须使用.start(...)启动代理。
  5. 结合所有这些东西,你的代码看起来像这样:

    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>

以及“番石榴”版本。 之后一切都变好了