PhantomJS快速入门教程(服务器端的 JavaScript API 的 WebKit)


Posted in Javascript onAugust 06, 2015

PhantomJS 是一个基于 WebKit 的服务器端 JavaScript API。它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, Canvas, 和 SVG。 PhantomJS 可以用于 页面自动化 , 网络监测 , 网页截屏 ,以及 无界面测试 等。

PhantomJs官网:http://phantomjs.org/
GitHub:https://github.com/ariya/phantomjs/wiki/Quick-Start

一、安装

安装包下载地址:http://phantomjs.org/download.html ,包括 Windows ,Mac OS,Linux版本,自行选择对应 版本下载解压即可( 为方便使用,可自已为phantomjs设置环境变量 ),其中带有一个example文件夹,里面有很多已经写好的代码供使用。本文假设phantomjs已经安装好并已设置了环境变量。

二、使用

Hello, World!

新建一个包含下面两行脚本的文本文件:

console.log('Hello, world!');
phantom.exit();

将文件另存为 hello.js ,然后执行它:

phantomjs hello.js

输出结果为:Hello, world!

第一行将会在终端打印出字符串,第二行 phantom.exit 将退出运行。
在该脚本中调用 phantom.exit 是非常重要的,否则 PhantomJS 将根本不会停止。

脚本参数 ? Script Arguments

Phantomjs如何传递参数呢?如下所示 :

phantomjs examples/arguments.js foo bar baz

其中的foo, bar, baz就是要传递的参数,如何获取呢:

var system = require('system');
if (system.args.length === 1) {
 console.log('Try to pass some args when invoking this script!');
} else {
 system.args.forEach(function (arg, i) {
   console.log(i + ': ' + arg);
 });
}
phantom.exit();

它将输出 :

0: foo
1: bar
2: baz

页面加载 ? Page Loading

通过创建一个网页对象,一个网页可以被加载,分析和渲染。

下面的脚本将示例页面对象最简单的用法,它加载 example.com 并且将它保存为一张图片, example.png 。

var page = require('webpage').create();
page.open('http://example.com', function () {
 page.render('example.png');
 phantom.exit();
});

由于它的这个特性,PhantomJS 可以用来 网页截屏 ,截取一些内容的快照,比如将网页、SVG存成图片,PDF等,这个功能很牛X。

接下来的 loadspeed.js 脚本加载一个特殊的URL (不要忘了http协议) 并且计量加载该页面的时间。

var page = require('webpage').create(),
 system = require('system'),
 t, address;

if (system.args.length === 1) {
 console.log('Usage: loadspeed.js <some URL>');
 phantom.exit();
}

t = Date.now();
address = system.args[1];
page.open(address, function (status) {
 if (status !== 'success') {
  console.log('FAIL to load the address');
 } else {
  t = Date.now() - t;
  console.log('Loading time ' + t + ' msec');
 }
 phantom.exit();
});

在命令行运行该脚本:

phantomjs loadspeed.js http://www.google.com
它输出像下面的东西:

Loading http://www.google.com Loading time 719 msec

代码运算 ? Code Evaluation

要想在网页的上下文中对JavaScript 或 CoffeeScript 进行运算,使用 evaluate() 方法。代码是在“沙箱”中运行的,它没有办法读取在其所属页面上下文之外的任何JavaScript对象和变量。 evaluate() 会返回一个对象,然而它仅限制于简单的对象并且不能包含方法或闭包。

这有一个示例来显示网页标题:

var page = require('webpage').create();
page.open(url, function (status) {
 var title = page.evaluate(function () {
  return document.title;
 });
 console.log('Page title is ' + title);
});

任何来自于网页并且包括来自 evaluate() 内部代码的控制台信息,默认不会显示的。要重写这个行为,使用 onConsoleMessage 回调函数,前一个示例可以被改写成:

var page = require('webpage').create();
page.onConsoleMessage = function (msg) {
 console.log('Page title is ' + msg);
};
page.open(url, function (status) {
 page.evaluate(function () {
  console.log(document.title);
 });
});

DOM操作 ? DOM Manipulation

由于脚本好像是一个Web浏览器上运行的一样,标准的DOM脚本和CSS选择器可以很好的工作。这使得PhantomJS适合支持各种 页面自动化任务 。

下面的 useragent.js 将读取 id 为myagent的元素的 textContent 属性:

var page = require('webpage').create();
console.log('The default user agent is ' + page.settings.userAgent);
page.settings.userAgent = 'SpecialAgent';
page.open('http://www.httpuseragent.org', function (status) {
 if (status !== 'success') {
  console.log('Unable to access network');
 } else {
  var ua = page.evaluate(function () {
   return document.getElementById('myagent').textContent;
  });
  console.log(ua);
 }
 phantom.exit();
});

上面示例同样提供了一种自定义 user agent 的方法。

使用JQuery及其他类库:

var page = require('webpage').create();
page.open('http://www.sample.com', function() {
 page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {
  page.evaluate(function() {
   $("button").click();
  });
  phantom.exit()
 });
});

网络请求及响应 ? Network Requests and Responses

将一个页面从一台远程服务器请求一个资源的时候,请求和响应均可以通过 onResourceRequested 和 onResourceReceived 回调方法追踪到。示例 netlog.js :

var page = require('webpage').create();
page.onResourceRequested = function (request) {
 console.log('Request ' + JSON.stringify(request, undefined, 4));
};
page.onResourceReceived = function (response) {
 console.log('Receive ' + JSON.stringify(response, undefined, 4));
};
page.open(url);

获取如何把该特性用于HAR 输出以及基于YSlow的性能分析的更多信息,请参阅 网络监控页面 。

Javascript 相关文章推荐
数组Array进行原型prototype扩展后带来的for in遍历问题
Feb 07 Javascript
jquery isEmptyObject判断是否为空对象的函数
Feb 14 Javascript
SeaJS入门教程系列之完整示例(三)
Mar 03 Javascript
JavaScript操作DOM元素的childNodes和children区别
Apr 01 Javascript
Javascript中arguments和arguments.callee的区别浅析
Apr 24 Javascript
angular-ui-sortable实现可拖拽排序列表
Dec 28 Javascript
Validform验证时可以为空否则按照指定格式验证
Oct 20 Javascript
angular1配合gulp和bower的使用教程
Jan 19 Javascript
利用npm 安装删除模块的方法
May 15 Javascript
vue中使用带隐藏文本信息的图片、图片水印的方法
Apr 24 Javascript
一分钟学会JavaScript中的try-catch
Dec 14 Javascript
分享一个vue实现的记事本功能案例
Apr 11 Vue.js
jQuery实现hover合成事件的方法
Aug 06 #Javascript
Ajax清除浏览器js、css、图片缓存的方法
Aug 06 #Javascript
jQuery实现动画效果circle实例
Aug 06 #Javascript
jQuery动态星级评分效果实现方法
Aug 06 #Javascript
javascript使用输出语句实现网页特效代码
Aug 06 #Javascript
JS实现霓虹灯文字效果的方法
Aug 06 #Javascript
javascript实现网页背景烟花效果的方法
Aug 06 #Javascript
You might like
windows下PHP APACHE MYSQ完整配置
2007/01/02 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
2015/12/02 PHP
PHP基于自定义函数实现的汉字转拼音功能实例
2017/09/30 PHP
javascript 中对象的继承〔转贴〕
2007/01/22 Javascript
javascript当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
2010/01/05 Javascript
Javascript中获取出错代码所在文件及行数的代码
2010/09/23 Javascript
js中if语句的几种优化代码写法
2011/03/12 Javascript
jquery+CSS实现的多级竖向展开树形TRee菜单效果
2015/08/24 Javascript
jQuery自定义动画函数实例详解(附demo源码)
2015/12/10 Javascript
浅析jquery如何判断滚动条滚到页面底部并执行事件
2016/04/29 Javascript
JavaScript中的boolean布尔值使用学习及相关技巧讲解
2016/05/26 Javascript
JavaScript随机打乱数组顺序之随机洗牌算法
2016/08/02 Javascript
微信小程序 参数传递详解
2016/10/24 Javascript
angularjs 页面自适应高度的方法
2018/01/17 Javascript
详解实现一个通用的“划词高亮”在线笔记功能
2019/04/23 Javascript
vue使用自定义指令实现拖拽
2021/01/29 Javascript
JavaScript检测浏览器是否支持CSS变量代码实例
2020/04/03 Javascript
小程序Scroll-view上拉滚动刷新数据
2020/06/21 Javascript
python获取android设备的GPS信息脚本分享
2015/03/06 Python
python cx_Oracle模块的安装和使用详细介绍
2017/02/13 Python
Python利用Beautiful Soup模块创建对象详解
2017/03/27 Python
用python 实现在不确定行数情况下多行输入方法
2019/01/28 Python
wxPython实现绘图小例子
2019/11/19 Python
python 爬取马蜂窝景点翻页文字评论的实现
2020/01/20 Python
Python虚拟环境venv用法详解
2020/05/25 Python
python 爬虫如何正确的使用cookie
2020/10/27 Python
python+openCV对视频进行截取的实现
2020/11/27 Python
香港通票:Hong Kong Pass
2019/02/26 全球购物
学前教育教师求职自荐信
2013/09/22 职场文书
实习生自我鉴定范文
2013/12/05 职场文书
班干部演讲稿
2014/04/24 职场文书
视光学专业自荐信
2014/06/24 职场文书
解除劳动合同证明书模板
2014/11/20 职场文书
2015年学生管理工作总结
2015/05/26 职场文书
信息简报范文
2015/07/21 职场文书
2021好看的国漫排行榜前十名 《完美世界》上榜,《元龙》排名第一
2022/03/18 国漫