Ruby應(yīng)用httpwatch進行前端頁面自動化HttpWatch概述 HttpWatch是IE和Firefox瀏覽器上的一款插件工具,用來捕獲瀏覽過程中所產(chǎn)生的數(shù)據(jù)信息,并記錄其相關(guān)日志文件。雖然HttpWatch 能通過手動來控制運行,但很多時候為了提高效率,對于一些重復(fù)執(zhí)行的任務(wù),比如性能測試需要自動化來完成,這樣就可以使用HttpWatch來配合自動化 測試性能來自動獲取其相關(guān)數(shù)據(jù)信息,從而使得HttpWatch也能自動化進行操作。因此為了更好的配合自動化測試,HttpWatch插件專門提供自動 化接口類程序,以便外部程序來自動化獲取其已經(jīng)存在的數(shù)據(jù)信息。HttpWatch中提供了大約三十種以上的自動化接口,但只有四個主要的類用于控制 HttpWatch插件。 下圖就是描述了這個四個類與瀏覽器之間的關(guān)系: ![]() 四個主要的自動化接口類分別如下描述: 控制類(Controller Class) HttpWatch的控制出發(fā)點就是控制類,一個自動化客戶端使用它來創(chuàng)建一個HttpWatch插件實例,或者是打開一個已經(jīng)存在的實例文件。
插件類(Plugin Class) HttpWatch分別為IE和Firefox提供了插件類,它主要是針對Http協(xié)議交互提供啟動和停止方法去控制 HttpWatch的錄制功能,另外還提供了一些方法和屬性去管理和配置自動化錄制方式。其中插件類中的“GotoURL”方法可以用于重定向瀏覽任何指 定的URL地址。另外一些屬性則是為了說明客戶端中哪些網(wǎng)頁是否已經(jīng)加載完成,哪些請求是否是當(dāng)前的錄制請求。日志中的屬性信息可以說明錄制請求是否已經(jīng) 達到錄制的標準。 日志類(Log Class) 通過插件去訪問日志對象,獲取日志信息,這些日志信息就是HttpWatch錄制過程記錄的請求和響應(yīng)信息。日志類提供了許多 屬性和方法,并且允許對這些錄制的數(shù)據(jù)信息進行檢索和保存,或者以多種格式導(dǎo)出等等。另外,可以通過這個控制類的一個“OpenLog”方法打開一個日志 文件,并且返回這個日志文件的相應(yīng)的說明信息,這個說明信息包括的就是錄制過中的請求和響應(yīng)文件信息。 屬性類(Entry Class) 每個日志文件都包含一個屬性列表,且這個屬性列表中包括詳細的HTTP交互信息。這些內(nèi)容具體包括請求的資源信息和一些返回的信息。這個請求和響應(yīng)屬性信息提供了訪問頭文件和Cookies文件,這些信息都是在與服務(wù)器發(fā)生交互過程中產(chǎn)生的。 Ruby自動化控制HttpWatch首先,在httpwatch中調(diào)用Ruby,必須要安裝ruby工具包 其次通過Ruby去訪問httpwatch需要調(diào)用ruby的相關(guān)庫文件,httpwatch自動化庫中已經(jīng)包含了一個com組建,為了使用ruby去訪問它就需要引入“win32ole”庫文件,通常在代碼中添加以下聲明即可: Require ‘win32ole’ 第三,關(guān)于與httpwatch插件的交互 需要先創(chuàng)建一個控制類,通過控制類來創(chuàng)建它的實例。通過httpwatch接口直接創(chuàng)建控制類如下: controller = WIN32OLE.new('HttpWatch.Controller') 接下來就是需要去創(chuàng)建一個瀏覽器的實例對象,這個瀏覽器的實例對象包括IE和Firefox兩種,且分別對這兩種類型瀏覽器都 給予支持。而這兩種對象都有兩個方法為:New和Attach。這個New方法是用來創(chuàng)建一個新的實例,這個新的實例類型必須與這個瀏覽器對象中插件類型 想一致。而Attach方法則表示可以創(chuàng)建一個新的實例并且可以嵌入已經(jīng)創(chuàng)建過的另外一些組件。兩種方法均返回的是httpwatch插件對象。 下面這段代碼表示創(chuàng)建一個新的IE實例,并嵌入了httpwatch插件組件: controller = WIN32OLE.new('HttpWatch.Controller') plugin = controller.IE.New() 關(guān)于Firefox的新實例和組件如下: controller = WIN32OLE.new('HttpWatch.Controller') plugin = controller.Firefox.New() 關(guān)于Attach方法在IE和Firefox瀏覽器實例中使用是不同的,IE實例需要依賴IE IWebBrowser2接口,如下所示代碼段: ieBrowser = WIN32OLE.new('InternetExplorer.Application') ieBrowser.Visible = true # Required to see the new window control = WIN32OLE.new('HttpWatch.Controller') plugin = controller.IE.Attach(ieBrowser) 相比IE,F(xiàn)irefox需要配置文件名才能運行實例,如下: controller = WIN32OLE.new('HttpWatch.Controller') plugin = controller.Firefox.Attach('FirefoxProfileName') 所有的返回對象都是插件對象類型,且能被控制類所調(diào)用。 錄制首先你的瀏覽器實例中必須嵌入HttpWatch插件,這個時候你的應(yīng)用程序?qū)刂祁惡筒寮?象。一般情況下,我們在使用httpwatch進行錄制之前需要配置很多功能,此時說到是過濾器,過濾器一般用于精確查找我們想要的信息,從而去掉那些不 需要的信息。然后一般在沒有特定需求和目標的時候,將默認關(guān)閉過濾器設(shè)置。代碼段如下: plugin.Log.EnableFilter(false) 在錄制之前需要清空httpwatch的日志信息和瀏覽器的緩存信息。代碼段如下: plugin.Clear() 接下來我們可以開始錄制了,代碼段如下: plugin.Record() 當(dāng)頁面發(fā)生加載產(chǎn)生http協(xié)議流量信息時,此時錄制機制才會記錄這些過程。關(guān)于如何驅(qū)動瀏覽器進行頁面加載,有如下三種方法: 1、通過瀏覽器自身的接口來驅(qū)動,如IE中的IWebBrowser2 2、通過設(shè)計框架來驅(qū)動,如Watir、WatiN等 3、調(diào)用插件對象自身的方法”GotoURL” 通常我們使用第三中方法,因為它是插件的內(nèi)置方法,可以方便測試網(wǎng)頁加載的正確性和度量頁面的性能。而且該方法可以很好的控制由于頁面加載而導(dǎo)致的連接超時等問題,如下代碼段: myUrl = 'http://www.' plugin.GotoUrl( myUrl ) control.Wait( plugin, -1 ) # don't return until the page loads 錄制完頁面請求過程之后就需要停止錄制,就需要調(diào)用插件對象的stop方法了,并且還要關(guān)閉瀏覽器,調(diào)用插件對象的CloseBrowser方法。 Watir驅(qū)動瀏覽器關(guān)于Watir的下載和安裝請詳細見《自動化測試框架設(shè)計理解文檔V3.0》。 通過watir來調(diào)用httpwatch插件需要引入watir庫文件,代碼段如下: require 'win32ole' require 'watir' # Open the IE browser using Watir ie = Watir::IE.new # Attach HttpWatch control = WIN32OLE.new('HttpWatch.Controller') plugin = control.Attach(ie.ie) # Start recording plugin.Record() 保存日志文件當(dāng)錄制運行完之后,需要保存當(dāng)前的運行日志,代碼段如下: plugin.Log.Save('c:\\mylogfiles\\mylogfile.hwl')
打開日志文件當(dāng)需要訪問日志的時候,就需要調(diào)用插件對象中的方法OpenLog,代碼段如下: # You always need to create an instance of Controller to use the HttpWatch Automation controller = WIN32OLE.new('HttpWatch.Controller') # Open the log file and keep a reference to the returned Log object log = controller.OpenLog("c:\\temp\\test.hwl") # Access the data in the log file using properties of the log object printf "The log file contains %d entries", log.Entries.Count |
|