2016-02-26 88 views
2

我使用phantomjs加載本地HTML,它加載本地js文件,這樣的路徑是這樣的:是PhantomJS應該加載本地JS爲本地HTML文件

/Users/me/html/page.html 
/Users/me/html/page.js 

和頁面.html包含page.js文件,並且我可以通過加載file:///Users/me/html/page.html並在該頁面的控制檯中查看console.log ing來驗證該文件。

現在這個js文件也只是添加一個屬性到身體來測試這個問題,這正常工作。當我用PhantomJS加載這個html文件時,但是js文件不會改變DOM(即不會將該屬性添加到body)。

JS文件加載最後的HTML文件,因此它是在頁面的底部:

<html> 
    <head></head> 
    <body> 
    <script src="page.js"></script> 
    </body> 
</html> 

重新正常工作原理加載這個頁面,而是用phantom.js腳本它不:

var page = require("webpage").create(); 
var system = require("system"); 
var args = system.args; 
var pageURL = args[1]; 

page.open(pageURL, function(status) { 
    if (status !== 'success') 
    { 
    console.log(status); 
    } 
    else 
    { 
    var result = page.evaluate(function() 
    { 
     return document.body.getAttribute("data-changed") || "not found"; 
    }); 
    console.log(result); 
    } 
}); 

page.js看起來是這樣的:

document.body.setAttribute("data-changed", "true"); 
console.log("changed the page with js!") 

那麼,PhantomJS suppo sed從正在打開的頁面運行js?或不?如果是的話,我在這裏做錯了什麼?

+0

做了一個快速測試,它確實與PhantomJS v2.0.1dev工作,記錄'TRUE'。你的輸出/行爲是什麼? – Vaviloff

+0

您的[HTML無效](https://www.w3.org/TR/html5/semantics.html#the-html-element)。根目錄下不能有腳本元素。把它放進身體或頭部。 –

+0

你比我更有代表性,你也可以按編輯按鈕。 – erikvold

回答

2

PhantomJS頁面不直接瞭解文件系統,並且page.js腳本對於您的頁面幾乎不可見,即使它們位於相同的目錄中。您可以使用Phantom的injectJs在創建頁面之後以及評估之前動態注入腳本,而不是直接將腳本包含在HTML中。 injectJs將接受該腳本的絕對本地路徑,路徑相對到Phantom腳本本身或遠程腳本,但不是與頁面相關的路徑。

修改您page.open回調,像這樣:

page.open(pageURL, function(status) { 
    ... 
    else { 
     // try to inject page.js 
     if (page.injectJs('/Users/me/html/page.js')) { 
      // page.js was injected, so evaluate: 
      var result = page.evaluate(function() { 
       return document.body.getAttribute("data-changed") || "not found"; 
      }); 
      console.log(result); 
     } 
    } 
});