简介
Headless 是一个基于 Chrome DevTools 协议的 Node.js 库,它提供了一种在无头浏览器(Headless Browser)中自动执行 DOM 操作的方式,可用于爬虫、自动化测试等场景。
本文将介绍如何使用 npm 包 Headless,包括安装、配置、常用 API 的使用方法,并提供示例代码供读者参考。
安装
首先需要在项目中安装 Headless:
npm install headless
安装完成后即可在项目中引入 Headless:
const { Headless } = require('headless')
配置
启动 Headless
启动 Headless 实例之前,需要先启动一个运行在端口 9222 的 Chrome 实例。可以通过以下命令启动:
google-chrome --remote-debugging-port=9222 --no-first-run --no-default-browser-check --disable-translate --disable-fre
其中 google-chrome
是 Chrome 的可执行文件路径,具体路径根据系统不同而有所差异。通过该命令启动的 Chrome 实例会监听来自 127.0.0.1:9222 的远程调试请求。
如果需要在 Node.js 中自动启动 Chrome 实例并连接到 Headless,可以使用 chrome-launcher 包。具体用法请参考其文档。
配置 Headless
启动 Headless 实例时可以传入一些配置项,包括 Chrome 连接地址和窗口大小等。以下是一个示例:
const headless = new Headless({ endpoint: 'http://127.0.0.1:9222', height: 1080, width: 1920, })
API
初始化
在启动 Headless 实例后,需要先调用 init
方法初始化实例:
await headless.init()
打开页面
使用 openPage
方法打开指定 URL 的页面:
await headless.openPage('https://www.example.com')
查找元素
Headless 提供了多种查找元素的方式,包括按 ID、按选择器、按文本内容等。以下是一些常用的方法:
findById(id: string): ElementHandle | null
: 按 ID 查找元素。findBySelector(selector: string): ElementHandle | null
: 按选择器查找元素。findByText(text: string): ElementHandle | null
: 按文本内容查找元素。
例如,以下代码会找到 ID 为 my-div
的元素并获取其文本内容:
const element = await headless.findById('my-div') const text = await element.textContent()
执行脚本
使用 evaluate
方法执行 JavaScript 脚本,并返回结果:
const result = await headless.evaluate(() => { return document.title }) console.log(result) // 输出页面标题
模拟操作
使用 typeInput
和 clickElement
方法模拟用户的输入和点击操作:
const input = await headless.findBySelector('#my-input') await headless.typeInput(input, 'hello world') const button = await headless.findByText('Submit') await headless.clickElement(button)
关闭页面和 Headless 实例
使用 closePage
方法关闭当前页面:
await headless.closePage()
使用 exit
方法关闭 Headless 实例:
await headless.exit()
示例代码
以下是一个使用 Headless 实现自动登录 GitHub 的示例代码:
-- -------------------- ---- ------- ----- - -------- - - ------------------- ----- -------- - --- ---------- --------- ------------------------ -- ----- -------- ------- - --- - ----- --------------- ----- --------------------------------------------- ----- ------------- - ----- --------------------------------------- ----- ------------- - ----- ------------------------------------ ----- ------------ - ----- ---- - ----------------------------------------------------------- -------- ----------------------------------------------------------------------------------