2

我一直在尝试将 BrowserMob 集成到我的硒测试中。它适用于在 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();
    }

  }
}
4

5 回答 5

3

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

要记住几件事:

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

结合所有这些,您的代码将如下所示:

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);

// [...]
于 2016-09-08T22:48:19.200 回答
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
于 2017-02-21T10:18:30.780 回答
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);
}
于 2016-09-06T14:24:59.940 回答
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>
于 2017-01-04T12:44:08.213 回答
0

我对功能、选项等有很多要求,但它不起作用就我而言,我更改了 pom 中存在的依赖项

<artifactId>browsermob-core-littleproxy</artifactId>

<dependency>
       <groupId>net.lightbody.bmp</groupId>
       <artifactId>browsermob-core</artifactId>
       <version>2.1.5</version>
   </dependency>

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

于 2019-11-18T13:01:05.383 回答