2011-07-23 24 views
0

我一直在尝试在FireWatir中创建一个将整个当前文档DOM(包括JavaScript生成的代码)转换为XML表示的简单脚本。在网络上如何使用watir和JavaScript将XML页面转储为XML?

以下线索,我此脚本想出了

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

然而,在Firefox 3.6中运行它,导致了这个错误:

C:/ Ruby192/lib中/红宝石/宝石/ 1.9.1 /宝石/ firewatir-1.9.2/LIB/firewatir/jssh_socket.rb :19: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 '从test.rb:9:在`'

如果我进入这一行:

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

进入FF位置框,我得到一个页面,所需的XML。所以XMLSerializer必须在某个地方定义,它的JS代码似乎遥不可及。

我该如何得到这个工作?

回答

1

不知道你的“位置框”的意思,但如果这是地址栏(即在这个页面说http://stackoverflow.com/...的一个),那么试试这个:

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

邑使用产生的页面确实意味着地址栏,我也尝试这种方法,但是这会导致firefox中永不结束的加载标签,直到watir放弃并抛出超时异常。 我没有得到的是为什么不能从代码访问XMLSerilizer对象,显然FF知道它! – Sam

1

它的一个T中的核心,我怀疑这可能是一个关于javascript运行的'沙盒'边界的FF事情。浏览器本身可能知道序列化程序,但不会选择给JavaScript任何访问权限。

但是,可能有多种方法来剥皮猫。如果你的代码的第二位为您提供了在XML语法呈现为文字的网页,为什么不这样做第一,然后只需通过

puts browser.text 
相关问题