我有一个NodeJS服务器(express),它服务于包含iframe
的常规应用程序。索引页面加载的文件中的JS代码在iframe
上运行(获取数据和注入标记)。该应用程序可以在常规浏览器(Chrome,Firefox,...)中正常运行。现在我需要运行这个无头,所以,我设计了以下计划:
Gulp任务看起来像这样:
gulp.task('run-headless-pipeline', function() {
console.log('Running Headless Pipeline');
var phantomInstance;
var page;
phantom.create()
.then(function (instance) {
phantomInstance = instance;
return phantomInstance.createPage();
})
.then(function (p) {
page = p;
page.setting('webSecurityEnabled', 'no');
return page.open('http://localhost:3000');
})
.then(function (status) {
var result;
if(status === 'success') {
console.log('## Status', status);
result = page.invokeMethod('evaluate', function () {
function0();
function1();
return getResults();
});
}
return result;
})
.then(function(result) {
console.log(result);
})
.then(function() { phantomInstance.exit(); })
.catch(function (e) { console.log(e); phantomInstance.exit(); });
});
其中function0()
,function1()
和getResults()
是在localhost:3000
的索引页面中加载的JS文件中定义的方法。 function0
工作正常,但function1
会抛出异常,唯一特别之处在于它尝试访问iframe
中的内容。问题发生在以下几行:
var frame = document.getElementById('targetFrame');
var targetDocument = frame.contentWindow.document;
在Chrome中,此工作正常,targetDocument
变量包含iframe
中的文档,在PhantomJS中,targetDocument
为undefined
。
在我的搜索过程中,许多人建议运行PhantomJS,参数--web-security
设置为false
(或'no'
)。这不适合我。有什么想法吗?
我的设置如下: