javascript - 无法获取元数据选择器文本
问题描述
这是对 节点 js puppeteer 元数据的重复问题 在撰写此问题时,我没有足够的声誉来评论这个问题。我正在为一个项目编写一些测试脚本,我想测试一些 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'
});
});
任何帮助将不胜感激,我不知道如何将这个问题附加到前一个问题而不发表评论,所以如果有人能启发我,我也将非常感激。谢谢。
解决方案
我相信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
要评估的函数之后将其传递给 , 的参数。另请参阅:文档
至于page.$eval
,它返回空字符串,因为textContent
元标记中没有,你需要使用content
:
page.$eval(DESCRIPTION_SELECTOR, element => element.content)
推荐阅读
- arrays - 如果 NSDecimalNumber 大于 Uint64,如何将 NSDecimalNumber 转换为字节数组?
- python - 列出所有 QtreeWidget 层次结构
- python - 为什么 pip 在它已经是最新的时候要求我升级?
- loops - Arduino中的游戏功能
- c# - 使用非托管可执行文件时设置 ServicePointManager.SecurityProcol 的正确方法
- java - 循环转发的问题
- android - View.setX 阻止 adjustPan 工作
- angular - 如何让 Bamboo 识别 Angular 单元测试
- java - 等于字符串和列表中的方法使用
- java - Vertx Rx-Java:eventBus 订阅者被取消订阅的原因