我正在尝试编写一个简单的PhantomJS脚本,我在其中找到一个ID元素并确定它是否为空。我尝试了一些建议的东西,比如.childNodes.length,.textContent等。 这些都会导致空错误:
TypeError: null is not an object (evaluating 'document.getElementById('idname').childNodes')
或幻像只是崩溃并拒绝检查链接,通常如果我连续两次运行我的脚本而没有太多停顿会发生这种情况。它有时会坐着什么都不做。 我已经编写了其他有效使用getElementById的刮刀,并且它们是成功的,尽管我只是通过检查它是否存在来检查元素是否存在!== null。手动检查,这个元素确实存在于我正在检查的所有页面中,它只是有时有内容而有时没有(它是div)。无论如何,这是我的代码:
var fs = require('fs')
var urls = fs.read('urls.txt').split('\n');
var page;
page = require('webpage').create();
console.log('The default user agent is ' + page.settings.userAgent);
page.settings.userAgent = 'SpecialAgent';
function check_link(url){
page = require('webpage').create();
page.open(url, function(status){
if (status !== 'success') {
console.log('Unable to access network');
} else {
var error = page.evaluate(function() {
return document.getElementById('error-message');
});
console.log(error.childNodes.length);
fs.write('results.csv', error.childNodes.length + ', ' + url + '\n', 'a');
page.release();
setTimeout(next_link, 1000);
}
});
}
function next_link(){
var url = urls.shift();
console.log(url);
if(!urls){
phantom.exit(0);
} else{
check_link(url);
}
}
next_link();
答案 0 :(得分:4)
PhantomJS通过page.evaluate()
提供对沙盒页面上下文(DOM上下文)的访问,并附带以下注释:
注意:
evaluate
函数的参数和返回值必须是一个简单的原始对象。经验法则:如果它可以通过JSON序列化,那就没关系了。闭包,函数,DOM节点等将不工作!
因此,您无法将DOM节点传递出页面上下文,但您可以在页面上下文中使用完成所需的一切,然后传递结果。
var errors = page.evaluate(function() {
var e = document.getElementById('error-message');
return (e && e.childNodes) ? e.childNodes.length : -1
});
console.log(errors);