自己動(dòng)手寫(xiě)Web自動(dòng)化測試框架5 - 判斷瀏覽器是否加載完成 軟件測試
上面的幾次課程中,我們介紹了如何打開(kāi)瀏覽器,如何獲取每個(gè)web控件的信息,并且控制并驗證他們。
從上面的文章中,我相信大家已經(jīng)可以寫(xiě)出簡(jiǎn)單的測試程序了。但是還有一個(gè)很重要的問(wèn)題沒(méi)有解決:如何判斷瀏覽器是否加載完成?
前面的文章我們沒(méi)有對瀏覽器的加載進(jìn)行判斷,而只是簡(jiǎn)簡(jiǎn)單單的等一段時(shí)間,這不是一個(gè)很好的解決方法,一方面浪費了時(shí)間,另一方面,我們也無(wú)法知道應該等多久,導致我們的測試程序不夠穩定。
接下來(lái)我們假設被測網(wǎng)頁(yè)沒(méi)有Ajax和框架,以這種情況來(lái)分析如何判斷網(wǎng)頁(yè)加載完畢。
現在比較常用判斷是否加載的方法有三種:
不停判斷IE的狀態(tài),如果沒(méi)有準備好就等待。
實(shí)現IE的DocumentComplete事件,標志完成。
不停去查找頁(yè)面有沒(méi)有我們想要控件,沒(méi)有就等待。
第一種方法:不停判斷IE的狀態(tài),我們要判斷IE的哪些狀態(tài)呢?
一方面,我們需要判斷IE的Busy狀態(tài),看IE是不是在忙著(zhù)解析東西,另一方面判斷IE的ReadyState狀態(tài),看html文檔是不是被完全加載進(jìn)來(lái)。
MILY: 新宋體"> while(ie.Busy || ie.ReadyState !=tagREADYSTATE.READYSTATE_COMPLETE) |
用如上的代碼就可以等待IE到完成。
這里只是簡(jiǎn)簡(jiǎn)單單的Demo,所以用了很簡(jiǎn)單的預計進(jìn)行判斷,我們假設我們的網(wǎng)頁(yè)沒(méi)有Ajax,也不會(huì )出現Load的死鎖,真正的實(shí)際工作要比這個(gè)復雜一些,比如要定一個(gè)Time out,如果除了Timeout的范圍,就強行終止,以防止測試過(guò)程中的死鎖。 而如何判斷Ajax是否被加載完,不是我們這個(gè)系列的討論范圍,請關(guān)注以后的其他系列文章。 |
這種方法是我比較推薦的一種方法,雖然《.net軟件測試自動(dòng)化之道》推薦的是第二種方法,不過(guò)我經(jīng)過(guò)實(shí)際的測試,推薦第一種方法。這個(gè)方法可以比較好的處理Navigate、Submit等情況,也是WatiN使用的方法(WatiN的用法要復雜很多,考慮到了Frame等其他情況)。
第二種方法:通過(guò)綁定DocumentComplete,用AutoResetEvent來(lái)等待。
InternetExplorer給我們提供了DocumentComplete事件,會(huì )在IE被Load之后被調用,我們可以使用這個(gè)來(lái)等待。等待方法就是使用System.Threading.AutoResetEvent對象來(lái)。
所以我們需要做的是:
聲明一個(gè)AutoResetEvent對象的實(shí)例,因為要在兩個(gè)方法直接調用,所以需要放到類(lèi)的成員變量。
在InternatExplorer被獲取之后,綁定DocumentComplete事件。
在DocumentComplete事件中,調用AutoResetEvent.set()方法。
在等待頁(yè)面加載的時(shí)候調用AutoResetEvent.WaitOne()方法
下面是源代碼:
文章來(lái)源于領(lǐng)測軟件測試網(wǎng) http://kjueaiud.com/