PhantomJS 是一个可以使用代码控制的没有界面的浏览器,使用的是WebKit核心。
主页:http://phantomjs.org/
使用phantomjs可以进行网页测试,比如使用代码控制在页面的文本框中输入内容,或是控制点击某个按钮,提交表单等等,最简单的应用就是进行自动登陆获取信息,或是抓取搜索引擎内容等等。
具体的使用方法参见其文档,入门非常简单,下面是一个简单的例子
var page = require('webpage').create(); 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; // 1 }); } phantom.exit(); }); |
这段代码将打开网页,并将1处的代码加入到网页中进行执行。这里需要注意一下,上述例子中的代码虽然是写在一个js文件中,却是在两个完全不同的环境中执行,例子中整段代码(除了1处这一行)都是用来对phantomjs这个“浏览器”进行控制的,而1处的代码是植入到已经加载的页面中执行的,因此1处的代码是看不到这个js文件中的函数和变量的。比如下面这个例子就会报错:
var some_var = 10; var page = require('webpage').create(); page.open('http://www.httpuseragent.org', function (status) { if (status !== 'success') { console.log('Unable to access network'); } else { var ua = page.evaluate(function () { var new_var = some_var; // 报错:找不到变量some_var return document.getElementById('myagent').textContent; // 1 }); } phantom.exit(); }); |
但是做页面自动操作时常需要使用变量填写表单等,这时需要用点小技巧将变量从“外边”传进来,我的方法就是将1处整个function写成字符串,将变量拼在字符串中:
var some_var = 10; var page = require('webpage').create(); page.open('http://www.httpuseragent.org', function (status) { if (status !== 'success') { console.log('Unable to access network'); } else { var ua = page.evaluate("function () {\ var new_var = "+some_var+";\ return document.getElementById('myagent').textContent;\ }"); } phantom.exit(); }); |
但是后来看文档发现官方其实有解决方法:
https://github.com/ariya/phantomjs/wiki/API-Reference-WebPage#evaluatefunction-arg1-arg2–object
另外,在page.evaluate方法中传入的函数中的console.log也需要特殊处理才能打印在终端中,见官方文档:
https://github.com/ariya/phantomjs/wiki/API-Reference-WebPage#wiki-webpage-onConsoleMessage