在Puppeteer中,如果我将类作为参数传递,则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 :(得分:2)
如果您尝试传递函数,则会出现类似的问题。我见过人们对函数进行字符串化处理以将其传递给puppeteer使其起作用,因此在您的情况下,我将使用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 :(得分:1)
通过将对象的实例(而不是对象本身)传递给eval()
,可以避免使用page.evaluate()
:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.2/css/bootstrap.min.css">
<div id="timeselector" class="btn-group btn-group-toggle" data-toggle="buttons">
<label class="btn btn-secondary active ">
<input type="radio" name="options" id="sec" autocomplete="off" checked>Second
</label>
<label class="btn btn-secondary">
<input type="radio" name="options" id="min" autocomplete="off">Minute
</label>
<label class="btn btn-secondary">
<input type="radio" name="options" id="hr" autocomplete="off">Hour
</label>
</div>
您的完整程序应如下所示:
await page.evaluate(object => {
console.log(object.a);
}, new SomeClass);