8

我在 Puppeteer 的帮助下编写了一个小型爬虫。现在我面临的挑战是我的测试相当慢(每次测试> 3 秒)。我已经能够追踪到launchPuppeteer 的功能Istanbul/nyc的使用。

  • 如果我只用 运行测试mocha,测试将在 400 毫秒内完成。
  • 但如果我另外使用nyc,测试的持续时间超过 3000 毫秒

我正在使用的只是

'use strict';
const puppeteer = require('puppeteer');


module.exports = async function startBrowser() {
  const options = {
    args: [
      // '--no-sandbox',
      // '--disable-setuid-sandbox',
      // '--disable-dev-shm-usage',
      // '--disable-accelerated-2d-canvas',
      // '--disable-gpu'
    ],
    headless: false // true
  };

  return await puppeteer.launch(options);
};

这是我正在使用的测试:

'use strict';
/* global describe: false, before: false, it: false,
    beforeEach: false, afterEach: false, after: false, window: false, document: false */

const assert = require('assert').strict;
const startBrowser = require('../');
const util = require('util');



describe('Puppeteer', function() {
  let pageManager;

  it('start the browser', async function() {
    this.timeout(10000);

    console.time('startBrowser');
    const browser = await startBrowser();
    console.timeEnd('startBrowser');
    assert(browser);

    console.time('closeBrowser');
    await browser.close();
    console.timeEnd('closeBrowser');
  });

});

我已经使用此代码创建了一个存储库并在此处进行测试。 nyc _mocha ./test/*.test.js运行时间约为 3500 毫秒,mocha ./test/*.test.js仅需 130 毫秒。

到目前为止我已经尝试过:

  • 包含/排除 nyc 标志的不同组合
  • 更新到最新版本的 Puppeteer、nyc 和 mocha
  • 删除我的 Puppeteer 参数
  • 搜索 Puppeteer & Istanbul 相关问题(没有多大成功)
  • headless: true
  • 绕过所有代理,请参阅这个 puppeteer 问题

我该怎么做才能让覆盖测试与单独的测试一样快?

使用:

  • Ubuntu 19.04
  • 节点.js 10.15.3
4

3 回答 3

4

我已经开始调试 Puppeteer,这些是我的发现:

  • Puppeteer 不出所料地child_process.spawn()用于生成新的浏览器
  • nyc用于spawn-wrap此类子进程
  • spawn-wrap正在将整个可执行文件 ( ./node_modules/puppeteer/.local-chromium/linux-686378/chrome-linux/chrome) 读入内存,fs.readFileSync这需要很长时间才能完成

spawn-wraps README 提供了某种解释:

初始包装调用使用同步 I/O。无论如何,您可能不应该在任何生产环境中使用此脚本。此外,这将大大减慢子进程的执行速度,因为我们添加了几层间接。

就我个人而言,答案是,只要我使用nyc/ ,无论有无代码覆盖,我都无法获得相同的运行测试性能istanbul

我试c8了一下,性能几乎一样,我仍然可以有代码覆盖率。

于 2019-10-28T16:01:30.177 回答
3

在此处输入图像描述请也试试这个。

'use strict'
const puppeteer = require('puppeteer')

module.exports = async function startBrowser() {
  const options = {
    args: [
      '--no-sandbox',
      '--disable-setuid-sandbox',
      '--disable-dev-shm-usage',
      '--disable-accelerated-2d-canvas',
      '--no-first-run',
      '--no-zygote',
      '--single-process', // <- this one doesn't works in Windows
      '--disable-gpu'
    ],
    headless: true
  }

  return await puppeteer.launch(options)
}
于 2019-10-28T08:37:11.027 回答
0
  1. ./Chromium --headless --disable-gpu --remote-debugging-port=9222 --devtools=false
  2. browser = await puppeteer.connect({ browserWSEndpoint: 'ws://127.0.0.1:9222/devtools/browser/........xxxxxx..', });
  3. 使用快递来持有它

PS:但是,我不能指定 browserWSEndpoint 每次 Chromium --headless restart 改变 url

于 2021-03-18T13:59:16.113 回答