Не удается получить текст селектора метаданных - PullRequest
0 голосов
/ 25 апреля 2019

Это дублирующий вопрос к node js Метаданные кукловода На момент написания этого вопроса у меня не было достаточно репутации, чтобы комментировать вопрос.Я пишу несколько тестовых сценариев для проекта и хочу проверить некоторые теги метаданных 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'

    });
});

любая помощь будетЯ ценю, я не знаю, как прикрепить этот вопрос к предыдущему, не комментируя, поэтому, если бы кто-то мог просветить меня об этом, я также был бы очень благодарен.Благодарю.

1 Ответ

1 голос
/ 01 мая 2019

Я полагаю, что 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...