You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行Protractor测试时捕获Chrome堆快照仅含测试信息如何解决

问题根因

你之前使用的heapdump、v8-profiler-next均为Node.js环境的堆抓取工具,只能捕获运行Protractor测试脚本的Node进程内存数据,而目标应用的JS逻辑、类、实例都运行在Chrome浏览器的渲染进程中,两个运行时完全隔离,因此抓取的快照里只会有测试逻辑相关内容,不会包含应用侧数据。

可行解决方案

通过Chrome DevTools Protocol(CDP)直接和运行目标应用的Chrome进程通信,调用CDP的HeapProfiler域接口抓取浏览器侧的堆快照,Protractor本身支持直接对接Chrome的CDP能力,无需复杂改造:

  • 第一步修改protractor.conf.js配置,开启Chrome远程调试端口:
exports.config = {
  // 其余原有配置保持不变
  capabilities: {
    browserName: 'chrome',
    chromeOptions: {
      args: ['--remote-debugging-port=9222']
    }
  }
}
  • 第二步封装堆快照抓取方法,Protractor v6及以上版本可直接使用内置的DevTools能力:
const fs = require('fs');

async function takeHeapSnapshot(savePath) {
  const devTools = await browser.driver.getDevTools();
  await devTools.send('HeapProfiler.enable');
  
  const snapshotChunks = [];
  // 监听快照分块数据返回
  devTools.on('HeapProfiler.addHeapSnapshotChunk', (params) => {
    snapshotChunks.push(params.chunk);
  });

  // 触发堆快照生成
  await devTools.send('HeapProfiler.takeHeapSnapshot', { reportProgress: false });
  await devTools.send('HeapProfiler.disable');

  // 拼接完整快照写入本地文件
  const fullSnapshot = snapshotChunks.join('');
  fs.writeFileSync(savePath, fullSnapshot);
}
  • 第三步在测试流程中插入快照抓取节点:
describe('应用内存对比测试', () => {
  it('操作前后堆快照校验', async () => {
    await browser.get('你的目标应用访问地址');
    // 操作前主动触发垃圾回收,避免临时对象干扰
    const devTools = await browser.driver.getDevTools();
    await devTools.send('HeapProfiler.collectGarbage');
    // 生成第一份快照
    await takeHeapSnapshot('./before-operate.heapsnapshot');

    // 此处插入你要执行的测试操作逻辑
    await element(by.css('#test-btn')).click();
    await element(by.css('#input-box')).sendKeys('测试内容');
    await browser.sleep(1000);

    // 操作后再次触发垃圾回收
    await devTools.send('HeapProfiler.collectGarbage');
    // 生成第二份快照
    await takeHeapSnapshot('./after-operate.heapsnapshot');
  });
});
  • 生成的两份.heapsnapshot文件可以直接导入Chrome DevTools的Memory标签页,选择「对比」模式即可查看应用侧对象、类、DOM节点的增减情况,所有应用相关数据都会完整保留。
注意事项
  • 快照生成过程中不要执行额外的页面操作,避免快照数据异常
  • 如果使用低于v6版本的Protractor,可以引入chrome-remote-interface库对接9222调试端口实现相同的快照抓取逻辑

内容的提问来源于stack exchange,提问作者DDana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 00:54:03