PhantomJS 使用了 WebKit内核,是一个真正的布局和渲染引擎,它可以像屏幕截图一样捕获一个web界面。因为它可以渲染网页中的人和元素,所以它不仅用到HTML,CSS的内容转化,还用在SVG,Canvas。可见其功能是相当强大的。PhantomJS 可以用于 页面自动化 , 网络监测 , 网页截屏 ,以及 无界面测试 等。PhantomJS 支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, Canvas, 和 SVG。
下载phantomjs-1.9.8-macosx.zip并解压,bin/phantomjs直接可用。
或者通过Homebrew安装
brew update && brew install phantomjs
或者通过MacPorts安装
sudo port selfupdate && sudo port install phantomjs
安装完phantomjs 之后,将其可执行路径加入到PATH中。
hello world
新建hello.js,添加如下代码:
console.log('Hello, world!');
phantom.exit();在命令行里执行:
phantomjs hello.js
会输出:
Hello, world!
第一行代码,console.log会打印字符串到命令行。第二行代码,phantom.exit会终止执行过程。
注意:一定不要忘了在代码里调用phantom.exit,否则PhantomJS将不会被终止
页面加载
通过page 对象,我们可以加载,分析,渲染页面。
下面的代码展示了page 对象最简单的用法。它加载example.com然后将其保存为一个图片example.png。
var page = require('webpage').create();
page.open('http://example.com', function() {
page.render('example.png');
phantom.exit();});PhantomJS基于Webkit引擎,可以布局和渲染页面,我们可以利用这一点给网页拍照。
要想在网页的上下文中对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);
});
});
由于脚本好像是一个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()
});
});
下面的loadspeed.js,加载一个指定的URL,然后测量加载页面所需时间。
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 ' + system.args[1]);
console.log('Loading time ' + t + ' msec'); }
phantom.exit();});从命令行执行(注意有http):
phantomjs loadspeed.js http://www.google.com
输出结果类似下面这样:
Loading http://www.google.com Loading time 719 msec
执行脚本
想要在页面的上下文里执行javascript或者coffeescript代码,要使用evaluate()函数。evaluate()可以返回一个对象,但必须是一个简单的对象,不能包含函数或者闭包。
下面的代码展示了如何显示一个网页的title:
var page = require('webpage').create();
page.open(url, function(status) { var title = page.evaluate(function() { return document.title; });
console.log('Page title is ' + title);
phantom.exit();});默认情况下,页面代码里的console输出的消息,以及evaluate()里的console输出的消息都不会显示出来。不过,通过使用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); });
phantom.exit();});evaluate()里的代码就像在浏览器里执行一样,所以像标准的DOM操作、CSS选择等都可以正常进行。我们可以利用这一点将一些页面工作自动化。
网络请求与返回
当页面向服务器请求资源时,通过onResourceRequested 和 onResourceReceived 回调函数可以 记录request和response。例如:
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);基于此我们可以进行一些页面性能的分析。
简简单单,pfan!出来混的,一切都是要还的。
未经书面许可,严禁将本网内容作为AI训练资源。
33台词PC版 0.1
文件批量改名Bulk Rename Utility v3.4.1 中文绿色版
PDF快转(SanPDF) v2.0.6.66 官方版
菲菲更名宝贝之得意非凡FFRenamePro V4.0专业版
查找大文件(WizTree) v3.35 绿色版
文件比较查重工具WinMerge v2.16.8.0 中文版
Windows文件管理器(WinNc) v9.4.0.0 官方安装版
文件压缩档案提取(Explzh) v8.18 官方版
WinMerge v2.16.7.0 官方多语中文版
UltraCompare文件比较工具汉化修正中文版 V21.10.0.20免费64位注册码绿色版
文档自动转换工具BlackIce BiBatchConverter v4.80.632 官方版
批量文本文件处理器 V1.4绿色版
MAXHUB文档客户端 v1.3.1官方PC版
文件校验工具(EF CheckSum Manager) v20.02 官方版
全速pdf转换成excel转换器 v7.8.0.0官方版