我直接使用 chrome puppeteer 库来运行浏览器集成测试。我现在在单个文件中编写了一些测试。有没有办法并行运行它们?实现这一目标的最佳方法是什么?
4 回答
要并行运行 puppeteer 实例,您可以查看我写的这个库:puppeteer-cluster
它有助于在多个浏览器、上下文或页面中并行运行不同的 puppeteer 任务,并处理错误和浏览器崩溃。这是一个最小的例子:
const { Cluster } = require('puppeteer-cluster');
(async () => {
const cluster = await Cluster.launch({
concurrency: Cluster.CONCURRENCY_CONTEXT, // use one browser per worker
maxConcurrency: 4, // cluster with four workers
});
// Define a task to be executed for your data
cluster.task(async ({ page, data: url }) => {
await page.goto(url);
const screen = await page.screenshot();
// ...
});
// Queue URLs
cluster.queue('http://www.google.com/');
cluster.queue('http://www.wikipedia.org/');
// ...
// Wait for cluster to idle and close it
await cluster.idle();
await cluster.close();
})();
您也可以像这样直接对函数进行排队:
const cluster = await Cluster.launch(...);
cluster.queue(async ({ page }) => {
await page.goto('http://www.wikipedia.org');
await page.screenshot({path: 'wikipedia.png'});
});
cluster.queue(async ({ page }) => {
await page.goto('https://www.google.com/');
const pageTitle = await page.evaluate(() => document.title);
// ...
});
cluster.queue(async ({ page }) => {
await page.goto('https://www.example.com/');
// ...
});
// My tests contain about 30 pages I want to test in parallel
const aBunchOfUrls = [
{
desc: 'Name of test #1',
url: SOME_URL,
},
{
desc: 'Name of test #2',
url: ANOTHER_URL,
},
// ... snip ...
];
const browserPromise = puppeteer.launch();
// These test pass! And rather quickly. Slowest link is the backend server.
// They're running concurrently, generating a new page within the same browser instance
describe('Generate about 20 parallel page tests', () => {
aBunchOfUrls.forEach((testObj, idx) => {
it.concurrent(testObj.desc, async () => {
const browser = await browserPromise;
const page = await browser.newPage();
await page.goto(testObj.url, { waitUntil: 'networkidle' });
await page.waitForSelector('#content');
// assert things..
});
});
});
来自https://github.com/GoogleChrome/puppeteer/issues/474
写的https://github.com/quicksnap
正如您已经完成的那样,我如何做到这一点是在单个文件中创建您的测试套件。然后创建一个testSuiteRunner.js
文件(或任何你想调用的文件)并按如下方式进行设置:
require('path/to/test/suite/1);
require('path/to/test/suite/2);
require('path/to/test/suite/3);
...
使用上述语句导入所有套件(require
无需为它们提供const
变量名称或类似名称),然后您可以使用它node ./path/to/testSuiteRunner.js
来并行执行所有套件。我能想出的最简单的解决方案!
我认为最好的办法是使用像 Jest 这样的测试运行器,它可以为你管理。至少我是这样做的。请记住,如果您同时运行太多 Chrome 实例,机器可能会爆炸,因此将并行测试的数量限制在 2 个左右是安全的。
不幸的是,官方文档中没有明确描述 Jest 如何并行测试。您可能会发现这个https://github.com/facebook/jest/issues/6957很有用。
图书馆puppeteer-cluster
很棒,但首先要记住你想要并行测试,而不是 puppeteer 的任务。