我有一个Node.js Mocha测试套件(我已经基于我试图为其创建自动化测试的真实应用程序创建了一个最小复制).
package.json
:
{
"name": "puppeteer-mocha-hang-repro",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"chai": "4.3.7",
"express": "4.18.2",
"mocha": "10.2.0",
"puppeteer": "19.6.2"
}
}
index.spec.js
:
const expect = require('chai').expect;
const express = require('express');
const puppeteer = require('puppeteer');
const webServerPort = 3001;
describe('test suite', function () {
this.timeout(10000);
let webServer;
let browser;
beforeEach(async () => {
// Start web server using Express
const app = express();
app.get('/', (_, res) => {
res.send('<html>Hello, World from the <span id="source">Express web server</span>!</html>');
});
webServer = app.listen(webServerPort, () => {
console.log(`Web server listening on port ${webServerPort}.`);
});
// Start browser using Puppeteer
browser = await puppeteer.launch();
console.log('Browser launched.');
});
afterEach(async () => {
// Stop browser
await browser.close();
console.log('Browser closed.');
// Stop web server
await webServer.close();
console.log('Web server closed.');
});
it('should work', async () => {
const page = await browser.newPage();
await page.goto(`http://localhost:${webServerPort}/`);
console.log('Went to root page of web server via Puppeteer.');
if (process.env['PARSE_PAGE'] === 'true') {
const sel = await page.waitForSelector('#source');
const text = await sel.evaluate(el => el.textContent);
console.log('According to Puppeteer, the text content of the #source element on the page is:', text);
expect(text).eql('Express web server');
}
await page.close();
console.log('Page closed.');
});
});
如果我使用命令npx mocha index.spec.js
运行测试套件,这将导致跳过第45-48行,测试套件通过,Mocha进程快速结束:
$ time npx mocha index.spec.js test suite Web server listening on port 3001. Browser launched. Went to root page of web server via Puppeteer. Page closed. ✔ should work (70ms) Browser closed. Web server closed. 1 passing (231ms) real 0m0.679s user 0m0.476s sys 0m0.159s
请注意,它以0.679秒结束.
如果我使用命令PARSE_PAGE=true npx mocha index.spec.js
运行它,这会导致我的任何代码都不会被跳过,测试很快就会通过,但进程会挂起大约30秒:
$ time PARSE_PAGE=true npx mocha index.spec.js test suite Web server listening on port 3001. Browser launched. Went to root page of web server via Puppeteer. According to Puppeteer, the text content of the #source element on the page is: Express web server Page closed. ✔ should work (79ms) Browser closed. Web server closed. 1 passing (236ms) real 0m30.631s user 0m0.582s sys 0m0.164s
请注意,它以30.631秒完成.
我怀疑这意味着我忘记了调用像close
这样的函数.但是,我在Express Web服务器、Puppeteer浏览器和Puppeteer页面上呼叫close
.我try 在不跳过sel
和text
这两个代码的情况下,对我使用的对象调用close
.但如果我try 这样做,我会收到错误消息,告诉我这些对象没有这样的功能.
系统详细信息:
$ node --version v18.13.0 $ npm --version 9.4.0 $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.1 LTS Release: 22.04 Codename: jammy $ uname -r 5.10.16.3-microsoft-standard-WSL