【原】使用PhantomJS模拟用户在网页上的操作

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

此条目发表在 HTML/Javascript/CSS, Linux编程 分类目录。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>