Передайте класс в качестве аргумента для page.evaluate в Puppeteer

1

В Puppeteer page.evaluate выдает ошибку, если я page.evaluate класс в качестве аргумента.

Тем не менее, он работает для обычных объектов.

Есть ли способ обхода работы?

const puppeteer = require("puppeteer");

(async () => {
let browser = await puppeteer.launch({
    headless: true
});
let page = await browser.newPage();
class SomeClass {
    constructor() {
        this.a = 3;
    }
}
await page.evaluate((SomeClass) => {
    let object = new SomeClass();
    console.log(object.a);
}, SomeClass);
})();
  • 0
    Ответ зависит от того, как бы вы оценили класс ? Определите это и отредактируйте вопрос, включив эту информацию, и я помогу вам найти рабочее решение.
Теги:
puppeteer

2 ответа

1
Лучший ответ

Аналогичная проблема возникает, если вы попытаетесь передать функцию. Я видел, как люди строят функцию, чтобы передать ее кукловоду, чтобы она работала, поэтому в вашем случае я сделаю это, используя eval. Многие люди считают, что eval - это зло, возможно, есть лучший способ, но, по крайней мере, это возможное обходное решение.

class SomeClass {
    constructor() {
        this.a = 3;
    }
}    
await page.evaluate((strSomeClass) => {
    eval("window.SomeClass = " + strSomeClass);
    let object = new SomeClass();
    console.log(object.a);
}, SomeClass.toString());
1

Вы можете избежать использования eval(), передав экземпляр объекта, а не самого объекта, на page.evaluate():

await page.evaluate( object =>
{
    console.log( object.a );

}, new SomeClass );

Ваша полная программа должна выглядеть примерно так:

'use strict';

const puppeteer = require( 'puppeteer' );

( async () =>
{
    const browser = await puppeteer.launch (
    {
        'headless' : true
    });

    const page = await browser.newPage();

    class SomeClass
    {
        constructor ()
        {
            this.a = 3;
        }
    }

    await page.evaluate( object =>
    {
        console.log( object.a );

    }, new SomeClass );

    await browser.close();
})();
  • 0
    Это не будет работать в целом. Например, когда конструктор вызывает некоторую специфичную для браузера функцию, я должен создать экземпляр класса в браузере, а не в узле.
  • 1
    @yewang Он работает в подавляющем большинстве ситуаций для классов, которые имеют смысл передавать в среду Page DOM. Если конструктор вызывает функцию, специфичную для DOM страницы, то она действительно не должна быть доступна за пределами среды DOM страницы. То же самое можно сказать, если конструктор вызвал специфичную для Puppeteer функцию, которая была доступна только в среде Node.js. Поймите две разные среды и определите, как правильно структурировать свой класс.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню