Функции Xpath не работают в драматурге - PullRequest
0 голосов
/ 26 января 2020

Playwright не работает должным образом, когда я пытаюсь использовать функции xpath.

Это код, который я написал для очистки текста внутри тега <h1> https://example.org.

const pw = require('playwright');

async function fetch(url) {
    var browser = await pw.chromium.launch();
    var context = await browser.newContext();
    var page = await context.newPage();
    await page.goto(url);
    const h1 = await page.$('//h1')
    console.log(await h1.evaluate(h1 => h1.innerHTML, h1));
    await browser.close();
}

fetch('https://example.com')

При выполнении этот код работает отлично и отображает:

Example Domain

Но если я попытаюсь получить текст внутри тега h1 с помощью функции xpath text(), как показано ниже,

const h1 = await page.$('//h1/text()'); // also tried await page.$('xpath=//h1/text()');
console.log(await h1.evaluate(h1 => h1.textContent, h1));

Это метание,

UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'evaluate' of null

Я делаю что-то не так или оно не работает с функциями xpath.

Ответы [ 2 ]

3 голосов
/ 27 января 2020

Как сказал Майкл, цель функции $ - вернуть элемент DOM. Если вы хотите оценить выражение XPath, вы можете использовать document.evaluate внутри функции evaluate.

async function fetch(url) {
    var browser = await playwright.chromium.launch();
    var context = await browser.newContext();
    var page = await context.newPage();
    await page.goto(url);
    console.log(await page.evaluate(() => 
        document.evaluate('//h1/text()', document, null, XPathResult.STRING_TYPE).stringValue));
    await browser.close();
}

fetch('https://example.com')
1 голос
/ 26 января 2020

Во-первых, text() на самом деле не функция. Это аббревиатура для шага оси child::text(), которая выбирает текстовые узлы содержащего элемента.

Выражение XPath работает отлично; это неверный код вызывающего приложения. Если ваше выражение XPath возвращает текстовые узлы, то приложение не может получить доступ к textContent, поскольку текстовые узлы не имеют свойства textContent. Это DOM для тебя ...

...