javascript - Odovzdanie triedy ako argument do page.evaluate v Puppeteer
V Puppeteer, page.evaluate vyhodí chybu, ak ako argument odovzdám triedu.
Funguje to však pre bežné objekty.
Existuje nejaké obchádzkové riešenie, aby to fungovalo?
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);
})();
Odpoveď č. 1
Existuje podobný problém, ak sa pokúsite odovzdať funkciu. Videl som ľudí, ktorí funkciu prevádzali na reťazec, aby ju mohli odovzdať puppeteerovi, aby to fungovalo, takže vo vašom prípade by som to urobil pomocou eval. Mnoho ľudí si myslí, že eval je zlo, možno existuje lepší spôsob, ale aspoň je to možné obísť.
class SomeClass {
constructor() {
this.a = 3;
}
}
await page.evaluate((strSomeClass) => {
eval("window.SomeClass = " + strSomeClass);
let object = new SomeClass();
console.log(object.a);
}, SomeClass.toString());
Odpoveď č. 2
Použiť eval() môžete obísť tak, že do page.evaluate() odovzdáte inštanciu objektu, namiesto samotného objektu:
await page.evaluate(object => {
console.log(object.a);
}, new SomeClass);
Váš celý program by mal vyzerať nejako takto:
'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();
})();
