2016-06-16 121 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

啊!我懂了。謝謝。如何將「我」的值傳遞給函數? –

+0

好吧,'我'將基於範圍已經可用,所以你不必擔心那個 – Deryck

回答

1

您傳遞給page.evaluate的功能將無法訪問存在的變量在幻影腳本中;這是因爲功能代碼被傳遞到頁面,然後評估。

使用這種形式的page.evaluate通過i

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