如何使用PhantomJS获取属性?

时间:2015-06-28 07:10:21

标签: javascript phantomjs

我正在尝试使用PhantomJS从表单中获取属性'value':

<input type="text" name="uniq_num" value="2PskzYavnHJa">

这是我的剧本:

var page = require('webpage').create();
var url = 'http://example.com/';

page.open(url, function (status) {
    if (status === 'success') {
        page.injectJs('https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js');
        var input = $(document).ready(function(){
        return $('input[name="uniq_num"]').attr('value');
    });

    console.log(input);
    phantom.exit();
 }

但它不起作用。

1 个答案:

答案 0 :(得分:2)

PhantomJS有一个沙盒DOM上下文(页面上下文),你只能通过page.evaluate()访问它:

page.open(url, function (status) {
    if (status === 'success') {
        page.includeJs('https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js', function(){
            var input = page.evaluate(function(){
                return $('input[name="uniq_num"]').attr('value');
            });
            console.log(input);
            phantom.exit();
        });
    }
}

请勿将page.injectJs()page.includeJs()混淆。其中一个采用URL和回调,因为它是异步的,另一个采用本地文件名。你也不需要jQuery:

page.open(url, function (status) {
    if (status === 'success') {
        var input = page.evaluate(function(){
            return document.querySelector('input[name="uniq_num"]').value;
        });
        console.log(input);
        phantom.exit();
    }
}

请注意:

  

注意: evaluate函数的参数和返回值必须是一个简单的原始对象。经验法则:如果它可以通过JSON序列化,那就没关系了。

     

闭包,函数,DOM节点等将工作!