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 相关文章推荐
JS去除字符串的空格增强版(可以去除中间的空格)
Aug 26 Javascript
jQuery 锚点跳转滚动条平滑滚动一句话代码
Apr 30 Javascript
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
Jun 28 Javascript
jquery下onpropertychange事件的绑定方法
Aug 01 Javascript
Angularjs制作简单的路由功能demo
Apr 14 Javascript
使用jQuery实现Web页面换肤功能的要点解析
May 12 Javascript
BootStrop前端框架入门教程详解
Dec 25 Javascript
详解JavaScript中this的指向问题
Jan 20 Javascript
jQuery插件HighCharts绘制的基本折线图效果示例【附demo源码下载】
Mar 07 Javascript
angular.JS实现网页禁用调试、复制和剪切
Mar 31 Javascript
jQuery实现点击下拉框中的值累加到文本框中的方法示例
Oct 28 jQuery
node.js中axios使用心得总结
Nov 29 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
php发送post请求函数分享
2014/03/06 PHP
Laravel 5.5 异常处理 &amp; 错误日志的解决
2019/10/17 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
2020/01/23 PHP
通过代码实例解析PHP session工作原理
2020/12/11 PHP
Shell脚本实现Linux系统和进程资源监控
2015/03/05 Javascript
浅谈jQuery中的事件
2015/03/23 Javascript
BootStrap实现树形目录组件代码详解
2016/06/21 Javascript
JS限制条件补全问题实例分析
2016/12/16 Javascript
JS数字千分位格式化实现方法总结
2016/12/16 Javascript
基于vue.js无缝滚动效果
2018/01/25 Javascript
Vue拖拽组件开发实例详解
2018/05/11 Javascript
jQuery基于闭包实现的显示与隐藏div功能示例
2018/06/09 jQuery
微信小程序连接服务器展示MQTT数据信息的实现
2020/07/14 Javascript
django模型层(model)进行建表、查询与删除的基础教程
2017/11/21 Python
Python读取properties配置文件操作示例
2018/03/29 Python
Python模拟登录的多种方法(四种)
2018/06/01 Python
基于python的ini配置文件操作工具类
2019/04/24 Python
django的csrf实现过程详解
2019/07/26 Python
基于Python+Appium实现京东双十一自动领金币功能
2019/10/31 Python
ansible-playbook实现自动部署KVM及安装python3的详细教程
2020/05/11 Python
详解向scrapy中的spider传递参数的几种方法(2种)
2020/09/28 Python
h5网页水印SDK的实现代码示例
2019/02/19 HTML / CSS
萨克斯第五大道的折扣店:Saks Fifth Avenue OFF 5TH
2016/08/25 全球购物
苹果音乐订阅:Apple Music
2018/08/02 全球购物
EMU Australia澳大利亚官网:澳大利亚本土雪地靴品牌
2019/07/24 全球购物
荣耀俄罗斯官网:HONOR俄罗斯
2020/10/31 全球购物
Linux管理员面试题 Linux admin interview questions
2014/11/01 面试题
党的群众路线教育实践活动对照检查材料(个人)
2014/09/24 职场文书
公司搬迁通知
2015/04/20 职场文书
2015学校六五普法工作总结
2015/04/22 职场文书
公司表扬信格式
2015/05/04 职场文书
上级领导检查欢迎词
2015/09/30 职场文书
2016年禁毒宣传活动总结
2016/04/05 职场文书
如何才能写好调研报告?
2019/07/03 职场文书
创业计划书之宠物店
2019/09/19 职场文书
SQL Server携程核心系统无感迁移到MySQL实战
2022/06/01 SQL Server