上周末參加了Qclub的百度技術沙龍,聽了百度的孫景衛講了Web自動化測試,講的非常好,然後在小組討論時又有幸座在了一起。我們討論的一個內容,就是Ajax應用程式比原來的非Ajax程式更不易測試,這裡有兩個主要原因。
第一:Ajax使得基於純錄製的方式無法工作,因為錄製一個操作,這次返回需要5秒鐘,下次會更多或更少。
第二:一些測試載入器是基於原來非Ajax程式來開發的,後面沒做對應的升級。
但是,同樣有很多工具支援Ajax的測試,今天我們就來看一下大名鼎鼎的Selenium如何測試Ajax程式。
準備Ajax程式
這裡我們使用ASP.NET MVC,實際上你可以使用任何程式來類比一個AJAX調用。
a. 準備一個頁面,這裡我們使用了JQuery.
<input id="GetContent" value="Get" type="button" onclick="GetAjaxContent();" /> <div id="results" style="border:solid 1px red; display:none;"> </div> <script type="text/javascript"> function GetAjaxContent() { $.ajax({ url: "Home/GetAjaxContent", success: function (html) { $("#results").show().append(html); } }); }</script>
b. 準備背景程式,把下面的代碼加入HomeController.
public ContentResult GetAjaxContent(){ Thread.Sleep(9000); return new ContentResult { Content = "Hello World" };}
c. 效果 當我們點擊Get時,頁面出現Hello World。
使用Selenium進行Ajax測試
如果你沒用個Selenium,請參考我的這篇文章Web測試:Selenium使用
如果我們點擊Get按鈕後,直接判斷頁面是否返回”Hello World”時,這樣會出錯,因為現在還沒有立即返回。
這時我們就需要使用Selenium的WaitForCondition方法,這個方法會不停的去判斷一個javascript運算式是否是true. 知道返回true時才繼續執行。
我們可以看到,我們需要寫js運算式,如果我們需要判斷的很複雜,那麼些運算式也是一件很麻煩的事,同時這個方法經過我的使用,它對IE的支援不好。那麼有沒有更好的方法呢?
更好的方法判斷Ajax調用是否結束
事實上我們測試Ajax程式最大的麻煩,就是想上面一樣來判斷Ajax調用是否結束,上面我們是判斷頁面中如果出現”Hello World”,證明Ajax已經結束了,那麼什麼是更好的方法呢,我們經常使用的javascript的類庫是JQuery,如何判斷JQuery的Ajax調用已經結束了呢?
經過研究發現當沒有ajax調用時,Jquery.active=0.
所以,我們可以使用這個萬能的運算式判斷Ajax是否返回。
selenium.WaitForCondition("selenium.browserbot.getCurrentWindow().jQuery.active == 0", "50000");
是不是整個世界清靜多了
下面我收集了判斷其它類庫的Ajax活動狀態
jQuery: “jQuery.active”
Prototype: “Ajax.activeRequestCount”
Dojo: “dojo.io.XMLHTTPTransport.inFlight.length”
ASP.NET AJAX:
Javascript:
function isInAsyncPostBack() {
instance = Sys.WebForms.PageRequestManager.getInstance();
return instance.get_isInAsyncPostBack();
}
C#
selenium.WaitForCondition(“!selenium.browserbot.getCurrentWindow().isInAsyncPostBack()”, “1000″);
最後,打個小廣告,招聘Web測試人員,有Web測試經驗,較好的英語能力,思路清晰,能夠理解客戶需求(不依賴開發人員)和寫出較好的測試案例。有編程經驗者優先考慮,有Web Service測試經驗者優先考慮,要求工作態度認真,積極好學者。 薪水範圍5K--8K。上崗時間2周之內,有意者或者有介紹人的,請聯絡我,我的郵箱wangdeshui@gmail.com