陳俊生,彭莉芬
(安徽電子信息職業(yè)技術(shù)學(xué)院,安徽 蚌埠 233030)
為了保證更好的用戶(hù)體驗(yàn)和反數(shù)據(jù)爬取的需求,Web UI頁(yè)面更新迭代速度非???其直接后果就是導(dǎo)致原有的測(cè)試腳本失效[1]。此時(shí)重新生成測(cè)試腳本代價(jià)昂貴,因此修復(fù)舊的測(cè)試腳本集是最佳選擇[2-3]。Web UI頁(yè)面更新迭代帶來(lái)的測(cè)試腳本失效問(wèn)題,其實(shí)質(zhì)還是由于網(wǎng)頁(yè)元素結(jié)構(gòu)改變所造成的網(wǎng)頁(yè)元素定位失效問(wèn)題。網(wǎng)頁(yè)元素定位方法分為基于DOM樹(shù)、基于模板匹配和基于機(jī)器視角三大類(lèi)[4-6]。目前被廣泛應(yīng)用于自動(dòng)化測(cè)試的方法主要是基于DOM樹(shù)的網(wǎng)頁(yè)元素定位方法,通過(guò)對(duì)DOM樹(shù)的元素進(jìn)行識(shí)別和定位來(lái)完成測(cè)試腳本的生成和修復(fù)工作。
Selenium是一個(gè)基于DOM樹(shù)的Web應(yīng)用程序自動(dòng)化測(cè)試工具[7],測(cè)試直接運(yùn)行在瀏覽器中可以最大限度模擬用戶(hù)的實(shí)際操作,支持XPath、CSS選擇器和元素屬性等多種網(wǎng)頁(yè)元素定位方法。Selenium IDE是其中一個(gè)工具,該工具除了可以編輯和調(diào)試測(cè)試以外,還可以錄制和回放測(cè)試。在Web UI自動(dòng)化測(cè)試腳本修復(fù)方面,多種基于Selenium IDE錄制、回放功能和新舊版本W(wǎng)eb UI頁(yè)面DOM樹(shù)的網(wǎng)頁(yè)元素重定位方法被提出[5,8-9],取得了不錯(cuò)的效果,但也存在不足。例如現(xiàn)有方法普遍是對(duì)新舊版本W(wǎng)eb UI頁(yè)面DOM樹(shù)本體進(jìn)行操作,運(yùn)算量大,耗時(shí)較長(zhǎng),并且存在一定的誤定位。為了應(yīng)對(duì)上述問(wèn)題,本文利用新舊版本W(wǎng)eb UI頁(yè)面DOM樹(shù)的差異對(duì)現(xiàn)有方法進(jìn)行改進(jìn),設(shè)計(jì)了一種基于優(yōu)化差異DOM樹(shù)的網(wǎng)頁(yè)元素重定位方法,目的在于優(yōu)化現(xiàn)有的算法規(guī)則,以減少網(wǎng)頁(yè)元素重定位的運(yùn)算量,降低誤定位率。
本文提出基于優(yōu)化差異DOM樹(shù)的網(wǎng)頁(yè)元素重定位方法模型,如圖1所示。
圖1 基于優(yōu)化差異DOM樹(shù)的網(wǎng)頁(yè)元素重定位方法模型
其核心思想就是利用新舊版本W(wǎng)eb UI頁(yè)面 DOM樹(shù)的差異和舊版測(cè)試腳本在新版本頁(yè)面上回放所生成錯(cuò)誤測(cè)試報(bào)告中的失效XPath路徑,最大限度地縮小網(wǎng)頁(yè)元素重定位范圍,通過(guò)一系列算法的提出,最終實(shí)現(xiàn)失效腳本對(duì)應(yīng)網(wǎng)頁(yè)元素快速、準(zhǔn)確重定位。具體來(lái)說(shuō),在Web UI迭代開(kāi)發(fā)的過(guò)程中,首先利用Selenium IDE錄制舊版Web UI頁(yè)面的測(cè)試腳本,當(dāng)Web UI發(fā)生更新時(shí),先獲取舊版測(cè)試腳本在新版頁(yè)面上回放的錯(cuò)誤測(cè)試報(bào)告,并提取報(bào)告中失效的XPath路徑信息;然后通過(guò)新舊版本W(wǎng)eb UI頁(yè)面的DOM樹(shù)進(jìn)行差異比較,構(gòu)造差異DOM樹(shù),并利用失效腳本中的XPath路徑信息對(duì)差異DOM樹(shù)進(jìn)行減枝優(yōu)化;最后通過(guò)優(yōu)化以后的差異DOM樹(shù)并結(jié)合網(wǎng)頁(yè)元素XPath路徑生成算法,提取出可用于失效腳本對(duì)應(yīng)網(wǎng)頁(yè)元素重定位的有效XPath路徑,進(jìn)而幫助測(cè)試人員快速、準(zhǔn)確地進(jìn)行測(cè)試腳本修復(fù)。
模型構(gòu)建過(guò)程主要分為新舊版本W(wǎng)eb UI頁(yè)面 DOM樹(shù)的序列化表示、構(gòu)造差異DOM樹(shù)、差異DOM樹(shù)的優(yōu)化及網(wǎng)頁(yè)元素的重定位四個(gè)部分。
DOM樹(shù)可以看作根據(jù)HTML和XML文檔所形成的一棵對(duì)象節(jié)點(diǎn)樹(shù)[10]。一個(gè)Web UI頁(yè)面可以用一棵完整的DOM樹(shù)來(lái)表示。在一棵DOM樹(shù)中,各節(jié)點(diǎn)的位置可表示為從DOM樹(shù)的根節(jié)點(diǎn)到此節(jié)點(diǎn)所經(jīng)過(guò)的所有節(jié)點(diǎn)標(biāo)簽組成的序列[11],則一個(gè)葉子節(jié)點(diǎn)完整的樹(shù)路徑如式(1)所示。
L=(c,s1,s2,…,sn,w1,w2,…,wm),
(1)
其中,c表示DOM樹(shù)中該葉子節(jié)點(diǎn)路徑出現(xiàn)的總次數(shù);(s1,s2,…,sn)表示該葉子節(jié)點(diǎn)路徑所有標(biāo)簽(含屬性)所組成的序列,(w1,w2,…,wm)表示該葉子節(jié)點(diǎn)路徑出現(xiàn)的位置。
由式(1)可知,當(dāng)某一Web UI頁(yè)面發(fā)生更新時(shí),新舊版本W(wǎng)eb UI頁(yè)面所對(duì)應(yīng)的DOM樹(shù)可以分別表示成由上述一系列樹(shù)路徑標(biāo)簽序列所組成的集合,記為T(mén)0和T1。
T0={L01,L02,…,L0i},
(2)
T1={L11,L12,…,L1i}.
(3)
因?yàn)椴町怐OM樹(shù)是通過(guò)比較新舊版本W(wǎng)eb UI頁(yè)面DOM樹(shù)的差異而生成的對(duì)象節(jié)點(diǎn)樹(shù),所以差異DOM樹(shù)對(duì)應(yīng)的樹(shù)路徑必然位于T0和T1的對(duì)稱(chēng)差集中,記為T(mén)d。
Td={x|x∈T0∪T1,x?T0∩T1}.
(4)
接下來(lái)就是利用Td來(lái)構(gòu)造新舊版本W(wǎng)eb UI頁(yè)面的差異DOM樹(shù)。由于本文方法是針對(duì)同一Web UI頁(yè)面框架及內(nèi)容更新所引起的自動(dòng)化測(cè)試腳本失效問(wèn)題,通過(guò)大量的實(shí)例研究,同一Web UI頁(yè)面的更新大體可以分為以下六種類(lèi)型:①頁(yè)面控件外觀改變;②頁(yè)面控件位置改變;③頁(yè)面控件內(nèi)容改變;④頁(yè)面控件標(biāo)簽層級(jí)變動(dòng);⑤增加頁(yè)面控件;⑥刪除頁(yè)面控件。以上各種更新無(wú)論是通過(guò)CSS來(lái)控制頁(yè)面的改變,還是對(duì)節(jié)點(diǎn)標(biāo)簽和屬性直接修改,又或者是通過(guò)嵌入HTML的JavaScript方式來(lái)修改,正常的開(kāi)發(fā)者由于其開(kāi)發(fā)習(xí)慣或?yàn)榱吮WC后續(xù)的可維護(hù)性,對(duì)頁(yè)面進(jìn)行改版時(shí)都會(huì)遵循相似的原則,從DOM樹(shù)的角度來(lái)看,改版前后發(fā)生改變的頁(yè)面元素所對(duì)應(yīng)的樹(shù)路徑中,包含相同id屬性串或者class屬性串(如果沒(méi)有id屬性)的節(jié)點(diǎn)必然具有公共的雙親節(jié)點(diǎn)。這里需要注意的是,當(dāng)Web UI頁(yè)面發(fā)生類(lèi)型⑤和⑥的更新,即增加和刪除頁(yè)面控件時(shí),相關(guān)節(jié)點(diǎn)是沒(méi)有公共雙親節(jié)點(diǎn)的,其自身的雙親節(jié)點(diǎn)即為公共雙親節(jié)點(diǎn)。
為了提高后續(xù)網(wǎng)頁(yè)元素重定位的效率,在差異DOM樹(shù)構(gòu)造過(guò)程中,具有公共雙親節(jié)點(diǎn)的樹(shù)路徑需要被掛到相同節(jié)點(diǎn)下。則構(gòu)造差異DOM樹(shù)的核心問(wèn)題即轉(zhuǎn)化為如何從差異DOM樹(shù)路徑集合Td中找出所有含相同id屬性串或者class屬性串節(jié)點(diǎn)的公共雙親節(jié)點(diǎn),獲取公共雙親節(jié)點(diǎn)的具體處理過(guò)程見(jiàn)算法1。
算法1 獲取公共雙親節(jié)點(diǎn)算法
Input:差異DOM樹(shù)路徑序列Tdlist
Output:Tdlist中所有含有相同id|class屬性串節(jié)點(diǎn)的公共雙親節(jié)點(diǎn)序列PNode
PNode? ? //初始化結(jié)果集合
for i in range(Tdlist.length) do
Ssequence? ?
Ssequence ← Tdlist[i].S //獲取標(biāo)簽(含屬性)的序列
for tag in Ssequence do
node ← find(tag, id|class) //獲取包含id|class屬性串的標(biāo)簽節(jié)點(diǎn)
if node.parents ? PNode then
PNode ← node.parents //保存
end if
end for
end for
return PNode //輸出結(jié)果
結(jié)合算法1的結(jié)果PNode和Td即可完成差異DOM樹(shù)的構(gòu)造,例如④和⑤兩種類(lèi)型更新對(duì)應(yīng)的差異DOM樹(shù),如圖2所示。
圖2 局部差異DOM樹(shù)構(gòu)造
圖2中Root表示差異DOM樹(shù)根節(jié)點(diǎn),PNode1和PNode2表示公共雙親節(jié)點(diǎn),contain id1和contain id2表示含有id1和id2屬性的節(jié)點(diǎn),Leaf Node1和Leaf Node2表示葉子節(jié)點(diǎn),從Root開(kāi)始,左子樹(shù)對(duì)應(yīng)的是類(lèi)型⑤的更新,右子樹(shù)對(duì)應(yīng)的是類(lèi)型④的更新。
此時(shí)的差異DOM樹(shù)路徑集合記為T(mén)d0,Td0和Td的結(jié)構(gòu)類(lèi)似,但在(w1,w2,…,wm)即葉子節(jié)點(diǎn)路徑出現(xiàn)的位置上有顯著差異。
由差異DOM樹(shù)的構(gòu)造過(guò)程可知,其中包含了所有更新類(lèi)型對(duì)應(yīng)網(wǎng)頁(yè)元素正確及失效的子樹(shù)分支,為了進(jìn)一步提高后續(xù)網(wǎng)頁(yè)元素重定位的精度和效率,需要對(duì)差異DOM樹(shù)進(jìn)行必要的優(yōu)化。本文提出了一種利用Selenium IDE錄制和回放功能的差異DOM樹(shù)剪枝優(yōu)化算法,將失效的XPath路徑對(duì)應(yīng)的子樹(shù)分枝從差異DOM樹(shù)中移除,以進(jìn)一步縮小后續(xù)網(wǎng)頁(yè)元素重定位的范圍。為了描述和處理的方便,錯(cuò)誤測(cè)試報(bào)告中失效的XPath路徑信息也要先將其表示成Td0類(lèi)似的結(jié)構(gòu),記為T(mén)e。
Te={Le1,Le2,…,Lex}.
(5)
差異DOM樹(shù)剪枝優(yōu)化算法的具體處理過(guò)程見(jiàn)算法2。
算法2 差異DOM樹(shù)剪枝優(yōu)化算法
Input:此時(shí)差異DOM樹(shù)路徑序列Td0list,錯(cuò)誤樹(shù)路徑序列Telist
Output:Td0list中可以用于腳本修復(fù)的正確樹(shù)路徑序列Ttlist
Ttlist ? ? //初始化結(jié)果集合
for i in range(Td0list.length) do
wseq ? ?
wseq←Td0list[i].S //獲取輸入集中的標(biāo)簽序列
for path in Telist do //遍歷
if path.s ∈ wseq then // 存在相同標(biāo)簽序列
Ttlist ←removepath(Td0list,path) //剪枝
end if
end for
end for
return Ttlist //輸出結(jié)果
失效測(cè)試腳本對(duì)應(yīng)網(wǎng)頁(yè)元素的重定位問(wèn)題,其實(shí)質(zhì)就是從經(jīng)過(guò)優(yōu)化的差異DOM樹(shù)(記為T(mén)t)中生成可以用于測(cè)試腳本修復(fù)的正確XPath路徑,然后替換或刪除掉失效腳本中的錯(cuò)誤XPath路徑,即可完成測(cè)試腳本的修復(fù)。由1.2節(jié)的分析可知,Web UI的更新可以分為頁(yè)面控件外觀改變、頁(yè)面控件位置改變、頁(yè)面控件內(nèi)容改變、頁(yè)面控件標(biāo)簽層級(jí)變動(dòng)、頁(yè)面控件增加和頁(yè)面控件刪除六種類(lèi)型。前五種類(lèi)型的更新所對(duì)應(yīng)測(cè)試腳本修復(fù)問(wèn)題是相同的,只需提取正確的XPath路徑并替換失效腳本中的錯(cuò)誤路徑即可,第六種類(lèi)型的更新則需要提取其對(duì)應(yīng)的XPath路徑并從失效的腳本中剔除。
本文采用DFS與優(yōu)化差異DOM樹(shù)相結(jié)合的網(wǎng)頁(yè)元素XPath路徑生成算法。采用深度優(yōu)先搜索遍歷優(yōu)化差異DOM樹(shù)各子樹(shù)中的所有子節(jié)點(diǎn),通過(guò)記錄標(biāo)簽名和位置值生成所需的Xpath路徑,并結(jié)合舊版DOM樹(shù)的樹(shù)路徑序列來(lái)判定生成的Xpath路徑在Web UI測(cè)試腳本修復(fù)過(guò)程中的處理方式(替換或刪除)。網(wǎng)頁(yè)元素XPath路徑生成算法的具體處理過(guò)程見(jiàn)算法3。
算法3 網(wǎng)頁(yè)元素Xpath路徑生成算法
Input:優(yōu)化的差異DOM樹(shù)路徑序列Ttlist,舊版Web UI DOM樹(shù)路徑序列T0list
Output:Ttlist中可以用于腳本修復(fù)的Xpath路徑序列Xlist1和Xlist2
function DFS_XPATH(tseq) //遍歷標(biāo)簽序列中所有的標(biāo)簽節(jié)點(diǎn),生成XPath路徑
tag_xpath ? ‘//’
position ? 0
for node ∈ tseq do
Tag_name ← node. Tag_name
tag_xpath ← tag_xpath + Tag_name + ‘[’ + position + ‘]’
position ← position + 1
end for
return tag_xpath
end function
Xlist1,Xlist2 ? ? //初始化結(jié)果集合
for i ∈range(Ttlist.length) do
Tseq? ?
Tseq ←Ttlist[i].S //獲取各子樹(shù)分枝的標(biāo)簽序列
if Tseq ? T0list.S then
Xlist1 ← call DFS_XPATH(Tseq) //需要?jiǎng)h除的XPath路徑
else
Xlist2 ← call DFS_XPATH(Tseq) //需要替換的XPath路徑
end if
end for
return Xlist1,Xlist2 //輸出結(jié)果
現(xiàn)有可用于Web UI自動(dòng)化測(cè)試腳本修復(fù)的網(wǎng)頁(yè)元素重定位方法大都是基于新舊Web UI頁(yè)面DOM樹(shù)本體的操作,幾乎沒(méi)有利用新舊Web UI頁(yè)面DOM樹(shù)的差異比較,即構(gòu)造差異DOM樹(shù)來(lái)進(jìn)行網(wǎng)頁(yè)元素重定位。因此實(shí)驗(yàn)對(duì)比的是現(xiàn)有的沒(méi)有構(gòu)造差異DOM樹(shù)的方法和本文構(gòu)造差異DOM樹(shù)的方法在網(wǎng)頁(yè)元素重定位精度和效率上的差異。為了實(shí)驗(yàn)結(jié)果描述和分析的方便,現(xiàn)有的方法記為Original DOM,本文提出的方法記為Improved DOM。
選取安徽電子信息職業(yè)技術(shù)學(xué)院校情智能分析平臺(tái)教師用戶(hù)界面的v1和v2兩個(gè)迭代開(kāi)發(fā)版本,通過(guò)在v2版本中有針對(duì)性地設(shè)置四種不同規(guī)模的更新測(cè)試樣本(涉及更新的網(wǎng)頁(yè)元素分別為120、240、360和480 個(gè))來(lái)驗(yàn)證本文Improved DOM方法的應(yīng)用效果。實(shí)驗(yàn)機(jī)器配置為Intel i7-9700K(3.6 G/12 M/8核)、16 G DDR4和256 G SSD固態(tài)硬盤(pán),實(shí)驗(yàn)平臺(tái)為Win10+Python3.10。
為了驗(yàn)證本文Improved DOM方法在網(wǎng)頁(yè)元素重定位精度和運(yùn)行時(shí)間上的改進(jìn)效果,先利用Selenium IDE錄制了v1版本測(cè)試腳本集,然后在v2版本上回放錄制的測(cè)試腳本集,并提取出錯(cuò)誤測(cè)試報(bào)告中失效的XPath路徑信息,最后分別采用現(xiàn)有Original DOM方法和本文Improved DOM方法進(jìn)行失效腳本對(duì)應(yīng)網(wǎng)頁(yè)元素的重定位。實(shí)驗(yàn)得到的平均重定位精度與平均運(yùn)算時(shí)間如表1所示。
表1 兩種方法重定位精度和運(yùn)行時(shí)間比較
由表1可以看出,本文Improved DOM方法大幅減少了運(yùn)行時(shí)間,平均運(yùn)行時(shí)間只為Original DOM方法的28%左右,重定位精度也有明顯提升,且隨著更新網(wǎng)頁(yè)元素?cái)?shù)量的增加,本文Improved DOM方法重定位精度下降更為緩慢,重定位效果較好。
本文針對(duì)同一Web UI頁(yè)面頻繁更新所帶來(lái)的自動(dòng)測(cè)試腳本失效問(wèn)題,利用新舊版本W(wǎng)eb UI頁(yè)面對(duì)應(yīng)DOM樹(shù)的差異和舊版測(cè)試腳本在新版本頁(yè)面上回放所生成的錯(cuò)誤測(cè)試報(bào)告中的失效XPath路徑,提出了一種可以應(yīng)用于Web UI自動(dòng)化測(cè)試腳本修復(fù)的網(wǎng)頁(yè)元素重定位方法。該方法通過(guò)新舊Web UI頁(yè)面差異DOM樹(shù)的構(gòu)造和優(yōu)化,大幅減少了網(wǎng)頁(yè)元素重定位的運(yùn)算量,降低了誤定位率,提高了執(zhí)行效率。實(shí)驗(yàn)結(jié)果表明,該方法運(yùn)行時(shí)間短,定位精度高,是一種穩(wěn)定性強(qiáng)、效果較好的可用于Web UI自動(dòng)化測(cè)試腳本修復(fù)的網(wǎng)頁(yè)元素重定位方法。