为什么我的PhantomJS脚本挂起?

时间:2016-06-16 01:44:37

标签: javascript phantomjs

假设的重复问题的答案确实解决了如何将参数传递给函数的问题,但如果您实际上已经阅读了问题,那么您会看到它最初是关于脚本挂起的。

我是PhantomJS的新手,只是知道足够的javascript弄得一团糟。

这是我的剧本......

"use strict";
var page = require('webpage').create();

page.onConsoleMessage = function(msg) { console.log(msg); };

page.open("https://developer.amazon.com/home.html", function(status) {
        if (status === "success") {
                console.log("SUCCESS");
                var title = page.evaluate(function() { return document.title;});
                console.log( title );
                var forms = page.evaluate(function() { return document.forms;});
                console.log( forms.length );
                var num_elements = page.evaluate(function() {return document.forms[0].elements.length;});
                console.log( num_elements );
//              for each ( var e in document.forms[0].elements ) {
//                      console.log( "e.name = [" + e.name + " e.value = [" + e.value + "]" );
//              }
                for ( var i=0; i < document.forms[0].elements.length; i++ ) {
                        console.log( "name = [" + document.forms[0].elements[i].name + "]" );
                }
        } else {
                phantom.exit(1);
        }
        phantom.exit(0);
});

当我运行它时,我得到了这个输出,然后脚本似乎挂起了:

SUCCESS
Amazon.com Sign In
1
18

我认为我没有任何拼写错误,也不明白为什么我的循环无效。

由于

更新

感谢Deryck的帮助我将脚本修改为:

"use strict";
var page = require('webpage').create();

page.onConsoleMessage = function(msg) { console.log(msg); };

page.open("https://developer.amazon.com/home.html", function(status) {
        if (status === "success") {
                console.log("SUCCESS");
                var title = page.evaluate(function() { return document.title;});
                console.log( title );
                var forms = page.evaluate(function() { return document.forms;});
                console.log( forms.length );
                var num_elements = page.evaluate(function() {return document.forms[0].elements.length;});
                console.log( num_elements );
//              for each ( var e in document.forms[0].elements ) {
//                      console.log( "e.name = [" + e.name + " e.value = [" + e.value + "]" );
//              }
                for ( var i=0; i < num_elements; i++ ) {
                        console.log( i );
                        console.log( "name = [" +
                                page.evaluate(
                                        function() {
                                                return document.forms[0].elements[i].name
                                        }
                                )
                        + "]" );
                }
        } else {
                phantom.exit(1);
        }
        phantom.exit(0);
});

但是我收到了这个错误...

SUCCESS
Amazon.com Sign In
1
18
0
ReferenceError: Can't find variable: i

  undefined:2
  :3
name = [null]

1 个答案:

答案 0 :(得分:1)

传递给page.evaluate的函数将无法访问幻像脚本中存在的变量;这是因为函数代码被传递给页面,然后评估。

使用此page.evaluate形式传递i

console.log( "name = [" +
  page.evaluate(function(i) {
    return document.forms[0].elements[i].name;
  }, i)
+ "]");