evaluate
功能
您可以通过动态脚本 using evaluate
.
(async function(){
var puppeteer = require('puppeteer');
const browser = await puppeteer.launch();
const page = await browser.newPage();
var functionToInject = function(){
return window.navigator.appName;
}
var data = await page.evaluate(functionToInject); // <-- Just pass the function
console.log(data); // outputs: Netscape
await browser.close();
})()
addScriptTag
and readFileSync
您可以将该函数保存到单独的文件中并使用该函数addScriptTag
.
await page.addScriptTag({path: 'my-script.js'});
or evaluate
with readFileSync
.
await page.evaluate(fs.readFileSync(filePath, 'utf8'));
或者,将参数化函数作为字符串传递给page.evaluate
.
await page.evaluate(new Function('foo', 'console.log(foo);'), {foo: 'bar'});
动态创建一个新函数
怎么样把它变成一个runnable
功能:D?
function runnable(fn) {
return new Function("arguments", `return ${fn.toString()}(arguments)`);
}
上面将使用提供的参数创建一个新函数。我们可以传递任何我们想要的函数。
比如下面的函数window
,连同参数,
function functionToInject() {
return window.location.href;
};
也能完美地履行诺言,
function functionToInject() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(window.location.href);
}, 5000);
});
}
并有论据,
async function functionToInject(someargs) {
return someargs; // {bar: 'foo'}
};
调用所需的函数evaluate
,
var data = await page.evaluate(runnable(functionToInject), {bar: "foo"});
console.log(data); // shows the location