记录phantomjs学习

Posted 一如年少模样

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记录phantomjs学习相关的知识,希望对你有一定的参考价值。

初次接触这个,一直跟着API 和网上的前辈学习,下面我就记录下学习的情况吧。

                                                                                                    -----------------坚持住,奔跑吧,小青年


一、初次见面

       phantomjs实现了一个无界面的webkit浏览器。虽然没有界面,但dom渲染、js运行、网络访问、canvas/svg绘制等功能都很完备,在页面抓取、页面输出、自动化测试等方面有广泛的应用。

      核心API:

webpage:如你所见,上面的例子我们已经见识了它的威力了。它的作用主要是提供了一套可以访问和操作web文档的核心方法,包括操作DOM、事件捕获、用户事件模拟等等。

system:该模块提供了一些与操作系统相关的接口,例如访问操作系统信息、访问系统环境变量、接受命令行参数等等与程序执行相关的系统信息。

fs:即FileSystem。熟悉NodeJS的朋友都知道,NodeJS也内建了相关的核心模块。fs提供了执行文件I/O操作的标准接口,如读写文件、删除文件等。它使得你持久化一些文件(如logfile等)变得非常容易。

webserver:如其名字一样,你可以基于它来实现自己的webserver,用来处理请求并且执行PhantomJS代码等。


API 地址:http://phantomjs.org/api/

二、安装使用

       下载地址:http://phantomjs.org/download.html,支持三种操作系统,window \\Mac OS\\linux,下载完成解压, 配置环境变量。打开我的电脑->右键属性->高级系统设置->高级标签->环境变量,在系统变量里找到Path,将你的phantomjs路径添加到环境变量里,不过记得在前面加个;号。可以试着运行hello.js看下效果。

三、代码分析

直接上代码 work.js

 var page = require('webpage').create();
 var fs=require("fs");
 phantom.outputEncoding="gbk";
 var url='http://127.0.0.1:8020/login/login.html';//本地的html 没有服务器交互,无cookie
 var url1="https://account.xiaomi.com/pass/serviceLogin";
 page.open(url1, function(status) 

 if ( status === "success" ) 
    var ret=page.evaluate(function()

        var form = document.getElementById("login-main-form");
        form.elements["username"].value = '用户名';
        form.elements["pwd"].value = '密码';
        form.elements["login-button"].click();  
        return document.title;
    ); 
    var url = page.url;
    console.log('URL: ' + url);//get page url
    console.log(ret)
    console.log(page.title); // get page title
    page.viewportSize =  width: 1366, height: 600 ;//设置页面的尺寸
    page.render('info_test.png');//截图
  else

    console.log("Page failed to load."); 
 
 setTimeout('print_cookies()',1000);
);

function print_cookies()

    console.info(JSON.stringify(page.cookies, undefined, 4))//打印
    //写入file
    file=fs.open("cookie.log",'w');
    file.write(JSON.stringify(page.cookies));
    file.close();

    phantom.exit()

分析以上代码:

引入web page模块,并创建实例。

var page = require('webpage').create();

设置为gbk防止访问信息乱码

phantom.outputEncoding="gbk"

page.open() 此方法用于打开一个网页,是一个很重要的API,它有四种调用形式:

第一种:open(url, callback)void

上段代码中就应用的这个方法,也是最简单的, callback()会在页面载入完成后调用,由page.onLoadFinished 调用(时机晚于 page.onLoadFinished )。这个callback 会接受一个参数 status ,可能值为 "success" 和 "fail" 。

第二种:open(url, method, callback)void,

第三种:open(url, method, data, callback) void

二 三差不多,举个官网的example , we make a request using the POST method, and include some basic data.(psot请求,携带一些基本的数据)

var webPage = require('webpage');
var page = webPage.create();
var postBody = 'user=username&password=password';

page.open('http://www.google.com/', 'POST', postBody, function(status) 
  console.log('Status: ' + status);
  // Do other things here...
);

第四种:open(url, settings, callback) void 携带一些设置,operation、header、encoding类型等等,

var webPage = require('webpage');
var page = webPage.create();
var settings = 
  operation: "POST",
  encoding: "utf8",
  headers: 
    "Content-Type": "application/json"
  ,
  data: JSON.stringify(
    some: "data",
    another: ["custom", "data"]
  )
;

page.open('http://your.custom.api', settings, function(status) 
  console.log('Status: ' + status);
  // Do other things here...
);

page.render() 能够把当前页面渲染成图片并输出到指定文件中。输出的文件格式由传入的文件扩展名决定,目前支持 PNG 、 JPEG 、 GIF 、 PDF 。

page.render('info_test.png');//截图

由于js语言是非阻塞的,所以有时候需要使用setTimtout setInterval来等待沙箱中执行的js语句,例如等待里面的ajax完成等。

举个倒计时的例子,按秒从10倒数到1,结束。

var t = 10,
interval = setInterval(function()
    if ( t > 0 ) 
        console.log(t--);
     else 
        console.log("BLAST OFF!");
        phantom.exit();
    
, 1000);

接下来看下fs

var fs=require("fs");也需要引入 创建实例的

fs.open(string path, string/Object parameters)

open() 方法接受两个参数,第一个参数是要打开的文件路径,第二个参数后面还会见到,这里统一说明。如果是字符串,则代表文件打开的模式,可选的有 'r' 、 'w' 、 'a/+' 、 'b' (read时仅支持 'b' );如果是一个对象,则表示配置项,一共有两个配置项,分别是 mode 和 charset , mode 就是刚刚提到的打开模式, charset 表示文件的编码类型。

    1 r      //读取文件
    2 w    //写文件,回覆盖
    3 a     //写文件,追加
    4 rb    //读取二进制流
    5 rw    //写入二进制流

如果对一个文件执行了open,请别忘了在文件使用完成后,再对其执行close。 本段代码就是把网页cookie保存到工程目录cookie.log下。


运行下代码:

运行完看下目录下是否多了一个图片和存储cookie的log文件。

以上是关于记录phantomjs学习的主要内容,如果未能解决你的问题,请参考以下文章

记录phantomjs学习

selenium+phantomJS学习使用记录

盘点selenium phantomJS使用的坑

linux下载phantomjs记录

复利青年编程记:又要从零开始一个领域

Phantomjs page.onConsoleMessage 不记录警告