2014-09-26 32 views
0

我一直在尋找如何使用PhantomJS自動化網頁上的操作,但是我有問題操縱頁面來做我想做的事。我正在使用this as test site。我已經設法讓Phantom打開網頁,並從#result範圍中刪除隨機句子。但是現在我想要做的是在不重新啓動腳本的情況下獲得另一個句子。我不想關閉並重新打開頁面,因爲Phantom需要很長時間才能啓動webkit並加載頁面。所以我想我可以通過讓Phantom點擊句子框下方的「刷新」按鈕來獲得另一個句子。這是我目前所面對的:點擊一個鏈接不刷新內容

var page = require('webpage').create(); 

console.log("connecting..."); 

page.open("http://watchout4snakes.com/wo4snakes/Random/RandomSentence", function(){  
    console.log('connected'); 
    var content = page.content; 
    var phrase = page.evaluate(function() { 
     return document.getElementById("result").innerHTML; 
    }); 

    console.log(phrase); 
    page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() { 
     page.evaluate(function() { 
      $("frmSentence").click(); 
     }); 
    }); 

    var content = page.content; 
    var phrase = page.evaluate(function() { 
     return document.getElementById("result").innerHTML; 
    }); 

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

正如你可以看到我試圖通過使用.click()功能,單擊刷新按鈕,但是這不是我的工作,因爲我仍然得到句子相同預先。鑑於該按鈕的HTML:

<form action="/wo4snakes/Random/NewRandomSentence" id="frmSentence" method="post" novalidate="novalidate">   
    <p><input type="submit" value="Refresh"></p> 
</form> 

我不知道我應該在腳本中引用什麼被點擊?我正在嘗試表單ID'frmSentence',但這不起作用。我想知道如果.click()是正確的方式去做這件事,有沒有什麼方法幻影提交按鈕鏈接到的形式?或者,也許我可以在獲取該句子的頁面上運行關聯的腳本?我有點迷失在這一個,所以我不知道我應該去哪個方法?

回答

0

網絡報廢是關於將需要信息發送到Web服務器並獲得結果。這與行爲不像用戶點擊按鈕或輸入搜索條件無關。 您只需在本示例中發送POST請求至http://watchout4snakes.com/wo4snakes/Random/NewRandomSentence即可。結果只是page.content中的文字,它甚至不需要評估。因此,要獲得多個句子,您只需執行一個循環即可。page.open

+0

感謝您的回答。我使用'page.open'的最初問題是需要很長的時間來連接和獲取數據,我希望能夠相對無縫地獲得一個新句子。如果只是將POST發送到給定的地址,那麼在頁面仍然打開的情況下,是否可以使用Phantom自動執行此操作?或者正在發送'page.open'命令的POST部分? – kmahon99 2014-09-26 11:56:38

+0

如果你打開'NewRandomSentence',你可以嘗試'page.reload()'。但是你可能需要測試可靠性。我每次用3個迷你步驟搜索100K +數據(搜索,到詳細頁面,下載報告),並且PhantomJS經常碰撞5次請求。更改後爲每個請求做page.open它稍微更可靠,每次崩潰100個請求左右。也許這只是爲了https而不是http我不確定。 – wayne 2014-09-26 12:24:11

0

您的控制流程有問題。 page.includeJs是一個異步功能。如果您還有其他一些語句page.includeJs,它們可能在加載腳本並執行回調之前執行。這意味着在你的情況下,你甚至在觸發點擊之前已經閱讀了2次這個句子。

如果你想這樣做多次,我建議使用遞歸,因爲你不能同時寫這個。另外,由於您希望這樣做速度很快,因此有時請求可能會更快(您會失去時間),有時會更慢(腳本中斷),因此您無法使用靜態setTimeout超時1秒。您應該使用waitFor from the examples

而不是每次加載jQuery,您可以向上移動page.includeJs並在其回調中包含其他所有內容。如果你只需要點擊一個元素,或者如果jQuery點擊不起作用(是的,那會不時發生),你應該使用PhantomJS; click an element

相關問題