2015-11-08 54 views
1

我試圖讓PhantomJS接受一個html字符串,然後讓它呈現整個頁面作爲瀏覽器(包括在頁面源代碼中執行任何javascript)。我需要得到的html結果作爲字符串。我已經看過page.open的例子,因爲我已經在我的數據庫中擁有頁面源代碼,所以它是沒有用的。PhantomJS如何在html字符串中呈現javascript

我是否需要使用page.open來觸發PhantomJS中的JavaScript渲染引擎?是否有無論如何做到這一切在內存中(即..沒有page.open做出請求或從磁盤讀取/寫入html源碼?

我已經看到了類似的問題和答案here但它並不完全解決我的問題。運行下面的代碼後,我什麼都不做,似乎呈現HTML源字符串中的JavaScript。

var page = require('webpage').create(); 
page.setContent('raw html and javascript in this string', 'http://whatever.com'); 
//everything i've tried from here on doesn't execute the javascript in the string 

--------------更新---- -----------

根據下面的建議嘗試了以下內容,但這仍然無效。只返回我提供的未提供javascript的原始源代碼。

var page = require('webpage').create(); 
page.settings.localToRemoteUrlAccessEnabled = true; 
page.settings.webSecurityEnabled = false; 
page.onLoadFinished = function(){ 
    var resultingHtml = page.evaluate(function() { 
     return document.documentElement.innerHTML; 
    }); 
    console.log(resultingHtml); 
    //console.log(page.content); // this didn't work either 
    phantom.exit(); 
}; 
page.url = input.Url; 
page.content = input.RawHtml; 
//page.setContent(input.RawHtml, input.Url); //this didn't work either 
+0

您使用哪個PhantomJS版本?請註冊onConsoleMessage,onError,onResourceError,onResourceTimeout事件([Example](https://gist.github.com/artjomb/4cf43d16ce50d8674fdf#file-1_phantomerrors-js))。也許有錯誤。 –

回答

0

setTimeout使它工作,即使我不興奮地等待每頁的設定時間量。所討論的here的waitFor方法不起作用,因爲我不知道每個頁面可能具有哪些元素。

var system = require('system'); 
var page = require('webpage').create(); 
page.setContent(input.RawHtml, input.Url); 
window.setTimeout(function() { 
    console.log(page.content); 
    phantom.exit(); 
}, input.WaitToRenderTimeInMilliseconds); 
+0

我可能會在將來嘗試類似checkin $ .active的活動來查看該頁面是否有任何掛起的ajax請求。然後我可以避免做一個setTimeout。 – sjdirect

+0

您也可以使用[這裏](http://stackoverflow.com/q/11340038/1816580)的一些建議等待整頁加載。 –

2

以下工作

page.onLoadFinished = function(){ 
    console.log(page.content); // rendered content 
}; 
page.content = "your source html string"; 

但你要記住,如果你從一個字符串設置頁面,該域名將是關於:空白。所以,如果從其他域的HTML加載資源,那麼你應該與--web-security=false --local-to-remote-url-access=true命令行選項運行PhantomJS:

 
phantomjs --web-security=false --local-to-remote-url-access=true script.js 

此外,您可能需要等待JavaScript執行的完成,這可能是不被當PhantomJS完成認爲它完成了。使用setTimeout()等待靜態時間或waitFor()等待頁面上的特定條件。在這個問題中給出了更穩健的等待整頁的方法:phantomjs not waiting for 「full」 page load

+0

感謝您的回覆。我用代碼嘗試了你的建議更新了我的問題。這仍然不能解決我的問題。只需返回我提供的未提供的原始源代碼。 – sjdirect

+1

你還沒有說任何關於你的頁面在做什麼,所以我提供了一個普遍的答案。我現在也稍微擴展一下。 –

0

也許不是你想要的答案,但使用PhantomJsCloud.com您可以輕鬆地做到這一點,下面是一個例子:「新內容」 http://api.phantomjscloud.com/api/browser/v2/a-demo-key-with-low-quota-per-ip-address/?request={url:%22http://example.com%22,content:%22%3Ch1%3ENew%20Content!%3C/h1%3E%22,renderType:%22png%22,scripts:{domReady:[%22var%20hiDiv=document.createElement%28%27div%27%29;hiDiv.innerHTML=%27Hello%20World!%27;document.body.appendChild%28hiDiv%29;window._pjscMeta.scriptOutput={Goodbye:%27World%27};%22]},outputAsJson:false}的是替換原始內容的內容,以及「Hello World!」通過腳本放置在頁面中。

如果你想通過普通的PhantomJs來做到這一點,你需要在加載頁面內容之後使用injectJs或includeJs函數。

+0

PhantomJsCloud的文檔可以在http://api.phantomjscloud.com – JasonS

+0

找到哦,並披露,我寫了PhantomJsCloud – JasonS

相關問題