2011-07-23 2 views
0

J'ai essayé de créer un script simple dans FireWatir qui convertira l'intégralité du DOM du document courant (y compris le code généré par javascript) en représentation XML.comment puis-je vider une page html en XML avec watir & JavaScript?

suivantes leads sur le web j'ai venu avec ce script

require 'rubygems' 
require 'firewatir' 


browser = Watir::Browser.new 
browser.goto('http://www.google.com/') 
browser.text_field(:id, 'lst-ib').set('hello') 
browser.button(:name, 'btnG').click 
puts browser.execute_script("new XMLSerializer().serializeToString(document)") 

cependant en cours d'exécution dans Firefox 3.6, ont donné lieu à cette erreur:

c:/Ruby192/lib/ruby ​​/ gemmes/1.9.1/gemmes/firewatir-1.9.2/lib/firewatir/jssh_socket.rb : 19: dans js_eval': XMLSerializer is not defined (JsshSocket::JSReferenceError) from c:/Ruby192/lib/ruby/gems/1.9.1/gems/firewatir-1.9.2/lib/firewatir/firefox.rb:136:in execute_script 'de test.rb: 9: dans `'

si j'entre cette ligne:

javascript:window.open('aout:blank').document.write('<pre>' + unescape((new  XMLSerializer()).serializeToString(document).replace(/</g, '&lt;')) + '</pre>') 

dans la zone d'emplacement FF, je reçois une page avec le XML souhaité. donc XMLSerializer doit être défini quelque part, c'est juste hors de la portée de mon code JS.

comment puis-je faire fonctionner ça?

Répondre

1

Je ne sais pas ce que vous entendez par « zone d'emplacement », mais si c'est la barre d'adresse (celui qui dit http://stackoverflow.com/... à cette page), essayez ceci:

browser.goto "javascript:window.open('aout:blank').document.write('<pre>' + unescape((new  XMLSerializer()).serializeToString(document).replace(/</g, '&lt;')) + '</pre>')" 
+0

Yap ne signifie la barre d'adresse, et je l'ai essayez cette approche, mais cela mène à un onglet de chargement sans fin dans firefox jusqu'à ce que watir abandonne et a jeté une exception de délai d'expiration. Ce que je ne comprends pas, c'est pourquoi je ne peux pas accéder à l'objet XMLSerilizer à partir du code, il est clair que FF le sait! – Sam

1

A u coeur de celui-ci, Je suppose que cela pourrait être une chose FF à faire avec les limites de la «sandbox» que javascript est en cours d'exécution. Le navigateur lui-même peut connaître le sérialiseur, mais ne pas choisir d'y donner un accès javascript.

Cependant, il peut y avoir plus d'une façon de dépecer le chat. Si votre second bit de code fournit une page qui est rendu sous forme de texte dans la syntaxe XML, pourquoi ne pas faire d'abord, puis il suffit d'utiliser la page qui par

puts browser.text 
Questions connexes