PHP笔记网

革命尚未成功,同志仍须努力下载JDK17

作者:Albert.Wen  添加时间:2023-07-16 20:27:53  修改时间:2024-05-20 16:59:42  分类:02.数据采集/桌面自动化  编辑

前言

大家在学Selenium的时候,对于页面上的有些元素不好操作的时候,可以使用driver.execute_script()方法执行JavaScript脚本。

在Puppeteer中也有类似的方法,使用page.evaluate()执行JavaScript脚本。

page.evaluate()page.evaluateHandle()之间的唯一区别是page.evaluateHandle()返回JSHandle

  • page.evaluate():返回调用执行的结果
  • page.evaluateHandle():返回JSHandle

page.evaluate()

此方法返回evaluate() 返回执行JavaScript脚本的结果,使用示例

简单示例:

let res = await page.evaluate("1+2");
console.log(res); // 输出:3

也可以是执行一个函数:

let res = await page.evaluate(() => 'Hello World!');
console.log(res); // 输出:Hello World!

函数也可以带上参数:

let res = await page.evaluate(([a, b]) => a + b + ' World!', ['Hello ', 'xxx']);
console.log(res); // 输出:Hello xxx World!

如果传递给page.evaluate()的函数返回一个不可序列化的值,则page.evaluate()解析为undefined

 

【注意】传进去的参数 args 是个数组

let companyName = await ChromeHelper.evalJS(function(args) {
    //【注意】传进来的参数 args 是个数组
    return args;
}, 'albert');
console.log("【公司名】", companyName);

输出:

【公司名】 [ 'albert' ]

 

操作 web 网页示例

执行document.title获取页面的title

await page.goto("https://www.baidu.com/");
let title = await page.evaluate('document.title')
console.log(title); // 输出:百度一下,你就知道

登录网站示例

await page.goto("http://127.0.0.1/login.html");
await page.evaluate(function() {
    document.getElementById('username').value = 'albert';
    document.getElementById('password').value = '******';
    document.getElementById('loginBtn').click();
})

page.evaluate()方法一般用于页面上操作元素,无法正常操作的情况,可以用执行JavaScript脚本协助解决。

page.evaluate_handle()返回JSHandle

page.evaluate()page.evaluateHandle()之间的唯一区别是page.evaluateHandle()返回页内类型(JSHandle)

如果传给此方法的方法(参数)返回的是Promise对象,将等待promise完成并返回其返回值

也可以传一个字符串替代方法:

const aHandle = await page.evaluateHandle('document'); // 'document'对象

JSHandle 实例可以作为 page.evaluateHandle的参数:

const aHandle = await page.evaluateHandle(() => document.body);
const resultHandle = await page.evaluateHandle(body => body.innerHTML, aHandle);
console.log(await resultHandle.jsonValue());
await resultHandle.dispose();