Github地址 github.com/GoogleChrom…
介绍
做爬虫或者是浏览器的自动化测试
环境
node v7.6及以上 node下载地址 nodejs.org/zh-cn/downl…
开始
npm i puppeteer
安装过程中会下载Chromium,可能会下载失败,可以跳过此步骤,然后自己下载。
npm i puppeteer --ignore-scripts
或者 设置环境变量
set PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
截图示例
新建一个app.js
const puppeteer = require('puppeteer')
(async ()=> {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://juejin.cn');
await page.screenshot({path: 'juejin.png'});
await browser.close()
})();
打开cmd执行
node app.js
puppeteer.launch()参数说明
- headless:是否显示浏览器窗口,默认true不显示
- executablePath:跳过下载Chromium时,需要使用此参数指定Chromium执行路径
- slowMo:执行操作间隔
- devtools:F12
Page介绍
- 选中某个元素 page.$(selector) , 执行的是 document.querySelector()
const SEARCH_BUTTON = '#search'
const btn = await page.$(SEARCH_BUTTON)
- 选中同类型的所有元素 page.?(selector) 执行的是 document.querySelectorAll()
const ITEMS = '.item'
const items = await page.?(ITEMS);
- 点击 page.click(selector[,options])
const SEARCH_BUTTON = '#search'
await page.click(SEARCH_BUTTON);
如果点击导致当前页面url发生了变化(hash变化待定)
const SEARCH_BUTTON = '#search'
await Promise.all([
page.waitForNavigation(),
page.click()
])
- 输入内容 page.type(selector,text[,options])
const SEARCH_BOX = '#search_box'
await page.type(SEARCH_BOX,'搜索内容')
- 元素出现在可视区域,并将鼠标移入(一般点击或者输入内容之前执行此操作) page.hover(selector)
const SEARCH_BUTTON = '#search_button'
await page.hover(SEARCH_BUTTON)
- 操作ua page.setUserAgent(ua) 一般会重写ua否则会过于明显
page.setUserAgent('Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36')
- 写入cookie page.setCookie(...cookies)
await page.setCookie(...[{name:'uid',value:'123456',domain:'.juejin.im'}])
- page.waitFor() 等待 一般用于延时
await page.waitFor(1000)
- 操作单个元素 page.$eval()
const searchVal = await page.$eval('#search_box',(el) => {el.value})
- 操作多个元素 page.?eval()
const len = await page.$$eval('a',elems => elems.length)
- page.evaluate()
const bodyHandle = await page.$('body')
const html = await page.evaluate(body => body.innerHTML,bodyHandle)
await bodyHandle.dispose()
- 访问页面 page.goto()
await page.goto('https://juejin.cn')
- request事件
await page.setRequestInterception(true);
page.on('request', interceptedRequest => {
if (interceptedRequest.url().endsWith('.png') || interceptedRequest.url().endsWith('.jpg'))
interceptedRequest.abort();
else
interceptedRequest.continue();
});
await page.goto('https://juejin.cn');
- response 事件
page.on('response', async (resp) => {
let status = resp.status()
let content = await resp.text()
});
键盘
模拟全选删除
await page.keyboard.down('ControlLeft');
await page.keyboard.down('KeyA');
await page.keyboard.up('KeyA');
await page.keyboard.up('ControlLeft');
await page.keyboard.press('Backspace');