Saltar al contenido

¿Cómo usar xpath en Chrome sin cabeza + evaluación de titiritero ()?

Esta es la contestación más correcta que encomtrarás aportar, pero primero obsérvala detenidamente y analiza si es compatible a tu trabajo.

Solución:

$x() no es un método estándar de JavaScript para seleccionar elementos por XPath. $x() es solo un ayudante en Chrome devtools. Afirman esto en la documentación:

Nota: esta API solo está disponible desde la propia consola. No puede acceder a la API de línea de comandos desde los scripts de la página.

Y page.evaluate() se trata aquí como “guiones en la página”.

Tienes dos opciones:

  1. Usar document.evaluate

Aquí hay un ejemplo de selección de elemento (artículo destacado) dentro page.evaluate():

const puppeteer = require('puppeteer');

(async () => 
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://en.wikipedia.org',  waitUntil: 'networkidle2' );

    const text = await page.evaluate(() => 
        // $x() is not a JS standard -
        // this is only sugar syntax in chrome devtools
        // use document.evaluate()
        const featureArticle = document
            .evaluate(
                '//*[@id="mp-tfa"]',
                document,
                null,
                XPathResult.FIRST_ORDERED_NODE_TYPE,
                null
            )
            .singleNodeValue;

        return featureArticle.textContent;
    );

    console.log(text);
    await browser.close();
)();
  1. Seleccionar elemento por Titiritero page.$x() y pásalo a page.evaluate()

Este ejemplo logra los mismos resultados que en el ejemplo 1.:

const puppeteer = require('puppeteer');

(async () => 
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://en.wikipedia.org',  waitUntil: 'networkidle2' );

    // await page.$x() returns array of ElementHandle
    // we are only interested in the first element
    const featureArticle = (await page.$x('//*[@id="mp-tfa"]'))[0];
    // the same as:
    // const featureArticle = await page.$('#mp-tfa');

    const text = await page.evaluate(el => 
        // do what you want with featureArticle in page.evaluate
        return el.textContent;
    , featureArticle);

    console.log(text);
    await browser.close();
)();

Aquí hay una pregunta relacionada con cómo inyectar $x() función auxiliar para sus scripts.

Te mostramos comentarios y calificaciones

Tienes la opción de añadir valor a nuestro contenido informacional colaborando tu experiencia en las acotaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *