phantomjs 是什么?

PhantomJS是一个无界面的,可脚本编程的WebKit浏览器引擎。它原生支持多种web 标准:DOM 操作,CSS选择器,JSON,Canvas 以及SVG。

phantomjs 可以做什么?

  • 无UI界面的网站测试
  • 屏幕快照
  • 页面操作自动化
  • 网络监控

下载安装

找到对应版本下载安装,或是通过源码编译安装。

window

下载phantomjs-1.9.8-windows.zip并解压,phantomjs.exe直接可用。方便起见,把phantomjs.exe所在目录加入到PATH

MAC OS X

下载phantomjs-1.9.8-macosx.zip并解压,bin/phantomjs直接可用。

或者通过Homebrew安装

brew update && brew install phantomjs

或者通过MacPorts安装

sudo port selfupdate && sudo port install phantomjs

Linux

64位下载phantomjs-1.9.8-linux-x86_64.tar.bz2

32位下载phantomjs-1.9.8-linux-i686.tar.bz2

安装渲染所需(FreeType,Fontconfig)依赖:

sudo apt-get install fontconfig freetype libfreetype.so.6 libfontconfig.so.1 libstdc++.so.6

快速开始

安装完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引擎,可以布局和渲染页面,我们可以利用这一点给网页拍照。

下面的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);

基于此我们可以进行一些页面性能的分析。

phantomjs 是什么?----主要是mac下面的更多相关文章

  1. MAC 上的Phantomjs的安装和配置

    1.下载 http://phantomjs.org/download.html 选择mac版本下载 2.下载完成后,解压缩,然后放到自己的一个目录下面 例如:/usr/local/Phantomjs/ ...

  2. Mac与Phy组成原理的简单分析

    1. general 下图是网口结构简图.网口由CPU.MAC和PHY三部分组成.DMA控制器通常属于CPU的一部分,用虚线放在这里是为了表示DMA控制器可能会参与到网口数据传输中. 对于上述的三部分 ...

  3. Mac OS环境下配置Myeclipse2015的经验

    反复测试装了多次,现在把成功安装的方法陈列如下: 1. 相关的资源: (1)下载 myeclipse-2015-stable-2.0-offline-installer-macosx.dmg 链接:h ...

  4. 最近新装系统windows8.1+Mac。。。还没装驱动就遇到一堆问题。。。

    ---恢复内容开始--- 1,刚开始装好了,后来莫名看不到磁盘了,原因:64位mac盘会丢失盘符,所以macdrive也看不到...解决:(将AF改为06,修改内容后改回AF,早知道这么简单就不用重新 ...

  5. iOS之 Mac下抓包工具使用wireshark

    主要是mac上面网卡的授权 分三个步骤:    1.wireshark安装        wireshark运行需要mac上安装X11,mac 10.8的系统上默认是没有X11的.先去http://x ...

  6. 开始使用Mac OS X——写给Mac新人

    本文转自博客园:http://www.cnblogs.com/chijianqiang/archive/2011/08/03/2126593.html 写这篇文档的原因有两个,一.身边使用Mac的朋友 ...

  7. 如何解决Mac与iPhone之间handoff连接问题

    首先账户以及设备handoff开关问题不再赘述.主要是昨天发现的一个小技巧 当确认所有设备的iCloud账号统一.蓝牙打开.处在同一WiFi下的前提下,我的iPhone和Mac仍然handoff连接有 ...

  8. 【转】开始使用Mac OS X——写给Mac新人

    写这篇文档的原因有两个,一.身边使用Mac的朋友越来越多,经常会有人来咨询一些常见的使用问题,比如:“为什么把界面右上角的红色按钮叉掉,程序还没有关闭?”之类.而且我也不愿意看到很多人使用OSX时仅仅 ...

  9. Lodop获取客户端主网卡ip地址是0.0.0.0

    LODOP技术手册的GET_SYSTEM_INFO篇,LODOP可以用语句获取到客户端很多信息,NetworkAdapter.1.IPAddress是主网卡IP地址,通常情况下是没问题的,不过如果当前 ...

随机推荐

  1. java内部类(一)

    内部类(一) 一.定义: 内部类就是定义在另一个类内部的类,与之对应,包含内部类的类就是外部类. 二.作用: 1.内部类提供更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包之中的其他类访问该类 ...

  2. JSP解决:Attempt to clear a buffer that&#39;s already been flushed错误(jsp:forward标签跳转空白)

    [摘要:本日正在开辟过程当中发明一个题目:正在页里中应用了jsp:forward扔错Attempt to clear a buffer that's already been flushed!! 百思 ...

  3. VBV Rate Control

    Part 1 <06/05/07 12:08pm> Manao | he is negating a float by printing it, adding a "-" ...

  4. 通过IIS操作修改服务器文件没有权限的解决办法

    问题描述:通过部署在IIS上的程序去操做文件(比如删除.旋转图片等)时,在本地执行没有问题,但是部署到服务器上提示“没有权限”.解决方法:找到你需要操作的文件的根文件夹,右键点击属性 选择“安全”选项 ...

  5. python3 读取dbf文件报错 UnicodeDecodeError: 'gbk' codec can't decode

    在读取dbf文件时由于编码问题报错:UnicodeDecodeError: 'gbk' codec can't decode byte 0xb5 in position 49: incomplete ...

  6. DLLImport的用法C#

    它来调用WIN32的API或者调用一下C或C++编写的DLL.使用实例:将编译好的C++ DLL拷贝到BIN目录(DLLImport会从程序启动目录BIN开始查找相应名称的DLL,未找到则转至syst ...

  7. gstreamer如何查看相关插件信息(src/sink)?

    gstreamer及相关插件编译完成后,会输出gst-inspect可执行文件,相关信息如下: drwxrwxr-x yingc yingc 6月 : glib-/ drwxrwxr-x yingc ...

  8. npm run dev

     npm run dev     npm run build

  9. Oracle JDBC驱动安装到Maven本地仓库

    Oracle JDBC驱动因为授权问题,没有放到Maven的中央仓库里面,当然了,阿里云的镜像也没有了.所以要从Oracle官网下载驱动: 注意下载ojdbc6.jar  因为这个JDK1.8才能用. ...

  10. ffmpeg -i 10.wmv -c:v libx264 -c:a aac -strict -2 -f hls -hls_list_size 0 -hls_time 5 C:\fm\074\10\10.m3u8

    ffmpeg -i 10.wmv -c:v libx264 -c:a aac -strict -2 -f hls -hls_list_size 0 -hls_time 5 C:\fm\074\10\1 ...