一种用于Web UI自动化测试脚本修复的网页元素重定位方法

2023-10-10 07:36陈俊生彭莉芬
长春师范大学学报 2023年8期
关键词:脚本控件网页

陈俊生,彭莉芬

(安徽电子信息职业技术学院,安徽 蚌埠 233030)

0 引言

为了保证更好的用户体验和反数据爬取的需求,Web UI页面更新迭代速度非常快,其直接后果就是导致原有的测试脚本失效[1]。此时重新生成测试脚本代价昂贵,因此修复旧的测试脚本集是最佳选择[2-3]。Web UI页面更新迭代带来的测试脚本失效问题,其实质还是由于网页元素结构改变所造成的网页元素定位失效问题。网页元素定位方法分为基于DOM树、基于模板匹配和基于机器视角三大类[4-6]。目前被广泛应用于自动化测试的方法主要是基于DOM树的网页元素定位方法,通过对DOM树的元素进行识别和定位来完成测试脚本的生成和修复工作。

Selenium是一个基于DOM树的Web应用程序自动化测试工具[7],测试直接运行在浏览器中可以最大限度模拟用户的实际操作,支持XPath、CSS选择器和元素属性等多种网页元素定位方法。Selenium IDE是其中一个工具,该工具除了可以编辑和调试测试以外,还可以录制和回放测试。在Web UI自动化测试脚本修复方面,多种基于Selenium IDE录制、回放功能和新旧版本Web UI页面DOM树的网页元素重定位方法被提出[5,8-9],取得了不错的效果,但也存在不足。例如现有方法普遍是对新旧版本Web UI页面DOM树本体进行操作,运算量大,耗时较长,并且存在一定的误定位。为了应对上述问题,本文利用新旧版本Web UI页面DOM树的差异对现有方法进行改进,设计了一种基于优化差异DOM树的网页元素重定位方法,目的在于优化现有的算法规则,以减少网页元素重定位的运算量,降低误定位率。

1 基于优化差异DOM树的网页元素重定位方法模型构建

本文提出基于优化差异DOM树的网页元素重定位方法模型,如图1所示。

图1 基于优化差异DOM树的网页元素重定位方法模型

其核心思想就是利用新旧版本Web UI页面 DOM树的差异和旧版测试脚本在新版本页面上回放所生成错误测试报告中的失效XPath路径,最大限度地缩小网页元素重定位范围,通过一系列算法的提出,最终实现失效脚本对应网页元素快速、准确重定位。具体来说,在Web UI迭代开发的过程中,首先利用Selenium IDE录制旧版Web UI页面的测试脚本,当Web UI发生更新时,先获取旧版测试脚本在新版页面上回放的错误测试报告,并提取报告中失效的XPath路径信息;然后通过新旧版本Web UI页面的DOM树进行差异比较,构造差异DOM树,并利用失效脚本中的XPath路径信息对差异DOM树进行减枝优化;最后通过优化以后的差异DOM树并结合网页元素XPath路径生成算法,提取出可用于失效脚本对应网页元素重定位的有效XPath路径,进而帮助测试人员快速、准确地进行测试脚本修复。

模型构建过程主要分为新旧版本Web UI页面 DOM树的序列化表示、构造差异DOM树、差异DOM树的优化及网页元素的重定位四个部分。

1.1 新旧版本Web UI页面DOM树的序列化表示

DOM树可以看作根据HTML和XML文档所形成的一棵对象节点树[10]。一个Web UI页面可以用一棵完整的DOM树来表示。在一棵DOM树中,各节点的位置可表示为从DOM树的根节点到此节点所经过的所有节点标签组成的序列[11],则一个叶子节点完整的树路径如式(1)所示。

L=(c,s1,s2,…,sn,w1,w2,…,wm),

(1)

其中,c表示DOM树中该叶子节点路径出现的总次数;(s1,s2,…,sn)表示该叶子节点路径所有标签(含属性)所组成的序列,(w1,w2,…,wm)表示该叶子节点路径出现的位置。

由式(1)可知,当某一Web UI页面发生更新时,新旧版本Web UI页面所对应的DOM树可以分别表示成由上述一系列树路径标签序列所组成的集合,记为T0和T1。

T0={L01,L02,…,L0i},

(2)

T1={L11,L12,…,L1i}.

(3)

1.2 构造差异DOM树

因为差异DOM树是通过比较新旧版本Web UI页面DOM树的差异而生成的对象节点树,所以差异DOM树对应的树路径必然位于T0和T1的对称差集中,记为Td。

Td={x|x∈T0∪T1,x∉T0∩T1}.

(4)

接下来就是利用Td来构造新旧版本Web UI页面的差异DOM树。由于本文方法是针对同一Web UI页面框架及内容更新所引起的自动化测试脚本失效问题,通过大量的实例研究,同一Web UI页面的更新大体可以分为以下六种类型:①页面控件外观改变;②页面控件位置改变;③页面控件内容改变;④页面控件标签层级变动;⑤增加页面控件;⑥删除页面控件。以上各种更新无论是通过CSS来控制页面的改变,还是对节点标签和属性直接修改,又或者是通过嵌入HTML的JavaScript方式来修改,正常的开发者由于其开发习惯或为了保证后续的可维护性,对页面进行改版时都会遵循相似的原则,从DOM树的角度来看,改版前后发生改变的页面元素所对应的树路径中,包含相同id属性串或者class属性串(如果没有id属性)的节点必然具有公共的双亲节点。这里需要注意的是,当Web UI页面发生类型⑤和⑥的更新,即增加和删除页面控件时,相关节点是没有公共双亲节点的,其自身的双亲节点即为公共双亲节点。

为了提高后续网页元素重定位的效率,在差异DOM树构造过程中,具有公共双亲节点的树路径需要被挂到相同节点下。则构造差异DOM树的核心问题即转化为如何从差异DOM树路径集合Td中找出所有含相同id属性串或者class属性串节点的公共双亲节点,获取公共双亲节点的具体处理过程见算法1。

算法1 获取公共双亲节点算法

Input:差异DOM树路径序列Tdlist

Output:Tdlist中所有含有相同id|class属性串节点的公共双亲节点序列PNode

PNode⟸ Ø //初始化结果集合

for i in range(Tdlist.length) do

Ssequence⟸ Ø

Ssequence ← Tdlist[i].S //获取标签(含属性)的序列

for tag in Ssequence do

node ← find(tag, id|class) //获取包含id|class属性串的标签节点

if node.parents ∉ PNode then

PNode ← node.parents //保存

end if

end for

end for

return PNode //输出结果

结合算法1的结果PNode和Td即可完成差异DOM树的构造,例如④和⑤两种类型更新对应的差异DOM树,如图2所示。

图2 局部差异DOM树构造

图2中Root表示差异DOM树根节点,PNode1和PNode2表示公共双亲节点,contain id1和contain id2表示含有id1和id2属性的节点,Leaf Node1和Leaf Node2表示叶子节点,从Root开始,左子树对应的是类型⑤的更新,右子树对应的是类型④的更新。

此时的差异DOM树路径集合记为Td0,Td0和Td的结构类似,但在(w1,w2,…,wm)即叶子节点路径出现的位置上有显著差异。

1.3 差异DOM树的优化

由差异DOM树的构造过程可知,其中包含了所有更新类型对应网页元素正确及失效的子树分支,为了进一步提高后续网页元素重定位的精度和效率,需要对差异DOM树进行必要的优化。本文提出了一种利用Selenium IDE录制和回放功能的差异DOM树剪枝优化算法,将失效的XPath路径对应的子树分枝从差异DOM树中移除,以进一步缩小后续网页元素重定位的范围。为了描述和处理的方便,错误测试报告中失效的XPath路径信息也要先将其表示成Td0类似的结构,记为Te。

Te={Le1,Le2,…,Lex}.

(5)

差异DOM树剪枝优化算法的具体处理过程见算法2。

算法2 差异DOM树剪枝优化算法

Input:此时差异DOM树路径序列Td0list,错误树路径序列Telist

Output:Td0list中可以用于脚本修复的正确树路径序列Ttlist

Ttlist ⟸ Ø //初始化结果集合

for i in range(Td0list.length) do

wseq ⟸ Ø

wseq←Td0list[i].S //获取输入集中的标签序列

for path in Telist do //遍历

if path.s ∈ wseq then // 存在相同标签序列

Ttlist ←removepath(Td0list,path) //剪枝

end if

end for

end for

return Ttlist //输出结果

1.4 网页元素的重定位

失效测试脚本对应网页元素的重定位问题,其实质就是从经过优化的差异DOM树(记为Tt)中生成可以用于测试脚本修复的正确XPath路径,然后替换或删除掉失效脚本中的错误XPath路径,即可完成测试脚本的修复。由1.2节的分析可知,Web UI的更新可以分为页面控件外观改变、页面控件位置改变、页面控件内容改变、页面控件标签层级变动、页面控件增加和页面控件删除六种类型。前五种类型的更新所对应测试脚本修复问题是相同的,只需提取正确的XPath路径并替换失效脚本中的错误路径即可,第六种类型的更新则需要提取其对应的XPath路径并从失效的脚本中剔除。

本文采用DFS与优化差异DOM树相结合的网页元素XPath路径生成算法。采用深度优先搜索遍历优化差异DOM树各子树中的所有子节点,通过记录标签名和位置值生成所需的Xpath路径,并结合旧版DOM树的树路径序列来判定生成的Xpath路径在Web UI测试脚本修复过程中的处理方式(替换或删除)。网页元素XPath路径生成算法的具体处理过程见算法3。

算法3 网页元素Xpath路径生成算法

Input:优化的差异DOM树路径序列Ttlist,旧版Web UI DOM树路径序列T0list

Output:Ttlist中可以用于脚本修复的Xpath路径序列Xlist1和Xlist2

function DFS_XPATH(tseq) //遍历标签序列中所有的标签节点,生成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 ⟸ Ø //初始化结果集合

for i ∈range(Ttlist.length) do

Tseq⟸ Ø

Tseq ←Ttlist[i].S //获取各子树分枝的标签序列

if Tseq ⊂ T0list.S then

Xlist1 ← call DFS_XPATH(Tseq) //需要删除的XPath路径

else

Xlist2 ← call DFS_XPATH(Tseq) //需要替换的XPath路径

end if

end for

return Xlist1,Xlist2 //输出结果

2 实验结果与分析

现有可用于Web UI自动化测试脚本修复的网页元素重定位方法大都是基于新旧Web UI页面DOM树本体的操作,几乎没有利用新旧Web UI页面DOM树的差异比较,即构造差异DOM树来进行网页元素重定位。因此实验对比的是现有的没有构造差异DOM树的方法和本文构造差异DOM树的方法在网页元素重定位精度和效率上的差异。为了实验结果描述和分析的方便,现有的方法记为Original DOM,本文提出的方法记为Improved DOM。

选取安徽电子信息职业技术学院校情智能分析平台教师用户界面的v1和v2两个迭代开发版本,通过在v2版本中有针对性地设置四种不同规模的更新测试样本(涉及更新的网页元素分别为120、240、360和480 个)来验证本文Improved DOM方法的应用效果。实验机器配置为Intel i7-9700K(3.6 G/12 M/8核)、16 G DDR4和256 G SSD固态硬盘,实验平台为Win10+Python3.10。

为了验证本文Improved DOM方法在网页元素重定位精度和运行时间上的改进效果,先利用Selenium IDE录制了v1版本测试脚本集,然后在v2版本上回放录制的测试脚本集,并提取出错误测试报告中失效的XPath路径信息,最后分别采用现有Original DOM方法和本文Improved DOM方法进行失效脚本对应网页元素的重定位。实验得到的平均重定位精度与平均运算时间如表1所示。

表1 两种方法重定位精度和运行时间比较

由表1可以看出,本文Improved DOM方法大幅减少了运行时间,平均运行时间只为Original DOM方法的28%左右,重定位精度也有明显提升,且随着更新网页元素数量的增加,本文Improved DOM方法重定位精度下降更为缓慢,重定位效果较好。

3 结语

本文针对同一Web UI页面频繁更新所带来的自动测试脚本失效问题,利用新旧版本Web UI页面对应DOM树的差异和旧版测试脚本在新版本页面上回放所生成的错误测试报告中的失效XPath路径,提出了一种可以应用于Web UI自动化测试脚本修复的网页元素重定位方法。该方法通过新旧Web UI页面差异DOM树的构造和优化,大幅减少了网页元素重定位的运算量,降低了误定位率,提高了执行效率。实验结果表明,该方法运行时间短,定位精度高,是一种稳定性强、效果较好的可用于Web UI自动化测试脚本修复的网页元素重定位方法。

猜你喜欢
脚本控件网页
酒驾
安奇奇与小cool 龙(第二回)
数据库系统shell脚本应用
关于.net控件数组的探讨
基于CSS的网页导航栏的设计
快乐假期
基于URL和网页类型的网页信息采集研究
网页制作在英语教学中的应用
ASP.NET服务器端验证控件的使用
10个必知的网页设计术语