页面操作

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 方法),参数也会被序列化。因此如果您的参数不能被序列化,将会发生错误。

您的函数在被转换成字符串、参数被序列化后(表达式不需要转换,因为它本来就是字符串),代码会被发送至浏览器然而交给浏览器执行。这意味着您的代码可以访问浏览器环境中的一些变量(如 windowdocument)。

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, pathcontent 三者之一。第二个参数是 value,具体内容取决于第一个参数。

  • 如果第一个参数 typeurl,您应该给出一个远程的 JS/CSS 文件的 URL。
  • 如果第一个参数 typepath,您应该给出本地 JS/CSS 文件的路径。
  • 如果第一个参数 typecontent,您应该给出有效的 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')