2017-07-06 10 views
0

ウェブサイトの完全なDOMを読み込み、後で各要素を処理したいと思います。サンプルコード/テストケースは、ウェブサイトのすべてのタグを記録します。PhantomJSでDOM要素を処理する

これは、通常のブラウザ内で完璧に動作します:

var dom = document.getElementsByTagName('*'), 
    i; 

for (i in dom) 
{ 
    console.log(dom[i] && dom[i].tagName ? dom[i].tagName : 'invalid'); 
} 

このテストケースのログ:

HTML 
BODY 
DIV 
...etc... 

これはPHANTOMJS内では動作しません:

var page = require('webpage').create(); 

page.open('https://google.com', function() 
{ 
    var dom = page.evaluate(function() 
     { 
      return document.getElementsByTagName('*'); 
     }), 
     i; 

    for (i in dom) 
    { 
     console.log(dom[i] && dom[i].tagName ? dom[i].tagName : 'invalid'); 
    } 
    phantom.exit(); 
}); 

を何らかの理由で、のみ最初のオブジェクトには値が含まれています。したがって、このテストケースはログに記録されます:

HTML 
invalid 
invalid 
... 

ヘルプが必要です!ドキュメントからあなた

答えて

1

ありがとう:

注:評価関数の引数と戻り値は 簡単なプリミティブオブジェクトでなければなりません。経験則:JSONを使って をシリアル化することができれば、それは問題ありません。

クロージャ、関数、DOMノードなどは機能しません!

最後に、答えを見つけました... の方法で単純なオブジェクトを準備して返してください。

var page = require('webpage').create(); 

page.open('https://google.com', function() 
{ 
    var dom = page.evaluate(function() 
     { 
      var temp = document.getElementsByTagName('*'), 
       tempArray = [], 
       j; 

      for (j in temp) 
      { 
       tempArray.push(
       { 
        tagName: temp[j].tagName, 
        className: temp[j].className 
       }); 
      } 
      return tempArray; 
     }), 
     i; 

    for (i in dom) 
    { 
     console.log(dom[i] && dom[i].tagName ? dom[i].tagName : 'invalid'); 
     console.log(dom[i] && dom[i].className ? dom[i].className : 'invalid'); 
    } 
    phantom.exit(); 
}); 
関連する問題