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 相关文章推荐
javascript Split方法,indexOf方法、lastIndexOf 方法和substring 方法
Mar 21 Javascript
js定时器怎么写?就是在特定时间执行某段程序
Oct 11 Javascript
setTimeout和setInterval的深入理解
Nov 08 Javascript
js unicode 编码解析关于数据转换为中文的两种方法
Apr 21 Javascript
jquery基础知识第一讲之认识jquery
Mar 17 Javascript
Bootstrap4一次重大更新 几乎涉及每行代码
May 16 Javascript
jQuery增加和删除表格项目及实现表格项目排序的方法
May 30 Javascript
Vue.js实现简单ToDoList 前期准备(一)
Dec 01 Javascript
Vue-cli创建项目从单页面到多页面的方法
Sep 20 Javascript
Bootstrap Table快速完美搭建后台管理系统
Sep 20 Javascript
axios发送post请求springMVC接收不到参数的解决方法
Mar 05 Javascript
layui实现图片虚拟路径上传,预览和删除的例子
Sep 25 Javascript
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
VIM中设置php自动缩进为4个空格的方法详解
2013/06/14 PHP
跟我学Laravel之请求(Request)的生命周期
2014/10/15 PHP
Thinkphp5框架使用validate实现验证功能的方法
2019/08/27 PHP
JavaScript Chart 插件整理
2010/06/18 Javascript
JavaScript 判断日期格式是否正确的实现代码
2011/07/04 Javascript
Js点击弹出下拉菜单效果实例
2013/08/12 Javascript
JavaScript获取图片的原始尺寸以宽度为例
2014/05/04 Javascript
利用函数的惰性载入提高javascript代码执行效率
2014/05/05 Javascript
javascript实现复制与粘贴操作实例
2014/10/16 Javascript
浅谈Unicode与JavaScript的发展史
2015/01/19 Javascript
javascript实现随机显示星星特效
2016/01/28 Javascript
下雪了 javascript实现雪花飞舞
2020/08/02 Javascript
仿iframe效果Aajx文件上传实例
2016/11/18 Javascript
解决微信内置浏览器返回上一页强制刷新问题方法
2017/02/05 Javascript
Boostrap栅格系统与自己额外定义的媒体查询的冲突问题
2017/02/19 Javascript
vue的状态管理模式vuex
2017/11/30 Javascript
Node.Js中实现端口重用原理详解
2018/05/03 Javascript
JavaScript函数apply()和call()用法与异同分析
2018/08/10 Javascript
vue中的inject学习教程
2019/04/24 Javascript
手把手教你使用TypeScript开发Node.js应用
2019/05/06 Javascript
element中table高度自适应的实现
2020/10/21 Javascript
Python中splitlines()方法的使用简介
2015/05/20 Python
python如何通过twisted实现数据库异步插入
2018/03/20 Python
Python基础之文件读取的讲解
2019/02/16 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
2019/02/18 Python
Python实现序列化及csv文件读取
2020/01/19 Python
基于Keras中Conv1D和Conv2D的区别说明
2020/06/19 Python
北美大型运动类产品商城:Champs Sports
2017/01/12 全球购物
我心目中的好老师活动方案
2014/08/19 职场文书
房屋转让协议书
2014/10/18 职场文书
避暑山庄导游词
2015/02/04 职场文书
委托开发合同书(标准版)
2019/08/07 职场文书
SpringCloud的JPA连接PostgreSql的教程
2021/06/26 Java/Android
深入解析MySQL索引数据结构
2021/10/16 MySQL
Redis命令处理过程源码解析
2022/02/12 Redis
如何用H5实现好玩的2048小游戏
2022/07/23 HTML / CSS