2016-06-16 13 views
-1

重複していると思われる質問への回答は、関数にパラメータを渡す方法を説明していますが、実際に質問を読んでいれば、もともとはスクリプトがハングしていることがわかります。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 

私はタイプミスを持っていないと思いますなぜ私のループが機能していないのか分からない。

おかげ

アップデート:私はこれに私のスクリプトを変更したデリックの助けに

ありがとう:

"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] 
+0

私は実際にPhantomJSを使ったことがないが、あなたが '文書を持ってどこにでもいるようだ[...]'仕事に成功さて、あなたはそれをラップする必要があります。 'page.evaluate(function(){...})'の中で、あなたの* for-loop *はラップされていません。 – Deryck

+0

ああ!そうですか。ありがとう。関数に "i"の値を渡すにはどうすればよいですか? –

+0

まあ、 'i'は既にスコープに基づいて利用できるようになりますので、心配する必要はありません – Deryck

答えて

1

page.evaluateに渡す関数は、現在の変数にアクセスすることはできませんファントムのスクリプトで。機能コードが、次にと評価されたためです。

使用page.evaluateのこのフォームをiを渡す:

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