Как использовать мой существующий funciton global.parseData (id, name, url) в `await page.evaluate (indexTotal => {` в Puppeteer? - PullRequest
0 голосов
/ 21 сентября 2019

СИТУАЦИЯ:

Мне удалось использовать переменную indexTotal внутри страницы. Оценить контекст следующим образом:

var indexTotal = ...
(do something with indexTotal)

const thedata = await page.evaluate(indexTotal => {

 }, indexTotal).catch( error => {
                        console.log("ERROR: "+error);
                    });

ПРОБЛЕМА:

Но когда дело доходит до global.parseData, я получаю следующую ошибку:

Unexpected token .

для этого кода:

const thedata = await page.evaluate((global.parseData(id,name,url)) => {

 }, (global.parseData(id,name,url))).catch( error => {
                        console.log("ERROR: "+error);
                    });

ВОПРОС:

Каков правильный синтаксис для использования моей глобальной функции внутри page.evaluate?


РЕДАКТИРОВАТЬ:

getData.js

    getData: function() {

            let getData = async () => {
                url = 'url';

                await page.exposeFunction('parseData', (items2, items3, item2, ...) => global.parseData(items2, items3, item2, ...));

                const thedata = await page.evaluate( async() => {

                    var items = [];
                    var items2 = [];
                    var items3 = [];

                    $('.htmlElement').find('.childElements').each(function(ind) {
                        ...

                        var returnedObject = await window.parseData(items2, items3, item2, ...);

                        items.push(returnedObject.item);
                        items2 = returnedObject.items2;
                        items3 = returnedObject.items3;

                    });

                    var largeObject = {
                        items: items,
                        items2: items2,
                        items3: items3
                    }

                    console.log("RETURNED OBJECT: "+JSON.stringify(returnedObject));

                    return largeObject;

                }).catch( error => {
                    console.log("ERROR: "+error);
                });

                browser.close();
                return thedata;
            }

            getData().then(largeObject => {

                global.saveData(largeObject);

            });
    }

app.js

global.parseData = function(items2, items3, item2, ...) {

    ...


    if(!item2 || item2 == "") {
        ...
    }
    else {
        items2.push(item2);
        var item3 = ...;
        items3.push(item3);
    }

    var item = {
        ...
    }

    var largeObject = {
        item: item,
        items2: items2,
        items3: items3
    }

    console.log("LARGE OBJECT: "+JSON.stringify(largeObject));

    return largeObject;
}

CONSOLE.LOG OUTPUT:

RETURNED OBJECT: {}
LARGE OBJECT: {data}
RETURNED OBJECT: {}
RETURNED OBJECT: {}
RETURNED OBJECT: {}

1 Ответ

0 голосов
/ 21 сентября 2019

Проблема

Ошибка происходит из этой части кода:

page.evaluate((global.parseData(id,name,url)) //...

Вы должны сначала передать функцию в page.evaluate с аргументами.Здесь вы передаете смесь аргументов и вызовов функций.

Решение

Чтобы использовать функцию из вашей среды Node.js в контексте браузера, вам необходимо предоставить ее с помощью page.exposeFunction.

Пример кода

// expose the function to the page
await page.exposeFunction('parseData', (id, name, url) => {
    // do calculations
    return 'RESULT';
});

// Alternative: Call another function
await page.exposeFunction('parseData2', (id, name, url) => global.parseData(id,name,url));

// run code inside the page
await page.evaluate(async (indexTotal) => {
    // run code inside the page, set variables
    // ...
    const result = await window.parseData(id, name, url); // call your Node.js function
}, indexTotal);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...