基于JCEF实现网页资源性能分析

文章目录

1、需求

在使用chrome浏览器访问页面时,浏览器自带的开发者工具可以查看页面每个资源的资源大小和加载时间。

这个功能可以让我们直接知道接口或资源的耗时情况和大小情况,如果存在性能问题,可以进行分析处理。

但是如果系统的功能页面比较多,每个页面都一个一个分析查看的,会比较耗工作量。功能测试大多是由测试工程师进行,测试工程师更关注功能的完善,不会统计每个页面的性能。运营人员在运营过程中,也会错误上传一些过大的,也需要测试人员在访问这个资源并且同时打开了开发者工具时才能发现。

2、实现代码

本文是基于JCEF框架(Chromium嵌入式框架CEF,允许将Web浏览器嵌入到Java桌面应用中),简单封装了基本浏览器功能,在JCEF的内部接口类CefRequestHandler中实现记录加载时间和资源大小。

java 复制代码
public class RequestHandler extends CefResourceRequestHandlerAdapter implements CefRequestHandler {
    private final Frame owner_;
    // 记录每个请求的耗时
    public Map<String, Long> table = new Hashtable<>();

    public RequestHandler(Frame owner) {
        owner_ = owner;
    }

    
    /**
     * 记录http请求结束的时间,并保存到文件
     */
    @Override
    public void onResourceLoadComplete(CefBrowser browser, CefFrame frame, CefRequest request,
                                       CefResponse response, CefURLRequest.Status status, long receivedContentLength) {
        String requestUrl = request.getURL();
        String browserUrl = browser.getURL();
        long size = receivedContentLength;
        long start = table.getOrDefault(requestUrl, -1L);
        long takeTime = System.currentTimeMillis() - start;
        Map<String, String> mapTemp = new HashMap();
        response.getHeaderMap(mapTemp);
        JSONObject map = JSONUtil.parseObj(JSONUtil.toJsonStr(mapTemp).toLowerCase());
        String contentType = map.getStr("content-type", "");
        String server = map.getStr("server", "");
        String xPoweredBy = map.getStr("x-powered-by", "");
        NetworkLog log = new NetworkLog(requestUrl, browserUrl, size, takeTime, contentType, server, xPoweredBy, response.getStatus());
        FileCsvUtil.writeNetworkLog(log);
    }

    /**
     * 记录http请求开始的时间
     */
    @Override
    public boolean onBeforeResourceLoad(CefBrowser browser, CefFrame frame, CefRequest request) {
        String url = request.getURL();
        table.put(url, System.currentTimeMillis());
        return false;
    }
    
    // 这里省略其它接口实现代码
}

在JCEF初始化时,需要把RequestHandler添加进去。

public class BrowserCef extends JFrame {

    private CefApp cefApp_;
    private CefClient client_;
    // 省略的代码
    private void initCef() {
        try {
            CefAppBuilder builder = new CefAppBuilder();
            builder.getCefSettings().cache_path = cachePath.getAbsolutePath();
            // 远程调试http://127.0.0.1:9999/,支持selenium
            // builder.getCefSettings().remote_debugging_port = 9999;
            builder.getCefSettings().windowless_rendering_enabled = false;
            builder.setAppHandler(new MavenCefAppHandlerAdapter() {
                @Override
                public void stateHasChanged(CefApp.CefAppState state) {
                    if (state == CefApp.CefAppState.TERMINATED) System.exit(0);
                }
            });
            cefApp_ = builder.build();
            client_ = cefApp_.createClient();
            // 监听页面资源请求
            client_.addRequestHandler(new RequestHandler(BrowserCef.this));
            // 省略的代码
    }

    public static void main(String[] args) {
        System.setProperty("file.encoding","UTF-8");
        System.setProperty("sun.java2d.dpiaware", "true");
        try {
            UIManager
                    .setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            EventQueue.invokeLater(() -> {
                try {
                    BrowserCef frame = new BrowserCef();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3、运行效果

先使用jcef访问所有网页,然后查看耗时

在访问时,会把资源的大小和加载时间保存到csv文件。

使用 excel打开这个文件,可以所有访问过的资源文件性能。

JCefB应用下载

相关推荐
尘浮生1 分钟前
Java项目实战II基于Spring Boot的光影视频平台(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·maven·intellij-idea
尚学教辅学习资料9 分钟前
基于SpringBoot的医药管理系统+LW示例参考
java·spring boot·后端·java毕业设计·医药管理
雷神乐乐25 分钟前
File.separator与File.separatorChar的区别
java·路径分隔符
小刘|30 分钟前
《Java 实现希尔排序:原理剖析与代码详解》
java·算法·排序算法
逊嘘1 小时前
【Java语言】抽象类与接口
java·开发语言·jvm
morris1311 小时前
【SpringBoot】Xss的常见攻击方式与防御手段
java·spring boot·xss·csp
七星静香1 小时前
laravel chunkById 分块查询 使用时的问题
java·前端·laravel
Jacob程序员1 小时前
java导出word文件(手绘)
java·开发语言·word
ZHOUPUYU1 小时前
IntelliJ IDEA超详细下载安装教程(附安装包)
java·ide·intellij-idea