我有问题。我是JavaScript新手,无法真正解决此错误。
我正在通过puppeteer从一个网站获取数据,然后我想测试它是否正确:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://6mr2n.csb.app/#');
header = await page.evaluate(() => {
header = document.querySelector('header[class="header"]').innerText;
return header;
});
console.info(`The header is: ${header}`);
await browser.close
module.exports = header;
})();
我的测试文件(笑话)是:
const index = require('./index');
test('Hallo', () => {
expect(index.header).toEqual('todos');
});
可能我只是愚蠢,但是我确实做了很多尝试来解决这个问题。运行主文件可以运行,但是运行测试(npm run test)可以得到以下结果:
expect(received).toEqual(expected) // deep equality
Expected: "todos"
Received: undefined
4 |
5 | test('Hallo', () => {
> 6 | expect(index.header).toEqual('todos');
| ^
7 | });
at Object.<anonymous> (index.test.js:6:26)
还有:
Cannot log after tests are done. Did you forget to wait for something async in your test?
Attempted to log "The header is: todos".
答案 0 :(得分:1)
您可以在操纵up的脚本中使用命名的异步函数(例如:header()
),该函数返回所需的标头值,并最终将其导出为module.exports.header = header
到主函数之外。
const puppeteer = require('puppeteer')
const header = async () => {
const browser = await puppeteer.launch()
const page = await browser.newPage()
await page.goto('https://6mr2n.csb.app/#')
const headerVal = await page.evaluate(() => {
headerVal = document.querySelector('header[class="header"]').innerText
return headerVal
})
await browser.close()
console.info(`The header is: ${headerVal}`)
return headerVal
}
module.exports.header = header
您的测试也需要异步功能,因此您可以等待它,例如:
const index = require('./index')
test('Hallo', async () => {
const headerVal = await index.header()
expect(headerVal).toEqual('todos')
})
注意::您需要browser.close()
才能关闭浏览器实例。
注释2:您也可以像这样检索innerText:
const headerVal = await page.evaluate(el => el.innerText, await page.$('.header'))
答案 1 :(得分:0)
您在module.exports
函数中设置了async
,但是require('./index')
不等待该设置并返回空对象。 (顺便说一句,您需要module.exports.header = header
才能使用index.header
)。
要解决此问题,您可以尝试返回Promise并等待它:
const puppeteer = require('puppeteer');
module.exports = (async () => { /* ... */ return header; })();
const headerPromise = require('./index');
(async function main() {
const header = await headerPromise;
test('Hallo', () => {
expect(header).toEqual('todos');
});
})();