Image placeholder

Chromeless – 一个基于 Headless Chrome 模式的 Web 自动化框架

Image placeholder
F2EX 2017-09-08

Chromeless 是基于 Headless Chrome 模式的 Web 自动化框架。它的 API 和功能与其他流行工具(如 PhantomJS 和 NightmareJS )非常相似,主要区别在于它在 Chrome 的无头模式(headless-mode)下运行所有​​测试。可以在本地运行或在 AWS Lambda 上运行。

Chromeless 使 Chrome 自动化变得更简单。

Chromeless 可用于

  • 并行执行 1000 次浏览器集成测试
  • 抓取网页并自动执行截图
  • 编写需要真实浏览器环境的机器人
  • 包含 PhantomJS ,NightmareJS 或 Selenium 的一切功能
示例

测试

你可以尝试基于浏览器的 Chromeless 测试

如何运行

使用 Chromeless ,你可以使用优雅的 API 来控制 Chrome(打开网站,点击元素,填写表单…)。这对于集成测试或需要真实浏览器环境的任何其他场景非常有用。

有两种方法可以使用 Chromeless
  1. 在本地计算机上运行 Chrome
  2. 在 AWS Lambda 上运行 Chrome 并远程控制它

本地安装

对于本地开发,使用 Chromeless 的最简单的方法是控制你本地的 Chrome 浏览器。只需按照下面的用法开始使用。

远程代理设置

你还可以在 AWS Lambda 上以无头模式运行 Chrome 。这样,你可以通过并行运行来加快测试速度。

Chromeless 自带远程代理,其使用方式和其他代理完全相同。这样,你可以在本地编写和运行测试,并使其在 AWS Lambda 上远程执行。该代理通过
Websocket 连接到 Lambda 以转发命令并返回评估结果。

安装

npm install chromeless
代理设置

将代理服务部署到 AWS Lambda 。更多细节在这里

用法

使用 Chromeless 与其他浏览器自动化工具类似。例如:

const { Chromeless } = require('chromeless')

async function run() {
  const chromeless = new Chromeless()

  const screenshot = await chromeless
    .goto('https://www.google.com')
    .type('chromeless', 'input[name="q"]')
    .press(13)
    .wait('#resultStats')
    .screenshot()

  console.log(screenshot) // prints local file path or S3 url

  await chromeless.end()
}

run().catch(console.error.bind(console))
本地 Chrome 用法

要在本地运行 Chromeless ,你需要安装最新版本的 Chrome 或 Chrome Canary(版本60或更高版本)。默认情况下,chromeless 将自动启动 Chrome ,如果有多个版本,默认情况下将会在系统上找到最新版本。你可以通过自己启动 Chrome 并在 Chromeless 构造函数中传递 launchChrome:false 来覆盖此行为。

要自己启动 Chrome ,并打开 chromeless 的端口,请按照以下示例:

alias canary="/Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary"
canary --remote-debugging-port=9222

或者运行 Chrome Canary headless-ly :

canary --remote-debugging-port=9222 --disable-gpu --headless

在 Windows 上运行 Chrome headless-ly :

cd "C:\Program Files (x86)\Google\Chrome\Application"
chrome --remote-debugging-port=9222 --disable-gpu --headless
代理用法

按照这里的设置说明。

然后使用带有代理服务的 Chromeless ,它与本地运行的方式相同,但远程选项除外。或者,你可以使用环境变量配置代理服务器。 就像这样

const chromeless = new Chromeless({
  remote: {
    endpointUrl: 'https://XXXXXXXXXX.execute-api.eu-west-1.amazonaws.com/dev'
    apiKey: 'your-api-key-here'
  },
})

API 文档请看这里。


2017-09-21