使用Selenium和browermob代理的详细计时给出了空的har文件

时间:2014-08-26 15:54:23

标签: selenium browsermob

也许有人可以帮助我,我现在已经搜索了几个小时但无法找到解决方案,在任何网站/博客/ FAQ /...

我试图通过Selenium和Browsermob代理获取页面的详细时间。但生成的HAR文件始终是空的pageTitle,pageTimings和条目,如:

  

{"登录" {"版本":" 1.2""创建器" {"名称&#34 ;:" BrowserMob Proxy","版本":" 2.0"},"页面":[{" id&#34 ;:" assertselenium.com"" startedDateTime":" 2014-08-26T15:45:49.134 + 0000""标题&#34 ;: """ pageTimings":{}}],"条目":[]}}

当我看到教程时,它看起来很容易!但不适合我。 我是公司代理人的幕后黑手,也许是导致问题的原因......

我的代码是(修改了一百次......):

import java.io.File;
import java.util.HashMap;
import java.util.concurrent.TimeUnit;

import net.lightbody.bmp.proxy.ProxyServer;

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;

public class Example {

    public static void main(String[] args) throws Exception {

        ProxyServer server = new ProxyServer(4444);

        HashMap<String, String> options = new HashMap<String, String>();

        server.start();
        server.setOptions(options);
        server.setCaptureHeaders(true);
        server.setCaptureContent(true);

        Proxy proxy = new Proxy();

        // configure it as a desired capability
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability(CapabilityType.PROXY, proxy);

        FirefoxProfile profile = new FirefoxProfile();
        profile.setAcceptUntrustedCertificates(true);
        profile.setAssumeUntrustedCertificateIssuer(true);
        profile.setPreference("network.proxy.http", "[MY_PROXY_HERE]");
        profile.setPreference("network.proxy.http_port", 8080);
        profile.setPreference("network.proxy.ssl", "[MY_PROXY_HERE]");
        profile.setPreference("network.proxy.ssl_port", 8080);
        profile.setPreference("network.proxy.type", 1);
        profile.setPreference("network.proxy.no_proxies_on", "");
        capabilities.setCapability(FirefoxDriver.PROFILE, profile);

        // start the browser up
        WebDriver driver = new FirefoxDriver(capabilities);
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

        // create a new HAR with the label "apple.com"
        server.newHar("assertselenium.com");

        // open yahoo.com
        driver.get("http://assertselenium.com");
        // driver.get("http://assertselenium.com/2012/10/30/transformation-from-manual-tester-to-a-selenium-webdriver-automation-specialist/");

        driver.findElement(By.id("searchform"))
                .findElement(By.className("field"))
                .sendKeys(new String[] { "test selenium!" });

        driver.findElement(By.id("searchform"))
                .findElement(By.className("submit")).click();

        // new PerformanceTiming((JavascriptExecutor) driver, server.getHar());

        ((JavascriptExecutor) driver)
                .executeScript("var performance = window.performance || {};"
                        + "var timings = performance.timing || {};"
                        + "return timings;");

        server.getHar().writeTo(
                new File("C:/prj/SeleniumTest/harfiles/har.txt"));

        server.stop();
        driver.quit();

    }

}

(当然[MY_PROXY_HERE]只是不给出真名:))

谢谢!

1 个答案:

答案 0 :(得分:2)

仍然没有50个代表回答而不是评论......

只是想知道你在演出时间之后是什么?您可以直接从浏览器实例中检索Navigation Timing API中的数据吗?这会为您提供页面加载performance times的详细分类。如果您的开发团队愿意插入标记,您也可以使用它来捕获嵌入式AJAX调用的时间等。 (这就是我正在做的事情)

获取数据只是一个简单的JavaScript注入。就我而言(Python - &#39;驱动程序&#39;是我的webdriver实例) - driver.execute_script(&#39; return window.performance.timing&#39;)。这将返回一个带有整页加载时序细分的字典对象。

只是问,因为它似乎比乱用代理要简单得多......