2011-07-23 59 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 
相關問題