`

自动化测试工具小记:node + SpookyJS + CasperJS + PhantomJS

阅读更多

概述

这是一个跨度很广的小记哦,使用node作为脚本,涵盖了三个工具:PhantomJS、CasperJS、SpookyJS。目前网上相关的资料比较少,请关注乱炖,我会断断续续更新。

那这三个工具有什么用呢,网上比较专业的说法是:“前端自动化测试工具”,通俗点来说就是一个“没有UI界面的终端浏览器”;如果完整的来看,他应该是NSCP(我个人写的简称,即:node + SpookyJS + CasperJS + PhantomJS)

注意哦,NSCP和传统的CURL不一样的地方在于:

  • CURL是发起一个URL请求,单项的;而NSCP则是一个真正的网页请求,请求整个网页及网页包含的所有资源
  • 效率来说,CURL远远比NSCP要快的多
  • CURL更适合爬数据,NSCP更多是对于“无界的浏览网页”

那这个工具有什么用呢?举几个简单例子:

  • 网页快照(截图)
  • 前端自动化测试
  • 其他…

PhantomJS

OK,说了这么多,那怎么了解NSCP呢?在分享之前必须先了解PhantomJS。CasperJS和SpookyJS都是在PhantomJS基础上拓展的工具。PhantomJS是一个无界的终端浏览器,他能够访问并测试指定网页。

安装方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Mac brew 安装
brew install phantomjs
 
# Npm 安装
npm install phantomjs
 
# CentOS 编译安装
sudo yum install gcc gcc-c++ make git openssl-devel freetype-devel fontconfig-devel
git clone git://github.com/ariya/phantomjs.git
 
cd phantomjs
git checkout 1.9
 
./build.sh

简单的例子

将下面保存为simple.js文件

1
2
3
4
5
6
7
8
9
console.log('Loading a web page');
 
var page = require('webpage').create();
var url = 'http://levi.cg.am/';
 
page.open(url, function (status) {
    // Page is loaded!
    phantom.exit();
});

终端执行命令

1
phantomjs simple.js

更多示例见:http://phantomjs.org/examples/

有人说PhantomJS是node,这样理解不是很正确,PhantomJS是一个运行JS调用API接口的工具,允许通过npm方式下载安装并以模块方式存在node中。但是PhantomJS中是不支持node方法的哦,具体差异见官方文档!

同类的软件

挺多的,这里我只列举一个SlimerJS。SlimerJS与PhantomJS不同之处在于,PhantomJS是基于webkit内核的,而SlimerJS是基于Gecko(firefox),SlimerJS和PhantomJS语法很接近,不重复说明,具体见官网

http://www.slimerjs.org/index.html

在PHP中使用PhantomJS

方法一:通过exec

1
2
<?php
exec('phantomjs simple.js');

方法二:PHP PhantomJS

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
require '../vendor/autoload.php';
use JonnyW\PhantomJs\Client;
 
$client = Client::getInstance();
$request  = $client->getMessageFactory()->createRequest();
$response = $client->getMessageFactory()->createResponse();
 
$request->setMethod('GET');
$request->setUrl('http://google.com');
 
$client->send($request, $response);
var_dump($response);

安装方法及使用见官方git:
https://github.com/jonnnnyw/php-phantomjs

CasperJS

通过上面提供的PhantomJS示例并了解后,你可能会发现一些问题,比如你要请求一系列网址,并且在一个请求之后,执行另一个请求。使用PhantomJS可能会像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var page = require('webpage').create();             //新建一个页面
page.open(url1, function(status) {                  //导航到第一个URL
    if (status == "fail") phantom.exit();           //如果发生错误,退出程序
    page.open(url2, function(status) {              //否则在页面加载完成的回调函数中继续导航到第二个URL,依次类推
        if (status == "fail") phantom.exit();
        page.open(url3, function(status) {
            if (status == "fail") phantom.exit();
            page.open(url4, function(status) {
                if (status == "fail") phantom.exit();
                // 我可以停下来了吗?
            });
        });
    });
});

是不是很恐怖,而CasperJS的目的就在于更方便的操作PhantomJS。CasperJS是一个开源的,用JavaScript编写的,基于PhantomJS的导航脚本和测试工具,它简化了定义一个完成的导航操作所需的步骤,还提供了很有用的函数封装、方法、和语法糖、它可以完成下面这些常见任务:

  • 定义 & 排序浏览器导航步骤
  • 填充 & 提交表单
  • 点击 & 跟踪链接
  • 捕获网页截图 (还可以截取某一区域)
  • 在远程DOM上进行断言测试
  • 记录事件
  • 下载资源,包括二进制文件
  • 编写功能测试套件,结果保存为JUnit XML文件
  • 抓取网页内容

CasperJS使用更方便的API解决了这种异步操作的问题:

1
2
3
4
5
6
7
8
var casper = require('casper').create();           //新建一个页面
 
casper.start(url1);                                //添加第一个URL
casper.thenOpen(url2);                             //添加第二个URL,依次类推
casper.thenOpen(url3);
casper.thenOpen(url4);
 
casper.run();                                      //开始导航

终端执行文件

1
casperjs simple.js

更多示例见官方文档:

http://casperjs.readthedocs.org/en/latest/index.html

注意哦:CasperJS使用的是casper的方法,PhantonJS使用的是phantom的方法;他们有各自的使用方法,不可以用混淆执行

安装方法

目前我只在本地开发环境安装,安装方法如下:

1
brew install casperjs --devel

注意哦:目前PhantomJS的版本是1.9.2,正式版是不支持的,请安装开发版

SpookyJS

通过上面描述,应该了解到:

  • PhantomJS,一个无界的终端浏览器
  • CasperJS,一个改善PhantomJS操作的工具

而SpookyJS有什么用途呢?前面说了PhantonJS和CasperJS是可以作为模块进行npm安装在node中,但是执行的方法却是通过各自的bin文件,诸如:

1
2
phantomjs simple.js
casperjs simple.js

而SpookyJS则是一个驱动器,在node下能够正常使用PhantonJS和CasperJS,这就是我定义的NSCP (node + SpookyJS + CasperJS + PhantomJS)。你可以简单将其理解为:

  • node:脚本语言
  • Spooky:驱动器
  • CasperJS:工具
  • PhantomJS:无界浏览器

安装方法

既然SpookyJS作为node的驱动器,那么也需要通过node进行安装:

1
npm install spooky

SpookyJS需要依赖的环境

简单示例

保存为hello.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
try {
    var Spooky = require('spooky');
} catch (e) {
    var Spooky = require('../lib/spooky');
}
 
var spooky = new Spooky({
        child: {
            transport: 'http'
        },
        casper: {
            logLevel: 'debug',
            verbose: true
        }
    }, function (err) {
        if (err) {
            e = new Error('Failed to initialize SpookyJS');
            e.details = err;
            throw e;
        }
 
        spooky.start(
            'http://en.wikipedia.org/wiki/Spooky_the_Tuff_Little_Ghost');
        spooky.then(function () {
            this.emit('hello', 'Hello, from ' + this.evaluate(function () {
                return document.title;
            }));
        });
        spooky.run();
    });
 
spooky.on('error', function (e, stack) {
    console.error(e);
 
    if (stack) {
        console.log(stack);
    }
});
 
/*
// Uncomment this block to see all of the things Casper has to say.
// There are a lot.
// He has opinions.
spooky.on('console', function (line) {
    console.log(line);
});
*/
 
spooky.on('hello', function (greeting) {
    console.log(greeting);
});
 
spooky.on('log', function (log) {
    if (log.space === 'remote') {
        console.log(log.message.replace(/ \- .*/, ''));
    }
});

通过node执行脚本

1
node hello.js

更多内容请见官方git:

https://github.com/WaterfallEngineering/SpookyJS

需要注意的几个地方

通过SpookyJS配置PhantomJS和CasperJS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var spooky = new Spooky({
    child: {
        transport: 'http'
    },
    casper: {
        logLevel: 'debug',
        verbose: true,
        viewportSize: {
            width: 1440, height: 768
        },
        pageSettings: {
            outputEncoding: 'gbk'
        }
    }
}, function(err) {});

phantom和casper不同的方法调用

1
2
3
4
5
6
7
8
9
10
11
12
spooky.start('http://example.com/the-page.html');
 
spooky.then(function () {
    // 这里是CasperJS的方法
});
 
spooky.thenEvaluate(function () {
    // 这里是PhantomJS的方法
})
 
// this function (and the three spooky calls above) runs in Spooky's environment
spooky.run();

变量作用域

SpookyJS的作用域和js不一样哦,具体看下面几个来自官方的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var x = 'spooky';
spooky.start('http://example.com/the-page.html');
 
spooky.then(function () {
    var y = 'casper';
    console.log('x:', x); // -> x: undefined
});
 
spooky.thenEvaluate(function () {
    console.log('x:', x); // -> x: undefined
    console.log('y:', y); // -> y: undefined
});
 
spooky.run();

而PhantomJS的方法中可以通过传递一个对象过去

1
2
3
4
5
6
7
8
var x = 'spooky';
 
// spooky.thenEvaluate accepts an options argument (just like Casper)
spooky.thenEvaluate(function (x) {
    console.log('x:', x); // -> x: spooky
}, {
    x: x
});

而CasperJS的方法中需要将变量作为数组对象,以参数传过去

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var x = 'spooky';
var y = 'kooky';
 
// spooky.then accepts a function tuple
spooky.then([{
    x: x
}, function () {
    console.log('x:', x); // -> x: spooky
}]);
 
// spooky.thenEvaluate accepts both a function tuple and an argument hash
spooky.thenEvaluate([{
    y: y
}, function (x) {
    console.log('x:', x); // -> x: spooky
    console.log('y:', y); // -> y: kooky
}], {
    x: x
});

全局和局部变量

1
2
3
4
5
6
7
8
9
10
var x = 'spooky';
 
spooky.then([{
    x: x
}, function () {
    x = 'casper';
    console.log('x:', x); // -> x: casper
}]);
 
console.log('x:', x); // -> x: spooky

一个混合的使用例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
spooky.start('http://example.com/the-page.html');
 
var x = 'spooky';
spooky.then([{
    x: x
}, function () {
    var y = 'casper';
    var z = this.evaluate(function (x, y) {
        console.log('x:', x); // -> x: spooky
        console.log('y:', y); // -> y: casper
 
        return [x, y, 'and the-page.html'].join(', ');
    }, {
        x: x,
        y: y
    });
 
    console.log('z:', z); // -> z: spooky, casper, and the-page.html
}]);
 
spooky.run();

那两个不同的方法之间,如何传递变量呢?来一个非官方的例子,同样来自github

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
spooky.then(function () {
    window.pageCount = 0;
});
 
spooky.waitFor(function () {
    var isLastPage = !this.exists('#next');
 
    if (!isLastPage) {
        window.pageCount++;
        this.click('#next');
    }
 
    return isLastPage;
});
 
spooky.then(function () {
    this.emit('console', 'Page count: ' + window.pageCount);
});

是不是有点不太好理解,如果你了解PHP的话,可以将其当作PHP闭包中的ues去看待。如果仍旧不懂,你可以给我留言哦

不允许使用中文

这个真的是官方、非官方都没有说明的,无论你是不是utf-8,在SpookyJS构造方法中都不允许使用中文

1
2
3
4
5
6
7
8
9
10
11
12
var spooky = new Spooky({
    // 此处省略...
}, function() {
    spooky.then(function () {
        // 这样是不可以的哦
        var name = '中文';
    }
});
 
spooky.on('test', function(log) {
    console.log('但是这里是可以用中文的哦!');
});

好在JS中有一个原生的方法 decodeURIComponent,可以这样

1
2
3
4
5
6
7
8
9
10
11
12
13
var spooky = new Spooky({
    // 此处省略...
}, function() {
    spooky.then(function () {
        var name = this.evaluate(function() {
            return window.decodeURIComponent('%E4%B8%AD%E6%96%87');
        });
    }
});
 
spooky.on('test', function(log) {
    console.log('但是这里是可以用中文的哦!');
});

当然也可以使用base64,目前还没测。原因,我找了很多资料,唯一有个相关的说法是CasperJS不支持大于8b的字符

转载自:http://levi.cg.am/archives/3648

分享到:
评论

相关推荐

    casperjs +phantomjs 爬虫抓包插件

    利用casperjs +phantomjs实现登录抓取网页 并且截图;下载后解压后,在环境变量path中配置解压后bin目录的地址,如:E:\Program Files\casperjs\bin;E:\Program Files\phantomjs\bin

    phantomjs + casperjs

    PhantomJS和CasperJS是两个非常重要的工具,它们在Web自动化、无头浏览器测试以及网页抓取领域中发挥着关键作用。 PhantomJS是一个基于Webkit的无头浏览器,它允许开发者在没有用户界面的情况下运行JavaScript,这...

    phantomjs&casperjs

    PhantomJS和CasperJS是两个非常重要的工具,它们在Web自动化测试和无头浏览器场景中扮演着关键角色。这两个工具都是基于WebKit浏览器引擎,但各自有着不同的功能和用途。 PhantomJS是一款开源的无头浏览器,它允许...

    phantomjs和casperjs下载地址.zip

    CasperJs 是一个基于 PhantomJs 的工具,其比起 PhantomJs 可以更加方便的进行 navigation。 推荐使用PhantomJs1.9版本的 phantomjs和casperjs下载地址,casperjs下载地址,phantomjs下载地址

    docker-casperjs:基于PhantomJS 2.0的CasperJS的Docker回购

    基于PhantomJS 2.0的CasperJS的Docker回购 环境 Ubuntu 14.04 PhantomJS 2.0.0 Casperjs 1.1.0-beta3 用法 运行casperjs命令: docker run hantq/docker-casperjs casperjs --version 运行测试用例: docker ...

    casperjs:使用 PhantomJs 和 CasperJs 测试 Web 应用程序

    卡斯帕杰斯(CasperJS)是一个用于编写功能和验收测试的框架,它构建于 PhantomJS 之上,利用 JavaScript 语言,提供了丰富的 API 来方便地进行网页自动化操作和测试。 **一、安装 Node.js** Node.js 是一个开放源...

    phantomjs-2.1.1-windows.zip

    5. **自动化测试**:PhantomJS可以作为自动化测试工具,用于端到端的Web应用测试,例如使用CasperJS或者Jasmine框架进行测试。 6. **性能分析**:PhantomJS可以记录页面加载时间、资源下载速度等信息,帮助开发者...

    casperjs_sample:Headless JS 测试框架示例 - CasperJS

    casperjs_sample Headless JS 测试框架示例 - CasperJS要求PhantomJS 1.8.2+ Python 2.6+ CasperJS 1.0+

    GuardDuty:使用 CasperJS 和 PhantomJS 的自动化 Web 应用程序健康检查器

    在这个场景下,`GuardDuty`是一个基于JavaScript的工具,它整合了`SpookyJS`、`CasperJS`和`PhantomJS`,以实现对Web应用程序的自动化健康检查。 **1. CasperJS** CasperJS是一个用于导航脚本化和自动化测试的高级...

    phantomjs2.0

    PhantomJS是一个基于Webkit内核的无头浏览器,它允许开发者通过JavaScript接口来控制浏览器进行自动化测试、网页截图、网络监控等各种任务。在标题和描述中提到的"phantomjs2.0"指的是该软件的第二个主要版本。在这...

    phantomjs-2.1.2

    PhantomJS是一个强大的Web自动化工具,它基于WebKit引擎,提供了无头浏览器的功能,也就是说,它可以在没有图形用户界面的情况下运行。这个"phantomjs-2.1.2"版本是针对Windows操作系统设计的,适用于那些在后台处理...

    phantomjs-2.1.1-windows

    PhantomJS是一个基于Webkit内核的无头浏览器,它主要用于自动化测试、网页截屏、网页内容抓取等任务。2.1.1是它的一个稳定版本,适用于Windows操作系统。在给定的信息中,我们主要关注的是PhantomJS的这个特定版本...

    flaming-octo-puss:PhantomJS CasperJS的视觉调试-允许您查看浏览器正在渲染什么

    视觉调试PhantomJS / CasperJS 这个小技巧使用的是一种简单的技术:PhantomJS或CasperJS通过captureBase64('png')捕获屏幕,然后将图像发布到接收服务器,然后通过socket.io将其发送到显示的浏览器它是嵌入式图像...

    casperjs-1.1.3.zip

    CasperJS是一个基于PhantomJS和SlimerJS的高级脚本接口,专为网页抓取和自动化测试设计。它提供了一种简洁的方式来导航、交互和测试网页,特别适合处理那些依赖JavaScript来呈现内容的网站。在本文中,我们将深入...

    FriendlyGhost:用于抓取电子邮件地址的 Casperjs 驱动的网络爬虫

    Friendly Ghost依赖于 Casperjs 和 Phantomjs。 安装这些的最好方法是通过终端通过 。 -g标志使它们可以在系统范围内访问。 sudo npm install -g phantomjs && sudo npm -g install casperjs 其他安装选项包括和 ...

    a8c-casperjs-tests:存放我为Automattic构建的CasperJS测试套件的存储库

    a8c-casperjs-测试 存放我正在为Automattic构建的CasperJS / SlimerJS测试套件的存储库,用于测试购买业务计划的过程。 login.js脚本包含登录wordpress.com并导航到“升级”屏幕的逻辑,以及一些全局变量和函数。 ...

    casperjs1.1.0-beta3.jar

    CasperJS是一个基于PhantomJS和SlimerJS的高级脚本接口,用于浏览器自动化和功能测试。这个"casperjs1.1.0-beta3.jar"文件是CasperJS的一个特定版本,即1.1.0-beta3,适用于Windows操作系统。在Java平台上,JAR...

    docker-casperjs:Fedora 容器中的 CasperJS,PhantomJS 1.9.8

    PhantomJS and CasperJS 用法 docker run -ti casperjs phantomjs --version docker run -ti casperjs casperjs --version 链接测试 With this image, you can link your test suite into the container: docker...

    casperjs-1.1.4-1.zip

    CasperJS是一个基于PhantomJS和SlimerJS的高级脚本接口,用于浏览器自动化和功能测试。这个"casperjs-1.1.4-1.zip"文件包含了CasperJS的1.1.4-1版本,这是一款非常有用的工具,尤其对于前端开发者和自动化测试工程师...

    casperjs.pdf

    CasperJS是一个基于JavaScript的导航脚本和测试框架,它被设计来让开发者可以在网页上执行自动化任务,如爬取网页内容、进行自动化测试等。它基于PhantomJS引擎,提供了对DOM的访问以及操作。CasperJS可以在多种操作...

Global site tag (gtag.js) - Google Analytics