这是一个重复的问题 node js puppeteer metadata 在撰写此问题时,我没有足够的声誉来评论这个问题。 我正在为一个项目编写一些测试脚本,并且想测试一些seo元数据标签。
我在chrome开发工具中检查了选择器,效果很好。
document.querySelectorAll("head > meta[name='description']")[0].content;
我收到数据没问题
但是当我尝试使其在测试脚本中运行时,我似乎无法掌握选择器。
describe('guest jobs page', function () {
const {expect} = require('chai');
let page;
before(async function () {
page = await browser.newPage();
await page.goto('https://page');
});
after(async function () {
await page.close();
})
it('should have the correct page title', async function () {
expect(await page.title()).to.eql('page - Jobs');
});
it('should have the correct page description', async function () {
const DESCRIPTION_SELECTOR = "head > meta[name='description']";
await console.log( await page.evaluate((DESCRIPTION_SELECTOR) => document.querySelectorAll(DESCRIPTION_SELECTOR)));
expect(await page.$eval(DESCRIPTION_SELECTOR, element => element.textContent)).to.eql('page description content');
//this fails as no content is returned
//AssertionError: expected '' to deeply equal 'page description content'
});
});
任何帮助将不胜感激,我不知道如何在不加评论的情况下将这个问题附加到上一个问题,因此,如果有人能启发我,我也将不胜感激。谢谢。
答案 0 :(得分:1)
我相信console.log
将为空,因为DESCRIPTION_SELECTOR
内的page.evaluate
未定义。
要在page.evaluate
内部使用主脚本中的变量,必须将其显式传递给评估函数:
await page.evaluate(DESCRIPTION_SELECTOR => document.querySelectorAll(DESCRIPTION_SELECTOR), DESCRIPTION_SELECTOR);
这是因为page.evaluate
在一种沙箱中运行,并且只能访问在puppeteer
打开的网页上声明的函数和变量(所谓的“页面上下文”)。由于该页面没有DESCRIPTION_SELECTOR
,因此必须在要评估的函数之后,将其传递到page.evaluate
的参数中。另请参阅:documentation
对于page.$eval
,由于元标记中没有textContent
,它返回空字符串,您只需要使用content
:
page.$eval(DESCRIPTION_SELECTOR, element => element.content)