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

PhantomJS - Trying to find out if an element is empty or not

本文关键字:一个 元素 是否 PhantomJS      更新时间:2023-09-26

我正在尝试编写一个简单的PhantomJS脚本,其中我通过ID找到一个元素并确定它是否为空。 我已经尝试了一些建议的东西,例如.childNodes.length,.textContent等。这些都会导致空错误:

TypeError: null is not an object (evaluating 'document.getElementById('idname').childNodes')

或者 phantom 只是崩溃并拒绝检查链接,通常如果我连续运行两次脚本而没有太多暂停,就会发生这种情况。它有时会坐下来什么都不做。我已经编写了其他以这种方式有效地使用 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();

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