es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error no capturado: Evaluación fallida: ReferenceError: lineBaseSelector no está definido.

(async () => {

        await global.initialize();

        let lineCount = await global.count();
        let globalData = [];
        let childNum = null;
        let lineBaseSelector = null;


        for(let i = 1; i < lineCount; i++)
        {
            childNum = i + 1;
            lineBaseSelector = '#alx-content > div.row-fluid.TopSites.AlexaTool.padding20 > section.page-product-content.summary.padding20 > span > span > div > div > div > div:nth-child(' + `${childNum}` + ')';
            let details = await global.getDetails(lineBaseSelector);
            globalData.push(details);
        }

global.js

getDetails: async (lineBaseSelector) => {

        let url = await page.url();

        await page.waitForSelector(lineBaseSelector);

        let details = await page.evaluate(() => {
            return {
                rank: document.querySelector('div[class="td"]').innerText,
                name: document.querySelector('p > a').innerText,
                url: document.querySelector('p > a').getAttribute('href')
            }
        });

        return details;

    },

El selector “lineBaseSelector” cambia dinámicamente y quiero obtener todos los datos que pertenecen a estos selectores como una lista. Pero la lista de datos que obtengo consiste solo en el primer dato. Hay 50 datos pero solo puedo obtener el primero 50 veces. También intenté cambiar el querySelector a “”rank: document.querySelector(lineBaseSelector + ‘div[class=”td”]’).innerText,“”, pero tuve un error llamado Uncaught Error: Evaluation failed: ReferenceError: lineBaseSelector is not defined. Por favor, ayúdame a resolver esto. Muchas gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema parece ser que la variable lineBaseSelector no se está pasando correctamente a la función evaluate(). Una solución podría ser pasarla como argumento a la función, de esta manera:

    getDetails: async (lineBaseSelector) => {
    
        let url = await page.url();
    
        await page.waitForSelector(lineBaseSelector);
    
        let details = await page.evaluate((selector) => {
            return {
                rank: document.querySelector(selector + ' div[class="td"]').innerText,
                name: document.querySelector(selector + ' p > a').innerText,
                url: document.querySelector(selector + ' p > a').getAttribute('href')
            }
        }, lineBaseSelector);
    
        return details;
    
    },
    

    De esta forma, la variable lineBaseSelector se pasa como argumento selector a la función evaluate(), y se puede utilizar para seleccionar dinámicamente los elementos.

    Alternativamente, también podrías intentar usar interpolación de cadenas para concatenar directamente la variable lineBaseSelector en los métodos querySelector(), de la siguiente manera:

    getDetails: async (lineBaseSelector) => {
    
        let url = await page.url();
    
        await page.waitForSelector(lineBaseSelector);
    
        let details = await page.evaluate(() => {
            return {
                rank: document.querySelector(`${lineBaseSelector} div[class="td"]`).innerText,
                name: document.querySelector(`${lineBaseSelector} p > a`).innerText,
                url: document.querySelector(`${lineBaseSelector} p > a`).getAttribute('href')
            }
        });
    
        return details;
    
    },
    

    De esta forma, la variable lineBaseSelector se interpola directamente en los métodos querySelector() utilizando las comillas invertidas y la sintaxis ${}.

    ¡Prueba una de estas soluciones y ve si resuelven tu problema!

Comments are closed.