PhantomJS - 试图找出元素是否为空

时间:2016-02-15 19:59:22

标签: javascript dom phantomjs

我正在尝试编写一个简单的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();

1 个答案:

答案 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);