【问题标题】:Unable to capture browser network logs with BrowserStack local, BrowserMobProxy embedded mode and Selenium 3.x using java无法使用本地 BrowserStack、BrowserMobProxy 嵌入模式和 Selenium 3.x 使用 java 捕获浏览器网络日志
【发布时间】:2020-12-09 06:08:58
【问题描述】:

以下是我的 maven pom.xml 中的依赖项

<groupId>org.seleniumhq.selenium</groupId>  
<artifactId>selenium-server</artifactId>  
<version>3.14.0</version>

<groupId>net.lightbody.bmp</groupId>  
<artifactId>[browsermob-core][1]</artifactId>  
<version>2.1.5</version>

<groupId>com.browserstack</groupId>  
<artifactId>[browserstack-local-java][1]</artifactId>  
<version>1.0.3</version>

下面是我用来启动 BrowserMobProxy 的代码。

    private static void browserMobSeleniumProxyStart() {
        try {
            proxy = new BrowserMobProxyServer();
            proxy.setTrustAllServers(true);
            proxy.chainedProxyAuthorization(
                    System.getProperty("proxy.user"), System.getProperty("proxy.pass"), AuthType.BASIC);
            proxy.setChainedProxy(new InetSocketAddress(httpProxyHost, Integer.parseInt(httpProxyPort)));
            
            // Enable HAR.
            proxy.enableHarCaptureTypes(
                    EnumSet.of(
                            CaptureType.REQUEST_HEADERS,
                            CaptureType.REQUEST_CONTENT,
                            CaptureType.RESPONSE_CONTENT,
                            CaptureType.RESPONSE_HEADERS
                    )
            );
            proxy.start(browserLocalProxyPort);
            localHostAddress = Inet4Address.getLocalHost().getHostAddress();
            localHostPort = String.valueOf(proxy.getPort());
        } catch (Exception e) {
            proxy.stop();
            e.printStackTrace();
        }

变量 httpProxyHost 和 httpProxyPort 是企业代理 IP 和端口。

下面是启动 BrowserStack-local 的代码

    private static void browserStackLocalStart() {
        bsLocal = new Local();
        bsLocalArgs = new HashMap<>();
        bsLocalArgs.put("key", AUTOMATE_ACCESS_KEY);

        // BrowserStack local executable.
        bsLocalArgs.put("binarypath", format(BROWSERSTACK_PATH, "/src/test/resources/BrowserStackLocal"));

        // Force to use local and Corp proxy.
        bsLocalArgs.put("forcelocal", "true");
        bsLocalArgs.put("forceproxy", "true");

        // Set Corp Proxy and user crendentials.
        bsLocalArgs.put("proxyHost", httpProxyHost);
        bsLocalArgs.put("proxyPort", httpProxyPort);
        bsLocalArgs.put("proxyUser", System.getProperty("proxy.user"));
        bsLocalArgs.put("proxyPass", System.getProperty("proxy.password"));

        // Set local Proxy to BrowserMobProxy host - localhost ip and port and set user credentials.
        bsLocalArgs.put("localProxyHost", localHostAddress);
        bsLocalArgs.put("localProxyPort", localHostPort);
        bsLocalArgs.put("-localProxyUser", System.getProperty("proxy.user"));
        bsLocalArgs.put("-localProxyPass", System.getProperty("proxy.password"));
        seleniumProxy = ClientUtil.createSeleniumProxy(proxy);

        try {
            if(bsLocal.isRunning()) bsLocal.stop(bsLocalArgs);
            bsLocal.start(bsLocalArgs);
            log.info(format("Browser Stack Local status: %s", bsLocal.isRunning()));
        } catch (Exception e) {
            log.warning("!!! Cannot start browserstack local !!!");
        }
    }

下面是在 BrowserStack 上启动驱动的方法

private static void setDriverWithBrowserstackOptions() {
        // Start BrowserMob proxy and browserstack-local.
        browserMobSeleniumProxyStart();
        browserStackLocalStart();

        String jobName = System.getenv("JOB_BASE_NAME");

        DesiredCapabilities caps = new DesiredCapabilities();
        caps.setCapability("browserstack.local", "true");
        caps.setCapability("browserstack.selenium_version", "3.14.0");
        caps.setCapability("browserstack.debug","true");
        caps.setCapability("browserstack.networkLogs","false");
        caps.setCapability("acceptSslCerts", "true");
        caps.setCapability("name", testName);
        caps.setCapability("project", "SampleProj");
        caps.setCapability("sessionName", "sessionName1");
        caps.setCapability("localIdentifier", "Local Test");
        caps.setCapability("build", "Local");
        caps.setCapability("browserstack.maskCommands", "setValues, getValues, setCookies, getCookies");
        caps.setCapability(CapabilityType.PROXY, seleniumProxy);

        // Chrome Options.
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--ignore-certificate-errors");
        caps.merge(ChromeOptions.CAPABILITY, options);
        URL url = null;
        try {
            url = new URL(URL);
        } catch (MalformedURLException e) {
            log.warning("Browserstack URL may be incorrect."+ URL);
        }

        // Initiate RemoteWebDriver instanc
        WebDriver d = new RemoteWebDriver(url, caps);

        // Create new HAR.
        proxy.newHar();

        try {
            d.get("https://google.com");
            Thread.sleep(10000);

           // Fetch Har entries.
            List<HarEntry> harEntries = proxy.getHar().getLog().getEntries();
            for (HarEntry h : harEntries) {
                System.out.println("---------------- HAR Request -----------------");
                System.out.println(h.getRequest());
                System.out.println("----------------------------------------------");
                System.out.println("---------------- HAR Response -----------------");
                System.out.println(h.getResponse());
                System.out.println("----------------------------------------------");
            }
        } catch (Exception e) {
            e.printStackTrace();

        }
    }

我尝试了使用和不使用 BrowserMobProxy setChainedProxy,但未能捕获 HAR 条目。

感谢任何想法和方法。

【问题讨论】:

    标签: selenium-webdriver http-proxy browserstack remotewebdriver browsermob-proxy


    【解决方案1】:

    您只需设置以下功能即可在 BrowserStack 上捕获网络日志:

    caps.setCapability("browserstack.networkLogs","true");
    

    此外,您可以使用 browserstack.networkLogsOptions 捕获请求的内容。更多详情https://www.browserstack.com/automate/capabilities

    【讨论】:

    • 这没有帮助!在某处的 browserstack-local 文档中,我读到当依赖本地代理和 browserstack-local 时,browserstack.networkLogs 不应设置为 true,因此我将其设置为显式 false。
    猜你喜欢
    • 2014-10-15
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    相关资源
    最近更新 更多