2016-02-26 817 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); 
     } 
    } 
});