浏览器代理无法使用Chrome驱动捕获网络流量

5

我正在使用以下代码将浏览器mob代理与Maven依赖项集成: net.lightbody.bmp browsermob-core 2.1.5

它根本没有捕获网络请求,我得到了这种类型的har文件:

{
   "log":{
      "version":"1.2",
      "creator":{
         "name":"BrowserMob Proxy",
         "version":"2.1.0-beta-6-littleproxy",
         "comment":""
      },
      "pages":[
         {
            "id":"11",
            "startedDateTime":"2017-10-26T17:28:42.501+05:30",
            "title":"11",
            "pageTimings":{
               "comment":""
            },
            "comment":""
         }
      ],
      "entries":[],
      "comment":""
   }
}

package lenskart.tests;

import java.io.File;
import java.net.UnknownHostException;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.Test;

import net.lightbody.bmp.BrowserMobProxyServer;
import net.lightbody.bmp.client.ClientUtil;
import net.lightbody.bmp.mitm.manager.ImpersonatingMitmManager;
import net.lightbody.bmp.proxy.CaptureType;

public class ProxyTestClass {

    @Test
    public static void main() throws Exception {
        // TODO Auto-generated method stub

        BrowserMobProxyServer browserMobProxy = new BrowserMobProxyServer();
        browserMobProxy.setTrustAllServers(true);
        browserMobProxy.setMitmManager(ImpersonatingMitmManager.builder().trustAllServers(true).build());
        browserMobProxy.start(0);

        System.out.println("Port Started On: " + browserMobProxy.getPort());
        System.setProperty("webdriver.chrome.driver", "/Users/pankaj.katiyar/Desktop/Automation/Lenskart_Automation/tpt/drivers/chromedriver");

        browserMobProxy.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT, CaptureType.RESPONSE_HEADERS);

        WebDriver driver = getDriver_CapProxy(browserMobProxy);

        driver.get("http://www.lenskart.com");
        driver.navigate().to("http://www.google.com");

        driver.quit();

        browserMobProxy.stop();

        browserMobProxy.newHar("11");
        browserMobProxy.getHar().writeTo(new File("/Users/pankaj.katiyar/Desktop/Automation/Lenskart_Automation/har"));
        ;
        System.out.println("Loaded browser ");
    }


    public static WebDriver getDriver_CapProxy(BrowserMobProxyServer browserMobProxy) throws UnknownHostException {
        Proxy proxy = ClientUtil.createSeleniumProxy(browserMobProxy);
        proxy.setHttpProxy("localhost:" + browserMobProxy.getPort());

        DesiredCapabilities cap = new DesiredCapabilities();

        ChromeOptions options = new ChromeOptions();
        options.addArguments("--ignore-certificate-errors");

        cap.setCapability(ChromeOptions.CAPABILITY, options);
        cap.setCapability(CapabilityType.PROXY, proxy);

        WebDriver driver = new ChromeDriver(options);

        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        return driver;
    }
}
2个回答

3
您的代码存在两个问题。
首先,Selenium代理被分配给了capabilities,但实例从未被使用。因此,要么将选项分配给capabilities,要么直接将Selenium代理分配给选项:
Proxy seleniumProxy  = ClientUtil.createSeleniumProxy(browserMobProxy);

ChromeOptions options = new ChromeOptions();
options.addArguments("--ignore-certificate-errors");
options.setCapability(CapabilityType.PROXY, seleniumProxy);

WebDriver driver = new ChromeDriver(options);
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

其次,您在录制结束时调用了browserMobProxy.newHar,而应该在开始时调用:
browserMobProxy.newHar("11");

driver.get("http://www.lenskart.com");
driver.navigate().to("http://www.google.com");

browserMobProxy.getHar().writeTo(new File("/Users/pankaj.katiyar/Desktop/Automation/Lenskart_Automation/har"));

driver.quit();
browserMobProxy.stop();

代理应用后 - 我得到了:此页面无法工作www.google.co.in 没有发送任何数据。 ERR_EMPTY_RESPONSE - Pankaj Kumar Katiyar
可能是重定向的问题。请尝试使用 https://www.google.com 而不是 http://www.google.com - Florent B.

3

我运行了你的代码,只需要做两处更改,将

WebDriver driver = new ChromeDriver(options);

为了

WebDriver driver = new ChromeDriver(cap);

请把 browserMobProxy.newHar("11"); 放在导航前面。

browserMobProxy.newHar("11");
driver.get("http://www.lenskart.com");

在您的代码中,其余部分都没问题。执行此操作后,Har将正常生成,如下图所示:

生成的HAR


代理应用后,我遇到了“此页面无法正常工作,www.google.co.in没有发送任何数据。ERR_EMPTY_RESPONSE”错误。 - Pankaj Kumar Katiyar
@PankajKumarKatiyar,让我来检查一下。 - Tarun Lalwani
尝试移除 setMitmManagersetTrustAllServers。在这之后,它对于 https 链接也可以正常工作。 - Tarun Lalwani
抱歉,它不起作用了。我尝试在注释这些行之后运行,browserMobProxy.setTrustAllServers(true); browserMobProxy.setMitmManager(ImpersonatingMitmManager.builder().trustAllServers(true).build()); 但仍然出现错误 - 此页面无法正常工作。 - Pankaj Kumar Katiyar
我想我可能以前做过一些相同的证书设置,让我检查一下。 - Tarun Lalwani
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接