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

标签 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();

最佳答案

PhantomJS 通过 page.evaluate() 提供对沙盒页面上下文(DOM 上下文)的访问带有以下注释:

Note: The arguments and the return value to the evaluate function must be a simple primitive object. The rule of thumb: if it can be serialized via JSON, then it is fine.

Closures, functions, DOM nodes, etc. will not work!

因此您不能将 DOM 节点传递到页面上下文之外,但您可以页面上下文中用它做任何您想做的事情,然后传递结果。

var errors = page.evaluate(function() {
    var e = document.getElementById('error-message');
    return (e && e.childNodes) ? e.childNodes.length : -1
});
console.log(errors);

关于javascript - PhantomJS - 试图找出一个元素是否为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35417983/

相关文章:

javascript - 如何列出我域中的所有评论

javascript - 返回函数内的函数

javascript - 为 JavaScript 请求自动添加 SourceMap header

javascript - 将节点添加到 div

JavaScript:将节点复制到 DocumentFragment

javascript - 异步删除 DOM 元素的子元素?

centos - 在服务器上使用/安装库,无需 sudo

javascript - 如何在 CasperJS 中单击此按钮?

javascript - Jquery没有冲突不工作

reactjs - 如何将 store 作为 prop 显式传递给 "Connect()"