页面操作
Rize 提供了一些基本的页面操作,例如导航和 HTTP 认证。
导航
最常用的操作是通过 goto 方法来访问一个页面。
rize.goto('http://example.com')
您可以前进、后退或刷新当前页面:
rize.forward()
rize.back()
rize.refresh()
页面配置
您可以指定 user agent:
rize.withUserAgent(/* user agent */)
HTTP 认证:
rize.withAuth('username', 'password')
修改 HTTP 头部:
rize.withHeaders({/* 额外的头部信息 */})
在页面中执行函数
基本用法
您可以在浏览器环境中执行函数或表达式。注意是浏览器而不是在 Node.js 中。因此如果您想在 Node.js 环境中执行什么,请使用 execute 方法。
rize.evaluate(() => console.log('output in browser not node.js'))
您可以传递一个字符串,它将会被当成表达式来执行:
rize.evaluate('console.log("output in browser not node.js")')
初学者可能会犯这样的错误,就是直接访问外部变量:
// 别这么干!
const greeting = 'hi'
rize.evaluate(() => console.log(greeting))
就像上面所说的,函数或表达式会在浏览器中执行。然而,变量 greeting 并不存在于浏览器的 JavaScript 环境中。(除非它确实存在或您曾经定义过它)因此上面的代码会抛出 ReferenceError 错误。
解决方法是写一个带有参数的函数然后向它传递参数。像这样:
const greeting = 'hi'
rize.evaluate(message => console.log(message), greeting) // 没问题!
获取返回值
为了保持 API 能可链式调用, evaluate 方法不会返回您的函数或表达式的返回值,它只会返回当前 Rize 实例,尽管您的函数或表达式会返回一些东西。
有一个方法 evaluateWithReturn 它可以让您获取返回值(经过 Promise 包装)。
(async () => {
const rize = new Rize()
const byExpr = await rize.evaluateWithReturn('document.title')
const byFunc = await rize.evaluateWithReturn(() => document.title)
})()
evaluate 方法与 execute 方法的区别
TL;DR: evaluate 方法中的代码会在浏览器中执行而 execute 方法中的代码会在 Node.js 中执行。
当您使用 evaluate 方法的时候,您的函数会被转换成字符串(通过调用 toString 方法),参数也会被序列化。因此如果您的参数不能被序列化,将会发生错误。
您的函数在被转换成字符串、参数被序列化后(表达式不需要转换,因为它本来就是字符串),代码会被发送至浏览器然而交给浏览器执行。这意味着您的代码可以访问浏览器环境中的一些变量(如 window 和 document)。
而 execute 方法则能让你在完成上一个操作后执行一些事情。所有的代码会在 Node.js 环境中执行。例如,我们可以打日志,然后保存到磁盘中:
const fs = require('fs')
const rize = new Rize()
rize
.goto('http://example.com')
.execute(() => fs.writeFileSync('operations.log', 'visiting...'))
查看 execute 方法的文档可以获取更多信息。
添加标签
您可以向页面中添加 <script> 或 <style> 标签,您可以理解为注入 JavaScript 或 CSS 代码。
如果要添加 <script> 标签,请使用 addScriptTag 方法;如果要添加 <style> 标签,请使用 addStyleTag 方法。
这两个方法有相同的函数签名。第一个参数是 type,它只能是 url, path 或 content 三者之一。第二个参数是 value,具体内容取决于第一个参数。
- 如果第一个参数
type是url,您应该给出一个远程的 JS/CSS 文件的 URL。 - 如果第一个参数
type是path,您应该给出本地 JS/CSS 文件的路径。 - 如果第一个参数
type是content,您应该给出有效的 JavaScript/CSS 代码。
除非您手动指定使用旧版的 Chrome/Chromium,您可以随意地使用最新的 ES 特性。
多页面
Rize 支持多页面(也称标签页)。
在使用 Rize 的多页面功能之前,您最好理解下面一些内容。当您启动浏览器之后,浏览器中会有两个页面,一个是由 puppeteer 默认创建的,另一个是由 Rize 创建的。这对于不打算使用多页面功能的人来说是很方便的。(您不必手动新建页面。)
打开新页面
若要打开一个新页面,请使用 newPage 方法。
rize.newPage()
newPage 接收两个参数(都是可选的)。第一个是 name,当您要切换页面的时候,您可以使用这个名称来区分不同的页面。
第二个参数是 options,有两个选项。
force 选项用于当您使用已经存在的 name 值的时候,可以强制替换相同名字的旧页面。如果 force 为 true,当您使用一个已经存在的名字来打开新页面的时候,已有的页面会被新页面替换。否则原页面会保留,不会打开新页面。
stayCurrent 选项用于当新页面打开之后是否停留在当前的旧页面。如果 stayCurrent 为 true,在打开一个新的页面之后,当前的活动前面不会改变。否则在新建一个页面后,会切换到新页面。
关闭页面
通过调用 closePage 方法来关闭页面:
rize.closePage()
您也可以指定您想要关闭的页面的名称:
rize.closePage('page1')
切换到另一个页面
switchPage 方法接收一个参数,它可以是字符串,也可以是数字。
如果是字符串,它表示 name,也就是您想要切换到的页面的名称。
如果是数字,它会从内部的包含所有页面的数组中按索引找出您想要的页面,然后切换到它。
rize.switchPage(0)
rize.switchPage('page0')