我正在使用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?或不?如果那就是我在这里做错了什么?
答案 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);
}
}
});