高秀慧,高建華
(上海師范大學(xué) 計算機科學(xué)與工程系,上海200234)
當(dāng)今時代對網(wǎng)絡(luò)的需求與日俱增,開發(fā)人員利用AJAX 技術(shù)提高頁面顯示和響應(yīng)的速度,同時又能豐富用戶的體驗。AJAX 應(yīng)用程序的友好性以及豐富的用戶體驗為自動化測試帶來了新挑戰(zhàn):其一,傳統(tǒng)網(wǎng)站通過不同的URL進行頁面切換,但現(xiàn)在服務(wù)器不再需要保存大量的靜態(tài)網(wǎng)頁,而是用戶通過請求直接從數(shù)據(jù)庫里讀取數(shù)據(jù)動態(tài)生成網(wǎng)頁返回給用戶;另一方面,傳統(tǒng)網(wǎng)站通過整體刷新的方式呈現(xiàn)頁面內(nèi)容,但現(xiàn)在采用局部刷新技術(shù),僅在瀏覽器和服務(wù)器之間傳遞少量數(shù)據(jù),同時不影響用戶對正在瀏覽的頁面進行其他操作[1]。上述技術(shù)的運用使靜態(tài)分析測試技術(shù)失去了作用,也使基于傳統(tǒng)頁面請求/響應(yīng)模型的測試方法失效。
針對此問題,Mesbah[2]等提出一種ATUSA 框架,其主要思想:通過爬行AJAX 應(yīng)用程序,自動點擊按鈕及其它用戶界面元素,分析用戶界面狀態(tài)變化,動態(tài)推導(dǎo)出對程序中各種導(dǎo)航路徑和狀態(tài)建模的狀態(tài)流程圖,用最短路徑算法從狀態(tài)集中衍生測試集。夏冰[3]等對動態(tài)腳本網(wǎng)站采取更有效的頁面獲取方法,主要思想:通過訓(xùn)練頁面元素觸發(fā)事件,總結(jié)出采用事件和事件所在元素的XPath二元組表示法,在以后抓取中,只觸發(fā)這些頁面元素上的特定事件,進一步提升抓取效率。借鑒上述思想,本文通過改進爬行AJAX 應(yīng)用程序時的不足之處,并將推導(dǎo)后的狀態(tài)流程圖通過規(guī)約法則 (合并測試路徑)縮減測試集,減少測試集的生成,同時保證測試覆蓋率。
可靠性是軟件的一個質(zhì)量要素,為了提高AJAX 應(yīng)用程序的可靠性,測試或靜態(tài)分析被廣泛運用。目前已有許多工具用于測試,比如Selinimu、WebDriver、模擬用戶輸入點擊等操作,實現(xiàn)Web自動化測試,但這些工具仍需要測試人員大量的手工操作。
傳統(tǒng)Web與AJAX Web區(qū)別:AJAX 是一種將多種前端技術(shù)整合的思想。傳統(tǒng)的網(wǎng)站以靜態(tài)為主,通過不同的URL進行頁面切換,每個不同的URL 對應(yīng)不同的狀態(tài)(狀態(tài)是某一時刻在瀏覽器中呈現(xiàn)的DOM 結(jié)構(gòu));而采用AJAX 技術(shù)實現(xiàn)的Web系統(tǒng)普遍進行局部刷新,在用戶觸發(fā)事件調(diào)用JavaScript代碼的同時,動態(tài)修改瀏覽器DOM樹的內(nèi)容與結(jié)構(gòu) (比如:鼠標位于圖片區(qū)域,觸發(fā)onmouseover事件,彈出對應(yīng)的圖片說明),由此生成新狀態(tài)而改變用戶界面的狀態(tài)。由于這些狀態(tài)都同屬于一個URL,所以一個AJAX 頁面可以同時擁有多個不同的內(nèi)部狀態(tài);并且,頁面上的超鏈接也可以指向其他URL 頁面。對于Web程序的測試,一般通過設(shè)計爬行算法遍歷實現(xiàn),而AJAX 的技術(shù)特征對于爬行引擎如何定位并指向一個特定狀態(tài)提高了難度。傳統(tǒng)Web 數(shù)據(jù)采集轉(zhuǎn)換圖的節(jié)點為Web頁面,轉(zhuǎn)換圖的邊為超鏈接;對AJAX 而言,由于內(nèi)部也會動態(tài)更改內(nèi)容,所以頁面內(nèi)部同時會由事件觸發(fā)。Matter[4]和Frey[5]都對狀態(tài) 轉(zhuǎn)換做了歸 納,圖1 為AJAX站點模型頁面狀態(tài)轉(zhuǎn)換圖。從圖1 中可以看出,AJAX 頁面之間由超鏈接導(dǎo)致頁面跳轉(zhuǎn),AJAX 頁面內(nèi)部由觸發(fā)事件引起內(nèi)部狀態(tài)轉(zhuǎn)換。
圖1 AJAX 站點模型頁面狀態(tài)轉(zhuǎn)換
本文提到的爬行算法執(zhí)行客戶端代碼,對用戶提交的每個行為進行分析,將每一次觸發(fā)事件后更新的頁面所對應(yīng)的每棵DOM 樹看做一個狀態(tài),每次事件觸發(fā)是引起狀態(tài)變化的條件,作為狀態(tài)圖的一條邊,最后通過深度優(yōu)先遍歷推導(dǎo)出狀態(tài)流程圖。如圖2所示。
狀態(tài)流程圖主要用于捕獲用戶界面的狀態(tài)以及改變狀態(tài)的轉(zhuǎn)換條件,即流程圖中記錄引起DOM 變化而產(chǎn)生不同狀態(tài)的XPath路徑 (即DOM 樹路徑)以及各狀態(tài)的集合。以下是狀態(tài)流程圖的定義:
圖2 狀態(tài)流程
圖2是狀態(tài)流程圖的示例,<onclick,xpath://DIV
[1]/a[1]>表示點擊 “//DIV [1]/a[1]”代表的頁面元素可以轉(zhuǎn)換到另一狀態(tài)。依據(jù)定義,初始狀態(tài)r作為根節(jié)點也是起始節(jié)點,從起始節(jié)點r可以通過點擊xpath路徑上代表的頁面元素轉(zhuǎn)換到下一個狀態(tài),比如在起始節(jié)點r下,通過觸發(fā)<onclick,xpath://DIV [1]/a [1]>代表的頁面元素的onclick事件可以轉(zhuǎn)換到S1;在狀態(tài)S1下,觸發(fā)<onmousemove,xpath://FORM/DIV [1]>或 者<onmousemove,xpath://FORM/DIV [2]>代表的 頁面元素的onmouseover事件可以轉(zhuǎn)換到S4;在狀態(tài)S4下,觸發(fā)<onclick,xpath://SPAN [2]/a [1]>代表的頁面元素的onclick事件可以轉(zhuǎn)換到S5;依此類推,將定義中的狀態(tài)以及路徑都由狀態(tài)流程圖示意;在狀態(tài)S5下,由于沒有輸出邊,即沒有頁面元素上可觸發(fā)事件會改變DOM樹的內(nèi)容與結(jié)構(gòu),所以無法轉(zhuǎn)換到其他狀態(tài)。狀態(tài)流程圖為爬行算法的結(jié)果,主要為測試用例做準備,表1為狀態(tài)流程圖在數(shù)據(jù)庫中的保存方式,當(dāng)前狀態(tài)下為StartState(未觸發(fā)新事件的狀態(tài),比如:r),經(jīng)過xpath路徑中的Event事件觸發(fā)后轉(zhuǎn)換到NextState(觸發(fā)事件后的狀態(tài),比如:r→S2,S2作為r的NextState);同時將NextState作為下一事件的StartState,即S2作為StartState);步驟同前,當(dāng)新的StartState觸發(fā)事件轉(zhuǎn)換到NextState后 (比如:S2→S4),保存新事件并將新狀態(tài) (S4)保存至NextState。No.為狀態(tài)序列號。表格為保存方式,主要為第三章節(jié)規(guī)約路徑做準備。
傳統(tǒng)爬蟲在應(yīng)用程序中爬行時,工作流程一般是從某個鏈接開始,獲取鏈接地址的HTML源碼,并從中抽取出<a>標簽中的 “href”屬性指向的URL鏈接,然后對已抓取的鏈接重復(fù)同樣的步驟。但是基于AJAX 應(yīng)用程序的URL不再是頁面的唯一標識,傳統(tǒng)爬蟲無法抓取含有動態(tài)腳本的網(wǎng)頁。針對AJAX 應(yīng)用程序的爬蟲工作流程,分析如何能抓取新鏈接中的隱藏鏈接 (候選元素)。比如:打開新浪微博首頁,用瀏覽器打開查看源代碼,清晰的發(fā)現(xiàn)源碼中的內(nèi)容遠遠少于頁面呈現(xiàn)出的內(nèi)容,因為在HTML 元素節(jié)點中,采取了后加載的方式調(diào)用JavaScript代碼,并調(diào)用DOM 操作動態(tài)呈現(xiàn),所以源碼內(nèi)容少。
表1 狀態(tài)流程圖在數(shù)據(jù)庫中的保存方式
結(jié)合上述爬行算法的基本原理,提出了爬行算法的算法流程,通過不斷將狀態(tài)、路徑關(guān)系添加至狀態(tài)流程圖,從而逐步增量式推導(dǎo)出狀態(tài)流程圖。圖3描述了深度優(yōu)先的爬行算法流程圖,主要分為:算法初始化、檢查候選元素、添加新狀態(tài)、狀態(tài)回退、判斷終結(jié)條件。首先初始化嵌入式瀏覽器,加載URL地址,分析得到可觸發(fā)事件的列表;按照深度優(yōu)先算法,觸發(fā)列表中的一個事件,獲取觸發(fā)事件后的狀態(tài);比較先前狀態(tài)與觸發(fā)后新狀態(tài)的差異,若狀態(tài)已變更,則認為狀態(tài)已轉(zhuǎn)換并將新狀態(tài)、路徑關(guān)系添加至狀態(tài)流程圖,若狀態(tài)無變更,則認為新狀態(tài)無轉(zhuǎn)換并觸發(fā)列表中其他事件;爬行過程不斷迭代,設(shè)置新狀態(tài)為當(dāng)前狀態(tài)繼續(xù)爬行,若仍可抓取 (即仍有可觸發(fā)的事件),則回到最初重新記錄當(dāng)前狀態(tài),步驟同前;若不可抓取,則需進行狀態(tài)回退,通過重新加載原頁面的方式回到先前狀態(tài),觸發(fā)先前狀態(tài)中的其他待觸發(fā)事件;若已觸發(fā)所有可觸發(fā)事件,則判斷是否達到最大抓取深度,防止不斷出現(xiàn)新狀態(tài)而導(dǎo)致爬蟲陷入黑洞。
步驟1 算法初始化。在爬行算法開始之前進行初始化,啟動嵌入式瀏覽器,初始化狀態(tài)機、機器人,并根據(jù)給定的URL獲取初始頁面。狀態(tài)機記錄當(dāng)前狀態(tài) (默認狀態(tài)通常為r),分析得到基于當(dāng)前狀態(tài)的可觸發(fā)事件的列表。
步驟2 檢查候選元素。如何判斷可觸發(fā)事件是基于AJAX 應(yīng)用程序的最大難點,傳統(tǒng)網(wǎng)站爬蟲僅靠超鏈接和表單來抓取資源,而優(yōu)化后的爬行算法還會檢查附加于事件監(jiān)聽器上的候選元素 (導(dǎo)致AJAX 頁面狀態(tài)轉(zhuǎn)換的元素集div,a,span,input,IMG 等定義為候選元素)。對每個在DOM 樹上被檢測到的候選元素,爬蟲在瀏覽器中觸發(fā)候選元素上的事件,分析DOM 樹的變化。假如觸發(fā)的事件引起瀏覽器中DOM 樹的變化,那么將當(dāng)前DOM 樹的狀態(tài)和引起變化的事件路徑記錄,并保存至狀態(tài)機。
圖3 爬行算法流程
步驟3 添加新狀態(tài)。比較當(dāng)前狀態(tài)是否與狀態(tài)機中的已有狀態(tài)重復(fù),假如在狀態(tài)流程圖中已有類似狀態(tài),那么僅創(chuàng)建一條邊,并識別事件的類型和路徑;假如當(dāng)前狀態(tài)不是圖中的一部分,那么創(chuàng)建新狀態(tài)并添加至狀態(tài)機。在確定新狀態(tài)后,爬行算法被遞歸調(diào)用去尋找其余使DOM樹發(fā)生變化的可能的候選元素。其中,優(yōu)化后的爬行算法會計算先前DOM 樹與當(dāng)前DOM 樹的差異,僅搜尋DOM樹更改部分的候選元素,而不是對新的DOM 樹搜尋所有的候選元素。
步驟4 狀態(tài)回退。每次遞歸調(diào)用,瀏覽器都應(yīng)回到先前狀態(tài),但基于AJAX 應(yīng)用程序無法滿足這一點。為了解決這個問題,可以選擇保存候選元素信息 (即之前保存至狀態(tài)機的DOM 樹的狀態(tài)和事件路徑)和命令,以便下次可以直接達到想要的結(jié)果狀態(tài)。通過重載應(yīng)用程序,執(zhí)行初始狀態(tài)下的元素達到最終狀態(tài)。
步驟5 判斷終結(jié)條件,用于控制爬行算法。爬行算法抓取終結(jié)條件為滿足以下任一項:
(1)判斷是否達到最大抓取深度。深度是指由初始狀態(tài)經(jīng)過多次轉(zhuǎn)換到達某個中間狀態(tài)的轉(zhuǎn)換次數(shù)。
(2)判斷是否達到最大狀態(tài)數(shù),防止?fàn)顟B(tài)爆炸問題。
(3)當(dāng)前狀態(tài)是初始狀態(tài)并且已觸發(fā)所有可觸發(fā)事件。
通過上述優(yōu)化后的爬行算法推導(dǎo)出狀態(tài)流程圖,此過程定義為第一步完整測試通過;第二步通過使用不同方法去覆蓋狀態(tài)流程圖中的不同路徑,達到測試目的,可以利用推導(dǎo)出的狀態(tài)流程圖進行測試集的生成。生成測試集的主要思想為:對狀態(tài)流程圖使用前K 條最短路徑算法,所得出的多條最短路徑就可以作為測試集使用,但由于圖中所包含的狀態(tài)覆蓋面廣,生成的測試集過多,部分測試集不具有代表性。本文通過利用合并測試路徑的想法有效縮減測試集的生成,同時又不影響測試集的覆蓋率。
前K 條最短路徑算法是最短路徑的推廣。給定一個有向圖G= (V,E),一個正整數(shù)K 和兩個頂點v1、v2,求出從v1到v2的前K 條最短路徑。此算法求得的路徑并不只有一條,而是多條最短路徑。算法利用前K 條最短路徑的思想方法,定義狀態(tài)流程圖中的r為v1,每個節(jié)點vi作為v2,求出r到vi的前K條最短路徑。雖然用前K條最短路徑求出的算法已是最優(yōu)算法,但其實在推導(dǎo)狀態(tài)流程圖時會因觸發(fā)不同事件生成同一狀態(tài)的現(xiàn)象存在,比如:在頁碼1的狀態(tài)下,點擊頁碼2和下一頁會向服務(wù)端發(fā)出請求獲得同一頁的數(shù)據(jù),我們應(yīng)盡量避免這類事件的重復(fù)檢測。
為了減少測試集的生成,本文通過規(guī)約的思想,即合并測試路徑的方法生成最優(yōu)的測試集,也可以理解為選取觸發(fā)具有特征的事件生成測試集,同時不影響測試覆蓋率。
本文對前K 條最短路徑求出的所有路徑規(guī)約采用了如下方法:被規(guī)約的兩條XPath 路徑必須其前狀態(tài) (Start-State)相同,即路徑所經(jīng)過的頁面元素名稱完全相同,并且經(jīng)過xpath路徑后生成的狀態(tài)是同一狀態(tài) (NextState狀態(tài)相同);對這兩條XPath進行序號規(guī)約,如 “//div[4]/li[1]/span[1]”和 “//div [4]/li[1]/span [2]”這兩個xpath,可以規(guī)約成 “//div[4]/li[1]/span[*]”;如“//div[4]/span[1]/a[1]”和 “//div[4]/span [2]/a[1]”這兩個xpath,可以規(guī)約成 “//div[4]/span [*]/a
[1]”;但 是 如 “//div [4]/li[1]/span [1]”和 “//li
[1]/span[2]”這兩個xpath,不可以進行規(guī)約。這樣,我們便選取了一些具有特征的事件,在生成測試集時只需選擇其中一條路徑,無需所有的路徑都被測試。同時,為了提高覆蓋率,對已屬于測試路徑中的狀態(tài)標記為已檢測,第二次規(guī)約時盡可能選擇未被檢測過的狀態(tài)。
本文對路徑規(guī)約識別算法進行以下描述:
第一步:深度遍歷狀態(tài)流程圖,得到前K 條最短路徑。
第二步:對于最短路徑中的xpath 路徑,滿足以下條件時,進行合并:
(1)xpath路徑具有同父狀態(tài)結(jié)點,處于同一層次;
(2)xpath路徑擁有同子狀態(tài)結(jié)點,處于同一層次;
(3)xpath路徑符合序號規(guī)約法則;
(4)判斷xpath路徑是否已被檢測,選擇合適的xpath路徑。
本文實驗的目的在于驗證優(yōu)化后的測試集在數(shù)量上明顯減少以及在覆蓋率上沒有受到影響。本文隨機選取了網(wǎng)站進行測試,重點關(guān)注以下兩個問題:(1)優(yōu)化后的AJAX 爬行算法是否能抓取候選元素;(2)本文提出的規(guī)約測試路徑的方法是否有效。
實驗是在STS (spring tool suite)開發(fā)平臺上編寫,本文依據(jù)2.2中提到的爬蟲算法進行測試。為了獲得實驗數(shù)據(jù),設(shè)計了如下的測試環(huán)境,如圖4所示。
圖4 測試環(huán)境
本文設(shè)計的對比實驗選用了百度網(wǎng)站(www.baidu.com)進行測試:①設(shè)置爬行算法深度為2,利用爬蟲推導(dǎo)出正確的狀態(tài)流程圖;手動對應(yīng)用程序注入不同故障,推導(dǎo)出含有故障的狀態(tài)流程圖;②遍歷狀態(tài)流程圖,分別讀取正確的和注入了故障的數(shù)據(jù),獲得相應(yīng)結(jié)果P和P’,對比結(jié)果分析爬行算法的測試有效性;③通過使用3.2中的路徑規(guī)約識別算法,得到優(yōu)化后的前K 條最短路徑,比較新生成的測試路徑對測試有效性的最終影響。
實驗中選用了未注入故障的應(yīng)用程序以及分別注入一個或多個故障后的應(yīng)用程序,結(jié)果對比輸出的數(shù)據(jù)。注入故障后的應(yīng)用程序由于無法抓取全部的狀態(tài)數(shù),所以生成的狀態(tài)流程圖一定小于未注入故障所生成的狀態(tài)流程圖,因此,輸出的數(shù)據(jù)P’的狀態(tài)數(shù)、Xpath數(shù)一定小于P。最后比對P和P’的值,得出爬行算法的有效性。
4.2.1 生成狀態(tài)流程圖
圖5為抓取隱藏鏈接后生成,正確的狀態(tài)流程圖。通過使用爬蟲算法對網(wǎng)站進行深度優(yōu)先遍歷,從www.baidu.com觸發(fā),觸發(fā)所有候選元素的事件 (其中大部分為<a>標簽內(nèi)的隱藏事件),得到圖5所示的狀態(tài)流程圖。
圖5 百度網(wǎng)站狀態(tài)流程
4.2.2 有效性實驗數(shù)據(jù)
實驗通過屏蔽代碼的方式從不同位置注入故障,分別注入0、1、2、3、4個故障。表2 第一列是本次實驗在不同位置注入的故障個數(shù),第二列是應(yīng)用程序所應(yīng)抓取到的狀態(tài)數(shù),第三列是通過使用本論文提到的爬行算法抓取到的狀態(tài)數(shù),第四列是抓取應(yīng)用程序的狀態(tài)覆蓋率=P’/P的結(jié)果。
表2 有效性實驗數(shù)據(jù)
從實驗結(jié)果可以清晰看出,2.2 中提到的算法抓取效率高,從表2中可以看出百度應(yīng)用程序在未注入故障前應(yīng)獲得的正確狀態(tài)數(shù)為38,受故障的影響,注入不同故障后所獲得的狀態(tài)數(shù)逐漸減少,當(dāng)注入故障為1時,狀態(tài)覆蓋率最高達97.37%,平均值為95.26%。注入故障數(shù)的多少不會對覆蓋率產(chǎn)生太大影響,注入的故障位置對覆蓋率會產(chǎn)生一定影響,原因在于出現(xiàn)故障的Xpath 無法生成下一狀態(tài)。
4.2.3 測試集實驗數(shù)據(jù)
表3為算法實驗數(shù)據(jù),從數(shù)據(jù)中可以發(fā)現(xiàn)狀態(tài)間存在多條xpath路徑,依據(jù)經(jīng)驗,會存在多條重復(fù)路徑。優(yōu)化后的AJAX 爬行算法可以抓取新鏈接中的隱藏鏈接,共生成38個不同狀態(tài),檢測到的狀態(tài)為100%;抓取到的xpath路徑為163條,通過合并測試路徑生成測試集,檢測到的xpath路徑為141條,覆蓋率為86.5%,成功解決了AJAX應(yīng)用程序難以抓取隱藏鏈接的難題;通過使用本文提出的路徑規(guī)約識別算法后獲得的測試集,測試集由58變?yōu)?2,縮減了6條測試路徑。
表3 算法實驗數(shù)據(jù)
從實驗結(jié)果中可以明顯看出利用本文給出的規(guī)約方法檢測的覆蓋率高,符合理想的測試結(jié)果;使用規(guī)約后的測試集數(shù)量小于原來的測試集數(shù)量,達到了優(yōu)化的目的。改進前的測試集為路徑覆蓋,覆蓋面廣且可靠性高,但對于大型網(wǎng)站而言,適用性不大;改進后的測試集在數(shù)量上減少,在大型網(wǎng)站中能體現(xiàn)出一定優(yōu)勢,并且保證較高的覆蓋率。研究分析,對于具有極高結(jié)構(gòu)相似性的網(wǎng)頁 (特別是含有3.1中提到的重復(fù)檢測)進行優(yōu)化測試集,縮減的數(shù)量更加明顯;并且,相信隨著抓取深度的增加,狀態(tài)數(shù)增加的同時,被檢測到的狀態(tài)數(shù)也會增加,測試集數(shù)量會持續(xù)遞減。實驗結(jié)果表明,上述提出的方法優(yōu)越性高,減少測試人員的工作量。
本文討論了測試AJAX 應(yīng)用程序的最優(yōu)方法:通過爬行算法,對Web應(yīng)用程序進行分析,獲取頁面上的所有鏈接,推導(dǎo)出狀態(tài)流程圖,生成測試集。本文簡要介紹了爬行算法的工作流程,對測試集進行優(yōu)化的方法。經(jīng)過初步實驗,表明優(yōu)化后的測試集在數(shù)量上明顯減少,并能保證較高的覆蓋率。當(dāng)然該方法仍有一定的局限性,可以作為日后研究的方向:文中提出的爬行算法對JavaScript分析不夠深入,對腳本解析的完整性需進一步加強,所以無法抓取某些特定應(yīng)用程序 (例如:數(shù)獨等),應(yīng)進一步擴展算法的適用性。
[1]Mesbah A,Van Deursen A.An architectural style for AJAX[C]//Proceedings of the 6th Working IEEE/IFIP Conference on Software Architecture,2007:44-53.
[2]Mesbah A,Van Deursen A,Roest D.Invariant-based automatic testing of modern Web applications[J].IEEE Trans on Software Engineering,2012,38 (1):35-53.
[3]XIA Bing,GAO Jun,WANG Tengjiao,et al.An efficient valid page crawling approach for Websites with dynamic scripts[J].Journal of Software,2009,20 (Suppl):176-183 (in Chinese).[夏冰,高軍,王騰蛟,等.一種高效的動態(tài)腳本網(wǎng)站有效 頁 面 獲 取 方 法 [J].軟 件 學(xué) 報,2009,20 (增 刊):176-183.]
[4]Duda C,F(xiàn)rey G,Kossmann D,et al.AJAX crawl:Making AJAX applications searchable [C]//IEEE 25th International Conference on Data Engineering,2009:78-89.
[5]Frey G.Indexing AJAX Web applications[D].Zurich:Swiss Federal Institute of Technology Zurich,2007.
[6]Mesbah A,Van Deursen A,Bozdag E.Crawling AJAX by inferring user interface state changes [C]//8th International Conference on Web Engineering,2008:122-134.
[7]Mesbah A,Van Deursen A.Migrating multi-page Web applications to single-page AJAX interfaces [C]//Proc 11th European Conf Software Maintenance and Reeng,2007:181-190.
[8]Mesbah A,Prasad M.Automated cross-browser compatibility testing [C]//Proc 33rd Int'l Conf Software Eng,2011.
[9]Mesbah A,Bozdag E,Van Deursen A.Crawling AJAX by inferring user interface state changes [C]//Proc Eighth Int'l Conf Web Eng,2008:122-134.
[10]Roest D,Mesbah A,Van Deursen A.Regression testing AJAX applications:Coping with dynamism [C]// Proc Third Int'l Conf on Software Testing,Verification and Validation,2010:128-136.