1

我正在使用带有 selenium webdriver 的 Browsermob 代理来捕获 HAR 日志。我能够生成日志,但没有捕获 pageTimings。其余所有数据都被捕获。知道这里有什么问题吗?

我是否需要使用此调用等待一些时间:

PUT /proxy/[port]/wait - 等待所有请求完成

在此处输入图像描述 遵循简短答案后的更新:

  1. 从 git 获取最新快照,构建它。
  2. 从分发模块启动代理 - “主”程序。
  3. 日志被捕获
  4. 每次页面源更改后,我都会调用以强制代理通过 PUTing 到 /proxy/{port}/har/pageRef 来结束页面
  5. 使用页面引用生成日志,但仍然没有填充 pageTimings。

更新截图:

在此处输入图像描述

使用小代理后出现日志错误:

[ERROR 2015-05-18T10:29:00,288 org.littleshoot.proxy.impl.ClientToProxyConnection] (LittleProxy-ClientToProxyWorker-1) (AWAITING_INITIAL) [id: 0x1961ff09, /0:0:0:0:0:0:0:1:63598 => /0:0:0:0:0:0:0:1:8445]: Caught an exception on ClientToProxyConnection java.io.IOException: An existing connection was forcibly closed by the remote host
    at sun.nio.ch.SocketDispatcher.read0(Native Method) ~[?:1.8.0_45]
    at sun.nio.ch.SocketDispatcher.read(Unknown Source) ~[?:1.8.0_45]
    at sun.nio.ch.IOUtil.readIntoNativeBuffer(Unknown Source) ~[?:1.8.0_45]
    at sun.nio.ch.IOUtil.read(Unknown Source) ~[?:1.8.0_45]
    at sun.nio.ch.SocketChannelImpl.read(Unknown Source) ~[?:1.8.0_45]
    at io.netty.buffer.UnpooledUnsafeDirectByteBuf.setBytes(UnpooledUnsafeDirectByteBuf.java:447) ~[netty-all-4.0.27.Final.jar:4.0.27.Final]
    at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:881) ~[netty-all-4.0.27.Final.jar:4.0.27.Final]
    at io.netty.buffer.WrappedByteBuf.writeBytes(WrappedByteBuf.java:641) ~[netty-all-4.0.27.Final.jar:4.0.27.Final]
    at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:241) ~[netty-all-4.0.27.Final.jar:4.0.27.Final]
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:119) [netty-all-4.0.27.Final.jar:4.0.27.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511) [netty-all-4.0.27.Final.jar:4.0.27.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468) [netty-all-4.0.27.Final.jar:4.0.27.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382) [netty-all-4.0.27.Final.jar:4.0.27.Final]
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354) [netty-all-4.0.27.Final.jar:4.0.27.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:111) [netty-all-4.0.27.Final.jar:4.0.27.Final]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_45]
4

2 回答 2

1

简短回答:如果您使用的是 2.1.0-beta-1 或更高版本(请参阅github 页面),您可以通过 PUTing 到 /proxy/{port}/har/pageRef 来强制代理结束页面。这将填充 HAR 中的 pageTimings 对象。(它也会开始一个新的页面。)

更新:HAR 的“创建者”部分应该表明正在使用 littleproxy 模块:

"log":{
   "version":"1.2",
   "creator":{
      "name":"BrowserMob Proxy",
      "version":"2.1.0-beta-1-littleproxy",
      "comment":""
   },

这是结束第一页后填充的 pageTimings 部分的示例:

  "pages":[
     {
        "id":"Page 0",
        "startedDateTime":"2015-05-16T12:37:48.406-07:00",
        "title":"Page 0",
        "pageTimings":{
           "onLoad":89648,
           "comment":""
        },
        "comment":""
     },
     {
        "id":"Page 1",
        "startedDateTime":"2015-05-16T12:39:18.054-07:00",
        "title":"Page 1",
        "pageTimings":{
           "comment":""
        },
        "comment":""
     }
  ],

长答案:与网络浏览器不同,BrowserMob 代理实际上并不知道“页面”是什么。它只查看单个请求和响应,因此您需要明确告诉 BMP 页​​面何时开始和结束。Java 接口提供方法,newPage()REST API 提供/proxy/{port}/har/pageRef端点。但是,由于 BMP 只是一个代理,请求可能来自多个浏览器/客户端同时针对多个页面,而 BMP 无法知道哪个请求属于哪个页面。根据您的用例,页面计时信息可能没有意义。

于 2015-05-14T18:05:20.647 回答
0

这个对我有用:

BrowserMobProxy proxy = new BrowserMobProxyServer();
proxy.start(0);
HashSet<CaptureType> enable = new HashSet<CaptureType>();
enable.add(CaptureType.REQUEST_HEADERS);
enable.add(CaptureType.REQUEST_CONTENT);
enable.add(CaptureType.RESPONSE_HEADERS);
proxy.enableHarCaptureTypes(enable);
HashSet<CaptureType> disable = new HashSet<CaptureType>();
disable.add(CaptureType.REQUEST_COOKIES);
disable.add(CaptureType.RESPONSE_COOKIES);
proxy.disableHarCaptureTypes(disable);

//get the Selenium proxy object
Proxy selProxy = ClientUtil.createSeleniumProxy(proxy);

capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.PROXY, selProxy);
capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS,true);

WebDriver driver = new FirefoxDriver(new FirefoxBinary(),profile,capabilities);


driver.get(url);

Har har = proxy.getHar();
于 2015-08-18T14:17:04.283 回答