puppeteer学习笔记(五)--API问题解决--使用功能强大的“ eval ”函数

  1. 官方英文版API入口(如果你英文好的话):https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md.
  2. 汉化版API入口(网上有很多版本,有兴趣可以多去搜一些):https://yq.aliyun.com/articles/607102.

首先看一段中文版API的解释:

在这里插入图片描述

更多我就我解释了,官方和中文版的API已经很详细了,
接下来我就上一个例子来介绍常用的功能:
新建eval.html

<!DOCTYPE html>
<html>
<head>
    <title>eval-demo</title>
</head>
<body>
    <input type="text" value="第一次输入内容" id="input_01">
    <input type="text" value="第二次输入内容" id="input_02">
    <a href="https://www.baidu.com/" style="padding-left: 50px" id="click">点击进入百度</a>
    <hr>
    <div id="div_text"  style="height: 200px;width: 150px;overflow: auto;" >
        <p>
                    page.$eval(selector, pageFunction[, ...args])
        selector <string> 一个selector查询页面page
        pageFunction <function> 在浏览器上下文中求值函数
        ...args <...Serializable|JSHandle> 传递给pageFunction的参数
        returns: <Promise<Serializable>> Promise解析为pageFunction的返回值
        该方法在页面内运行document.querySelector,并将其作为第一个参数传递给pageFunction。 如果没有与selector匹配的元素,则该方法将引发错误。
        如果pageFunction返回一个Promise,那么page.$eval会等待承诺解析并返回它的值。
        Examples:
        </p>
    </div>
</body>
</html>

新建demo.js 文件

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({headless:false});
  const page = await browser.newPage();
  //goto里面的网址记得换成自己的
  await page.goto('file:///MAC/Study/27.Puppeteer/case/eval.html');

  // 点击元素
  await page.waitFor(3000);
  await page.$eval('#click',a => a.click() );
  await page.waitFor(2000);
  await page.goBack();
  //清空输入框的值
  await page.$eval('#input_01',input => input.value='' );
  // 清空输入框的值,并且输入新的值
  await page.$eval('#input_02',input => input.value='清空原来的值,输入新的' );
  // 得到标签之间的文本
  const a_text = await page.$eval('#click',a => a.innerText );
  console.log(a_text);
  // 得到标签内部的属性值
  const div_text = await page.$eval('#div_text',div => div.id );//得到div标签id的值
  console.log(div_text);
  const a_link = await page.$eval('#click',a => a.href );//得到a标签href的值
  console.log(a_link);
  const input_value = await page.$eval('#input_02',input => input.value );//得到input标签value的值
  console.log(input_value);
  // 得到整个HTML标签的所有内容
  const html = await page.$eval('#input_02',input => input.outerHTML );//得到input标签value的值
  console.log(html);

  // 移动div内嵌式滚动条,多种方式
  // 1、可以同时左右移动和上下  的,第一个参数是控制左右移动的值,第二个参数是控制上下移动的值
  await page.$eval('#div_text',div => div.scrollTo(1000,1000) );
  // 2、只上下移动和只是左右移动
  await page.waitFor(2000);
  await page.$eval('#div_text',div => div.scrollTop=10 );//上下移动
  await page.$eval('#div_text',div => div.scrollLeft=10 );//左右移动

  //移除标签的属性
  await page.$eval('#div_text',div => div.removeAttribute('id') );//移除div中id的值
  // 更改标签中属性的值
  await page.$eval('#input_02',div => div.setAttribute('value','test') );//更改div中class的值
  // 如果标签没有该属性,就会新增这个属性
  await page.$eval('#input_02',div => div.setAttribute('class','test') );//更改div中class的值

  // 等待3秒后退出浏览器
  await page.waitFor(3000);
  await browser.close();
})();

好啦脚本和html文件已经创建好啦,自己运行看下效果,接下来就开始进行分析啦:

1、点击元素,这个好像没什么用呢,puppeteer自带的就有tap()和click()函数

  // 点击元素
  await page.waitFor(3000);
  await page.$eval('#click',a => a.click() );

2、清空输入框的值、在puppeteer中type()函数是不清空的输入,有时候想要清空一个文本在输入,这个时候就派上用场了。

  //清空输入框的值
  await page.$eval('#input_01',input => input.value='' );

3、清空输入框并且 输入一个新的值,和第二个语法一样,只是在value后面加入要输入的值

  // 清空输入框的值,并且输入新的值
  await page.$eval('#input_02',input => input.value='清空原来的值,输入新的' );

4、UI自动化中断言需要得到页面的文本进行对比,来判断是否通过,框架里面好像没有得到文本的函数呢

  // 得到标签之间的文本
 const a_text = await page.$eval('#click',a => a.innerText );
 console.log(a_text);//打印出文本

5、得到标签内部的属性值,如果想要用的话

  // 得到标签内部的属性值
const div_text = await page.$eval('#div_text',div => div.id );//得到div标签id的值
console.log(div_text);
const a_link = await page.$eval('#click',a => a.href );//得到a标签href的值
console.log(a_link);
const input_value = await page.$eval('#input_02',input => input.value );//得到input标签value的值
console.log(input_value);

6、得到整个HTML标签的所有内容

  // 得到整个HTML标签的所有内容
const html = await page.$eval('#input_02',input => input.outerHTML );//得到input标签value的值
console.log(html);

7、移动div内嵌式滚动条,好多的元素必须移动滚动条才能显示出来,进行操作,这时候就会派上用场了,三种移动方式,最常用的是第一种

  // 移动div内嵌式滚动条,多种方式
// 1、可以同时左右移动和上下  的,第一个参数是控制左右移动的值,第二个参数是控制上下移动的值
await page.$eval('#div_text',div => div.scrollTo(1000,1000) );
// 2、只上下移动和只是左右移动
await page.waitFor(2000);
await page.$eval('#div_text',div => div.scrollTop=10 );//上下移动
await page.$eval('#div_text',div => div.scrollLeft=10 );//左右移动

8、第7个是div内嵌式滚动条,但有时候滚动条是全页面的不是某个标签的,这个时候就不能用上面这个函数了,需要另外一个函数evaluate(),重新写一个百度的脚本,参数和第7个的一样,自己可以试着运行下

const puppeteer = require('puppeteer');

(async () => {
const browser = await puppeteer.launch({headless:false});
const page = await browser.newPage();
await page.goto('https://www.baidu.com/');
await page.setViewport({height:400,width:500});//设置成小窗口模式
// 1、可以同时左右移动和上下的,第一个参数是控制左右移动的值,第二个参数是控制上下移动的值
await page.waitFor(2000);
await page.evaluate(() => window.scrollTo(1000,1000) );
//等待3秒后退出浏览器
await page.waitFor(2000);
await browser.close();
})();

9、操作标签的属性:移除、修改、增加

  //移除标签的属性
  await page.$eval('#div_text',div => div.removeAttribute('id') );//移除div中id的值
  // 更改标签中属性的值
  await page.$eval('#input_02',div => div.setAttribute('value','test') );//更改div中class的值
  // 如果标签没有该属性,就会新增这个属性
  await page.$eval('#input_02',div => div.setAttribute('class','test') );//位input标签新增class的属性和值

现在经常用的是这几个,当然如果想要用其他的可以去了解一下,我这边就不过多介绍了

地址:打开谷歌的F12开发者模式,进入console控制台进行查看有更多的操作,所有的API都可以看到。


image
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • HTML标签解释大全 一、HTML标记 标签:!DOCTYPE 说明:指定了 HTML 文档遵循的文档类型定义(D...
    米塔塔阅读 3,172评论 1 41
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,613评论 4 59
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,104评论 1 45
  • 徵招 樓陰霧裏才明滅,故園此時安謐。野樹亂枯藤,木窗連橫石。傷心成小立。算時序、流年稍易。數點飛奴,幾行車馬,心期...
    酒客背寒南山死阅读 602评论 0 2
  • 今天看到一段话:“容易被激怒的,大多是弱者,因为弱者才会逞强,强者往往懂得示弱 。同理,刻薄是因为底子薄,尖酸是因...
    水默雪岭阅读 179评论 0 0