<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-61  評論-13  文章-19  trackbacks-0
    一個很重要的問題:如何判斷瀏覽器是否加載完成?

    我們假設被測網頁沒有Ajax和框架,以這種情況來分析如何判斷網頁加載完畢。

    現在比較常用判斷是否加載的方法有三種:

    1. 不停判斷IE的狀態,如果沒有準備好就等待。
    2. 實現IE的DocumentComplete事件,標志完成。
    3. 不停去查找頁面有沒有我們想要控件,沒有就等待。

    第一種方法:不停判斷IE的狀態,我們要判斷IE的哪些狀態呢?
    一方面,我們需要判斷IE的Busy狀態,看IE是不是在忙著解析東西,另一方面判斷IE的ReadyState狀態,看html文檔是不是被完全加載進來。


    while(ie.Busy || ie.ReadyState !=tagREADYSTATE.READYSTATE_COMPLETE)
    {
      Thread.Sleep(100);
    }

    用如上的代碼就可以等待IE到完成。
     

    這里只是簡簡單單的Demo,所以用了很簡單的預計進行判斷,我們假設我們的網頁沒有Ajax,也不會出現Load的死鎖,真正的實際工作要比這個復雜一些,比如要定一個Time out,如果除了Timeout的范圍,就強行終止,以防止測試過程中的死鎖。

    而如何判斷Ajax是否被加載完,不是我們這個系列的討論范圍,請關注以后的其他系列文章。

    這種方法是我比較推薦的一種方法,雖然《.net軟件測試自動化之道》推薦的是第二種方法,不過我經過實際的測試,推薦第一種方法。這個方法可以比較好的處理Navigate、Submit等情況,也是WatiN使用的方法(WatiN的用法要復雜很多,考慮到了Frame等其他情況)。

    第二種方法:通過綁定DocumentComplete,用AutoResetEvent來等待。
    InternetExplorer給我們提供了DocumentComplete事件,會在IE被Load之后被調用,我們可以使用這個來等待。等待方法就是使用System.Threading.AutoResetEvent對象來。
    所以我們需要做的是:

    1. 聲明一個AutoResetEvent對象的實例,因為要在兩個方法直接調用,所以需要放到類的成員變量。
    2. 在InternatExplorer被獲取之后,綁定DocumentComplete事件。
    3. 在DocumentComplete事件中,調用AutoResetEvent.set()方法。
    4. 在等待頁面加載的時候調用AutoResetEvent.WaitOne()方法

    下面是源代碼:

    //1.聲明AutoResetEvent對象實例 

    privatestaticAutoResetEventDocComplete =newAutoResetEvent(false);
    staticvoidMain(string[] args)
    { 

     //...省略得到IE對象

     //2.綁定DocumentComplete事件

     ie.DocumentComplete +=

       newDWebBrowserEvents2_DocumentCompleteEventHandler(ie_DocumentComplete); 

     Console.WriteLine("Navigating ...");

     objecto =null;

     ie.Navigate("http://www.baidu.com/",refo,refo,refo,refo); 

     //調用WaitOne等待

     DocComplete.WaitOne();

     HTMLDocumentdoc = (HTMLDocument)ie.Document;

     HTMLInputElementkeyword = (HTMLInputElement)doc.getElementById("kw");

     keyword.value ="colblog.net";

      HTMLButtonElementsubmit = (HTMLButtonElement)doc.getElementById("sb");

     submit.click(); 

     //調用WaitOne等待

     DocComplete.WaitOne(); 

     ie.Quit(); 

    } 

    //實現DocumentComplete事件,調用Set方法。

    staticvoidie_DocumentComplete(objectpDisp,refobjectURL)

    {

     DocComplete.Set();

    }

    省略了一些前幾篇文章的東西,完整代碼請下載源代碼。
    這種方法有自己的好處,就是使用了IE自己的事件,判斷代碼很簡單,不過有也不好的地方,第一就是幫度DocumentComplete事件以后,打開的IE會變得響應很慢,尤其是當設置斷點調試的時候,IE會變得尤其的慢。第二個缺點就是如果加上框架,還有頁面的跳轉,就會是這個方法很難捉摸。比如,如果上面的例子里面,URL寫成"baidu.cn",就會出錯。

    第三種方法是不停的去讀我們要的控件是否出來。這個方法一般需要配合前面兩個使用,而且也可以部分解決Ajax的問題。因為具體實現代碼比較多,而又不是我們要講的重點,就不貼出源代碼,只是講一下實現的思路,讓大家了解一下。
    具體實踐方法是:設置一個Timeout,在這個Timeout時間之前,不停的去看我們要驗證的控件是不是被Load進來。如果對頁面進行建模,就會去看我們的這個頁面的所有的已經定義了的控件是不是被Load進來,如果出了Timeout,就會報錯。

    這個方法的優點是可以部分解決Ajax,但是缺點也就是實現比較復雜,而且如果報錯,無法分清是因為頁面沒有這個控件,還是因為速度較慢,控件還沒有被讀入。

    以上介紹了在沒有Ajax和框架情況下,如何判斷瀏覽器是否已經加載完成。從下一篇文章開始,我們就要進入正題,開始我們的自動化測試框架了。

    posted on 2010-01-15 10:10 xnabx 閱讀(1413) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 成年性生交大片免费看| 久久久久久一品道精品免费看 | 一级毛片a免费播放王色| 成人免费视频网址| 国产日本亚洲一区二区三区| 1000部无遮挡拍拍拍免费视频观看| 国产亚洲成av人片在线观看| 成人精品一区二区三区不卡免费看| 日韩亚洲Av人人夜夜澡人人爽| 你是我的城池营垒免费观看完整版 | 日韩视频免费在线| 亚洲精品色播一区二区| 中文字幕无码免费久久| 亚洲AV人无码激艳猛片| 亚洲大片免费观看| 精品亚洲AV无码一区二区| 成人无码区免费视频观看| 亚洲AV成人一区二区三区观看 | 国产免费一区二区三区VR| 黄色a三级免费看| 亚洲精品乱码久久久久久久久久久久| 最新久久免费视频| 亚洲一区二区三区久久| 精品久久洲久久久久护士免费| 亚洲av日韩av永久在线观看| 亚洲日韩中文字幕日韩在线| 香蕉免费看一区二区三区| 久久亚洲国产精品成人AV秋霞 | 亚洲美国产亚洲AV| 亚洲无码视频在线| 免费无码毛片一区二区APP| 国产成人亚洲合集青青草原精品| 四虎永久在线免费观看| 成人久久免费网站| 中文字幕乱码亚洲无线三区 | 无码少妇一区二区浪潮免费| 国产精品亚洲综合| 久久久亚洲精品国产| 成全视频在线观看免费高清动漫视频下载| 精品国产_亚洲人成在线| 在线免费视频一区|