javascript - 无法获取元数据选择器文本

标签 javascript css-selectors mocha.js chai puppeteer

这是一个重复的问题 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'

    });
});

任何帮助将不胜感激,我不知道如何将这个问题附加到前一个问题而不发表评论,所以如果有人能启发我,我也将非常感激。谢谢。

最佳答案

我相信 console.log 将为空,因为 DESCRIPTION_SELECTORpage.evaluate 内部未定义。

为了使用 page.evaluate 内主脚本中的变量,必须将其显式传递到评估函数中:

await page.evaluate(DESCRIPTION_SELECTOR => document.querySelectorAll(DESCRIPTION_SELECTOR), DESCRIPTION_SELECTOR);

这是因为 page.evaluate 在一种沙箱中运行,只能访问由 puppeteer 打开的网页中声明的函数和变量(所谓的“页面上下文”)。由于该页面没有 DESCRIPTION_SELECTOR,因此我们必须在要评估的函数之后将其传递到 page.evaluate 的参数中。另请参阅:documentation

对于page.$eval,它返回空字符串,因为meta标签中没有textContent,您只需使用content :

page.$eval(DESCRIPTION_SELECTOR, element => element.content)

关于javascript - 无法获取元数据选择器文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55845289/

相关文章:

css - 选择具有不同类型 child 的最后一个 child

javascript - JQuery 生成同级元素,然后一次性追加所有元素

javascript - 在对象内设置超时函数

javascript - 如何使用 jQuery .html() 保留换行符和转义斜线

html - 带有只读属性选择器的 Chrome 中的奇怪样式行为

Javascript:具有明显相等值的断言导致不同

javascript - jQuery - 单击复选框添加类和删除类

html - 相邻的同级选择器对我的标记不起作用

javascript - stub 不返回 proxyquire 中的解析数据变得未定义

node.js - 用 mocha 和 chai 测试 node.js