Кукловод: используйте функцию внутри страницы. - PullRequest
0 голосов
/ 05 июня 2019

Мне нужно использовать функцию внутри page.evaluate с кукловодом. Я использую exposeFunction, и мне нужно отправить полный элемент в мою функцию

У меня есть простой пример:

const puppeteer = require('puppeteer');    

const myFunction = (content) => {
    console.log(content.outerHTML); // empty
}

(async () => {    
    const browser = await puppeteer.launch()     
    const page = await browser.newPage()  
    page.on('console', msg => console.log('PAGE LOG:', msg.text()));      

    const url =  "https://www.google.com";

    await page.goto(url,{
        waitUntil: 'networkidle2'
    })

    await page.exposeFunction('myFunction', myFunction);

    const content = await page.$('.content')

    await page.evaluate( (content) => {    

        myFunction (content); // I need to send full Element

        //console.log(content.outerHTML); // here works fine
        //my_function (JSON.stringify(content)); // sends {}

    }, content )      
})()

Я пытался отправить с JSON.stringify / JSON.parse безрезультатно.

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Краткий ответ: Вы не можете.

Длинный ответ: Вы не можете отправлять элементы DOM вне браузера через exposeFunction.

Кроме того, все, что вы отправляете, будет сериализовано, не может быть никаких циклических ссылок.NodeJS не имеет DOM.

Таким образом, решение состоит в том, чтобы

  • либо передавать только строку и объект без какой-либо циклической ссылки,
  • , либо использовать ElementHandle для кукловодовобрабатывать элементы.В вашем коде переменная content является ElementHandle.
0 голосов
/ 05 июня 2019

page.exposeFunction ограничено сериализованными данными, как уже указано в другом ответе.

Но вы можете определить функцию внутри блока page.execute. Имейте в виду, что определенные там функции будут присутствовать только в среде браузера, а не в вашем скрипте Node.js.

Пример кода

Следующий код реализует myFunction внутри функции evaluate и может быть использован ниже:

await page.evaluate((content) => {
    const myFunction = (content) => {
        return content.outerHTML;
    };

    const result = myFunction(content);
    return result; // or whatever you want to do with the result
}, content);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...