PhantomJS是否应该为本地html文件加载本地js

时间:2016-02-26 04:55:27

标签: javascript phantomjs

我正在使用phantomjs加载本地html,它正在加载本地js文件,所以路径是这样的:

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

和page.html包含page.js文件,我可以通过加载file:///Users/me/html/page.html来验证该文件,并在控制台中查看该页面的console.log

现在这个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是否应该从正在打开的页面运行js?或不?如果那就是我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

PhantomJS页面无法直接识别文件系统,page.js脚本几乎对您的页面不可见,即使它们位于同一目录中。您可以使用Phantom的injectJs在创建页面后,在评估之前动态注入脚本,而不是直接在HTML中包含脚本。 injectJs将接受脚本的绝对本地路径,Phantom脚本本身的路径 relative 或远程脚本,但不接受与页面相关的路径。

修改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);
        }
    }
});