前言
在前端开发过程中,我们经常需要处理一些自动化的任务,比如爬取网页数据、自动提交表单等。这时候,我们就需要用到一些自动化工具了。其中,archerbot 就是一款非常优秀的 npm 包,其拥有很强的自动化能力,可以帮助我们完成许多重复且繁琐的任务。本文将详细介绍如何使用 archerbot 进行自动化处理。
安装
首先,我们需要在项目中安装 archerbot,可以使用 npm 命令进行安装。
npm install --save archerbot
快速入门
在安装完成后,我们就可以开始使用 archerbot 了。下面提供一个简单的示例代码:
-- -------------------- ---- ------- ----- --------- - -------------------- -- ------ --------- -- ----- --- - --- ----------- -- -- ------ -- ---------------- -- -------- ----- ------ ------- -- - ----- - ------- - - ------ ----- ------------------------------------ ----- ----------------------- -------- ----- ---------------------------- ----- ------------------------ -- -- ---- --------------- -- -------- - -------- ------------ --
以上代码中的 bot.task
方法用于定义一个任务。它接收两个参数:
- 任务名称:该任务的名称,用于在运行任务时进行引用;
- 处理函数:一个
async
函数,其参数是一个page
对象和一组自定义参数,用于执行具体的任务。
bot.run
方法用于运行一个任务。它接收两个参数:
- 任务名称:要运行的任务名称;
- 自定义参数:一个对象,用于向任务传递自定义参数。
运行以上代码后,程序将自动在 Google 上搜索 JavaScript,并返回搜索结果页。
API 文档
上面的示例仅仅是 archerbot 的冰山一角。下面将详细介绍它所有的 API 接口。
实例化
首先,我们需要实例化一个 Archerbot 对象:
const Archerbot = require('archerbot') const bot = new Archerbot(options)
该实例将作为整个自动化过程的基础,并提供许多方法和属性。
options
参数是一个包含一些选项的对象,可选。以下是该对象的可用选项:
headless
: 一个布尔值,表示是否以无界面模式运行浏览器。默认为 true;executablePath
: 一个字符串,表示浏览器可执行文件的路径。默认为 null,使用系统默认安装路径;args
: 一个字符串数组,用于传递命令行参数给浏览器。默认为空数组;userDataDir
: 一个字符串,表示用户数据目录的路径。默认为 null,使用系统默认目录。
网络请求
以下方法用于处理浏览器的网络请求:
1. bot.onRequest(handler)
用于监听所有的网络请求,并在每个网络请求的“请求开始”时触发回调函数。
bot.onRequest(async (page, request) => { console.log('请求开始:', request.url()) })
该方法返回一个用于取消监听的函数。
const removeListener = bot.onRequest((page, request) => { // ... }) // 移除监听函数 removeListener()
2. bot.onResponse(handler)
用于监听所有的网络请求,并在每个网络请求的“响应完成”(即响应 body 下载完成)时触发回调函数。
bot.onResponse(async (page, response) => { console.log('响应完成:', response.url()) })
该方法返回一个用于取消监听的函数。
const removeListener = bot.onResponse((page, response) => { // ... }) // 移除监听函数 removeListener()
3. bot.prepareRequest(handler)
用于修改所有的网络请求,比如修改请求头、添加 cookie 等。该方法在每个网络请求发出前都会被调用一次。
bot.prepareRequest(async (page, request) => { console.log('修改请求:', request.url()) request.headers()['x-requested-by'] = 'Archerbot' })
该方法返回一个用于取消监听的函数。
const removeListener = bot.prepareRequest((page, request) => { // ... }) // 移除监听函数 removeListener()
网页操作
以下方法用于对浏览器中的网页进行操作:
1. bot.task(name, handler)
用于定义一个新的任务,任务包含一个或多个页面操作。
bot.task('login', async (page, params) => { await page.goto('https://www.example.com/') await page.type('[name="username"]', params.username) await page.type('[name="password"]', params.password) await page.keyboard.press('Enter') await page.waitForNavigation() })
该方法返回一个可用于调用任务的函数。
const runTask = bot.task('login', (page, params) => { // ... }) // 运行任务 runTask({ username: 'admin', password: 'xxx' })
如果要定义多步任务,可以在回调函数中调用多个页面操作。
bot.task('search', async (page, params) => { await page.goto('https://www.google.com/') await page.type('[name="q"]', params.keyword) await page.keyboard.press('Enter') await page.waitForNavigation() const resultLinks = await page.$$('[class="g"] .rc a') console.log(resultLinks.map(link => link.text())) })
2. bot.get(url, options)
用于在浏览器中打开指定的网页。
await bot.get('https://www.example.com/')
options
参数是一个包含一些选项的对象,可选。以下是该对象的可用选项:
waitLoad
: 一个布尔值,表示是否等待页面的所有资源都加载完成后返回。默认为 true;waitSelector
: 一个 CSS 选择器,表示等待页面中指定的元素出现再返回。默认为 null。
await bot.get('https://www.google.com/', { waitLoad: true, waitSelector: '[name="q"]' })
该方法返回一个 Promise
,其结果是一个 page
对象。
3. bot.delay(ms)
用于让程序延迟指定的时间(单位是毫秒)。
await bot.delay(3000) // 延迟 3 秒
4. page.type(selector, text, options)
用于向指定元素输入文本。
await page.type('[name="username"]', 'admin') await page.type('[name="password"]', 'xxx')
options
参数是一个包含一些选项的对象,可选。以下是该对象的可用选项:
delay
: 一个数字,表示每次输入的间隔时间(单位是毫秒)。默认为 0。
await page.type('[name="username"]', 'admin', { delay: 100 })
5. page.click(selector, options)
用于点击指定元素。
await page.click('[name="submit"]')
options
参数是一个包含一些选项的对象,可选。以下是该对象的可用选项:
button
: 一个字符串,表示要模拟的鼠标按钮。可选值为 "left"、"right"、"middle"。默认为 "left"。
await page.click('[name="submit"]', { button: 'right' })
6. page.waitFor(selectorOrFunctionOrTimeout, options)
用于等待页面中的某个元素出现。
const results = await page.$('[class="results"]') await page.waitFor('[class="results"]')
selectorOrFunctionOrTimeout
参数可以是以下三种类型的之一:
- CSS 选择器,表示等待指定元素出现;
- 一个或多个 CSS 选择器的数组,表示等待这些元素出现;
- 一个回调函数,该函数返回一个布尔值,表示等待某个条件成立。
options
参数是一个包含一些选项的对象,可选。以下是该对象的可用选项:
timeout
: 一个数字,表示等待的最长时间(单位是毫秒)。默认为 30000 毫秒(即 30 秒);polling
: 一个数字,表示每隔多长时间(单位是毫秒)轮询一次判断条件是否满足。默认为 500 毫秒。
-- -------------------- ---- ------- ----- ----------------------- - -------- ----- -- -- --- ----- --- ----------------- ------- -- - ------------- -- - -- ----------------------------------- - --------- - ---- - -------------- - -- ------ --
7. page.waitForNavigation(options)
用于等待页面跳转完成。
await page.click('[name="submit"]') await page.waitForNavigation()
options
参数是一个包含一些选项的对象,可选。以下是该对象的可用选项:
timeout
: 一个数字,表示等待的最长时间(单位是毫秒)。默认为 30000 毫秒(即 30 秒)。
8. page.goBack()
用于后退一页。
await page.goBack()
9. page.goForward()
用于前进一页。
await page.goForward()
10. page.reload(options)
用于重新加载页面。
await page.reload({ waitLoad: true })
options
参数同 bot.get
方法的选项。
11. page.evaluate(pageFunction, ...args)
用于在浏览器页面中执行 JavaScript 代码。
const title = await page.evaluate(() => document.title)
第一个参数 pageFunction
是一个 string
或 function
类型,表示要在页面中执行的代码。如果该参数是一个字符串,则将其作为可执行的 JavaScript 代码。如果该参数是一个函数,则将其转换为字符串,并将其作为可执行的 JavaScript 代码。该方法支持传递任意数量的其他参数,这些参数会被传递给 pageFunction
。
await page.evaluate(function(a, b) { return a + b }, 1, 2) // => 3
需要注意的是,由于 JavaScript 是运行在浏览器内部,所以在 pageFunction
内部无法直接访问 Node.js 的全局变量,比如 module
、require
等。如果要访问这些变量,需要使用 window
对象,结合浏览器插件等方式进行封装。
12. page.$(selector)
用于查找页面中的一个元素。
const button = await page.$('#login-button')
该方法返回的是一个 Promise
对象,结果是一个 ElementHandle
对象,表示查找到的元素。如果找不到指定的元素,结果为 null
。
13. page.$$(selector)
用于查找页面中的所有符合条件的元素。
const resultLinks = await page.$$('[class="g"] .rc a')
该方法返回的是一个 Promise
对象,结果是一个 ElementHandle
对象的数组,表示符合条件的所有元素。如果找不到任何元素,结果为空数组。
14. ElementHandle.click(options)
用于模拟点击元素。
const button = await page.$('#login-button') await button.click()
options
参数同 page.click
方法的选项。
15. ElementHandle.type(text, options)
用于向元素输入文本。
const input = await page.$('[name="password"]') await input.type('xxx')
options
参数同 page.type
方法的选项。
16. ElementHandle.press(key, options)
用于模拟键盘按键。
const input = await page.$('[name="username"]') await input.press('Tab') await input.press('Backspace')
key
参数是一个表示按键的字符串,比如 "Enter"、"ArrowLeft" 等。options
参数同 page.type
方法的选项。
总结
archerbot 是一个非常强大的自动化工具,既简单易用又功能强大。本文仅仅介绍了其大部分 API 接口,更高级的用法还需要读者自行探索。在使用过程中,需要注意合法使用,不要用于非法用途。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/90496