将Class作为参数传递给page.e在Puppeteer中评估

时间:2018-07-16 06:59:00

标签: javascript puppeteer

在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);
})();

2 个答案:

答案 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);