浏览器管理
使用 puppeteer 的第一步就是启动(launch)或连接(connect)一个浏览器。
launch
puppeteer 自己携带了一个特定版本的浏览器,所谓的 launch 就是启动该默认的浏览器,主基本的流程:
JavaScript
import puppeteer from "puppeteer";
const browser = await puppeteer.launch();
await browser.close();
launch 可以接受一个 LaunchOptions 对象来控制浏览器的一些行为,其中比较重要的包括:
参数 | 描述 |
---|---|
browser:'chrome \| 'firefox' = 'chrome' |
要启动的浏览器 |
env: Record<string,string> = process.env |
指定浏览器可见的环境变量 |
executablePath:string |
用于替代默认 chrome 浏览器的其他浏览器的可执行路径 |
args:string[] |
要传递给浏览器实例的其他命令行参数(指定代理时很有用) |
headless: boolean = true |
无头模式,需要注意默认是无头的 |
acceptInsecureCerts:boolean = false |
是否自动忽略 HTTPS 错误 |
defaultViewport = {width:800, height: 600} |
默认窗口大小 |
connect
可以使用 connect 方法来连接一个已经启动了的浏览器:
JavaScript
const browser = await puppeteer.connect({
browserWSEndpoint: "ws://HOST:PORT/devtools/browser/<id>",
});
const page = await browser.newPage();
browser.disconnect();
Note
与 browser.close()
不同,browser.disconnect()
不会关闭浏览器,甚至不会关闭任何页面。
Note
可以使用 Browser.wsEndpoint()
来返回 WebSocket URL,也可以使用命令行开启 debug 模式来获取。具体查看Browser Endpoints
Browser 类
Browser代表一个浏览器,launch/connect 会返回该对象实例。他是我们操作的入口,具有以下属性和方法:
成员 | 描述 |
---|---|
connected: boolean |
只读属性,表示 puppeteer 是否连接到该浏览器 |
close() -> Promise<void> |
关闭浏览器以及关联的所有页面 |
disconnect() -> Promise<void> |
断开 puppeteer 与浏览器的连接 |
defaultBrowserContext() -> BrowserContext |
获取默认的浏览器上下文,注意他无法被关闭 |
createBrowserContext(opts) -> Promise<BrowserContext> |
创建一个浏览器上下文 |
browserContexts() -> BrowserContext[] |
获取打开的浏览器上下文列表 |
newPage() -> Promise<Page> |
在默认浏览器上下文中创建一个新页面 |
pages() -> Promise<Page[]> |
返回所有浏览器上下文中的所有页面 |
wsEndpoint() -> string |
返回连接到该浏览器的 WebSocket URL |
BrowserContext
如果需要隔离自动化任务,可以创建一个浏览器上下文。
每次 launch 时,都会包含一个默认的浏览器上下文,他们是共享的。也可以使用 Browser.createBrowserContext()
来创建一个独立的上下文,他们具有独立的 cookies/localStorage 等:
JavaScript
import puppeteer from "puppeteer";
const browser = await puppeteer.launch();
const context = await browser.createBrowserContext();
const page1 = await context.newPage();
const page2 = await context.newPage();
await context.close();
Note
该类包含了 Browser 类中的多数相关方法,不同是他针对的是当前上下文本身。例如 BrowserContext.pages()
返回的是当前浏览器上下文打开的 page 对象。