【节点的故事】
上一篇 / 下一篇 2009-08-03 21:54:11 / 个人分类:QTP
出自 《51测试天地》第十四期 作者:卢晨之51Testing软件测试网3P){8Y#Gq5m7L
前言:51Testing软件测试网pj7f z$k.W'^3~
有一天,一家学校的校长在典礼上叫了Tom的名字,这时候有8位学生都站了出来。校长事先已经记住了排队顺序中第3个班的Tom就是他要叫的。但由于今天班级顺序都打乱了,校长看了,只能再次叫道,父亲是Jack,出列。幸运的是,这个时候学生只有2位。校长再加了个条件,爷爷叫William,父亲是Jack的出列.最后,就只剩下一个学生出列。51Testing软件测试网;p8kO%V z Y
/S)ZP+Jta-a F*L|t?01, QTP中相同属性的对象,通过添加Index去区别;51Testing软件测试网t ]2Y S]e#^N
2, 页面元素动态变化,难以通过Index去识别;51Testing软件测试网jQWX.CWl
3, 想根据文本提示不同,对相同类型元素做操作,却无从下手;
&Xp*E Wo)Z0而我们透过上面的故事可以知道,原来我们可以透过节点去解决这些问题,但要怎么做呢?
2[Zg2^s|G%B5W0一,简单了解Html节点
uTrST&@0大部分做过Web测试的测试员们都会偶尔好奇的看看程序的Html代码,也可能了解了Html节点,节点的特点就和树一样,能够让你更轻松的遍历出你需要的元素。例如:
0@k&RH&WL0<屋子屋主=小卢>51Testing软件测试网c%oQ^&k+YZ
<书架 名字=A >
&^'RRc2m:N6mDf0<书本名字= Java Cook Book >51Testing软件测试网!K7J~8?/up[#T|#R
<书本名字= QTP >
"RA9M5Kay'{ wfri0</书架>
#x.Rru*x[-D0<书架 名字=B >51Testing软件测试网Zw|+LV8Vv
<书本名字= Java Cook Book >51Testing软件测试网Q&zpJ*[iD(?s
<笔记名字=QTP学习笔记>
w5Y5X6ZzB2{0</书架>51Testing软件测试网[,rblGcv6@P
</屋子>
vl3Z ~m C0在这里面,屋子、书架、书本是节点,而我们就是通过这些节点去遍历得到我们想要的东西。通过上面的例子,我们也同样看到,使用不同的名字的书架,尽管有2本叫Java Cook Book的书,但都可以准确的得到我们想要的。51Testing软件测试网vV,XP4\#l
二,辅助工具51Testing软件测试网I H+U0b!xg%?
QTP中的Object Spy功能,是在使用QTP过程中比较长用到的功能,但是,QTP对某些表格标记节点、部分排版标记等不能很准确的抓取出来,也就无法透过SPY功能看到Html的节点上下层关系,也不能让我们更好的了解节点与节点之间的联系从而做好编写脚本的工作。
U[9e}6ob6aTl0在这里推荐使用的一个工具是微软的IEDevToolBar
$iv9U.oP'|01,下载安装:
I(p};Fd,xhSs0$r/J4Z,Z~7W?'w^0安装之后,在IE顶部菜单的“查看”-“工具栏”里面钩选“Developer Toolbar”项即可。重启IE后,可以在界面上看到一个这样的小图标
2,功能简介:
.prVK Fp)n0一般我们主要使用的几个功能:
BZ6C3o5W |n"S-U01),FindàSelect Element By Click
6Tf4J!C#y7J V6xJF ~0简单的获取页面元素,方便在树中查看。提示:在点击页面元素前,先随便选中节点树上面的一个节点,使得在做点击获取元素操作时候,能够展其开所在位置。
E'| fhkx]#\^02)OutlineàTable Cells、OutlineàTables、OutlineàDIV Elements
J7I!IL'ebh"a0用不同颜色标出所有的Table Cells、Tables、DIV
2gl%Lt7xuz3Z3v2n03) OutlineàAny Elements51Testing软件测试网 jOb:{1T mVU(q|9a
通过用户自己输入节点名,并选择颜色后,确定。在界面上会标示出所有同类型节点的元素。51Testing软件测试网I;|t#G2HsiXR
三,Dom的节点属性
V'fG l~/H1c3s0在对节点操作的时候,我们除了借助辅助工具去获取上下层节点的同时,但有时候可能因为节点的属性不确定,让我们不能直接获取节点。因此我们会借助一些比较常用的节点属性来获取。51Testing软件测试网N*c` Lu5rz
DOM节点属性
I dyt%x"@Ia%KU*r9K,y01.nodeName属性返回一个字符串,其内容是给定节点的名字:
5L.f*ZMi-x `0例子:Browser(“browser”).page(“page”).Link(“link”).object. parentNode.Nodename
f+geXLKpz_02.nodeType属性返回一个整数,这个数值代表着给定节点的类型:51Testing软件测试网9e.d!cR(wD*VP2kg
例子:Browser(“browser”).page(“page”).Link(“link”).object. parentNode. nodeType
,?7B0nPTaY2U#k:a03.nodeValue属性将返回给定节点的当前值:
*b,I9];IG2W8h-@c0例子:Browser(“browser”).page(“page”).Link(“link”).object. parentNode. nodeValue
&s ?^Y[E$F0遍历节点树
%Fg/j!MR` f?0j01.childNodes属性将返回一个数组,这个数组由给定元素节点的子节点构成:51Testing软件测试网!u[7}-X3YC|7?d$R
例子:Browser(“browser”).page(“page”).Link(“link”).object. childNodes51Testing软件测试网 P\r+@%W.g5eYz
2.firstChild属性将返回一个给定元素节点的第一个子节点:
nD(n x s0例子:Browser(“browser”).page(“page”).Link(“link”).object.firstChild
{~fuKo%[ a03.lastChild属性将返回一个给定元素节点的最后一个子节点:51Testing软件测试网4JGe.p JV"_a[%\s
例子:Browser(“browser”).page(“page”).Link(“link”).object.lastChild
2BA0t:L5IN0]_c04.nextSibling属性将返回一个给定节点的下一个子节点51Testing软件测试网5a@#r q BZ*g5jF8B
例子:Browser(“browser”).page(“page”).Link(“link”).object.nextSibling51Testing软件测试网'St&ESb Mvd-zp
5.parentNode属性将返回一个给定节点的父节点:
?p+Se"e U0例子:Browser(“browser”).page(“page”).Link(“link”).parentNode
m#Kn,F+Cl b0四,实战节点51Testing软件测试网7[1y0I[XFO_
1、 QTP相同属性的对象,如何不通过添加Index去区别?
a$o f"j2|?:U.IXS8s0首先看看下面的Html代码片,如果读者有兴趣,可以自己建一个Html文件,命名为Test.html,接着把代码片复制下去并保存。
H)@/F(n4[+a0<DIV id=div1>51Testing软件测试网7D6@'x gY!}5m6l\
<a href=http://www.51testing.com>测试</a>
"@:h?_.fC/rr%D7K0</DIV>51Testing软件测试网a tz]+Jo
<DIV id=div2>
a+bJ7q/n-W-J@0<a href=http://www.baidu.com>测试</a>51Testing软件测试网6n W1?,U,b
</DIV>
{^]XUYm0使用QTP我们把2个“测试”的Link都添加进对象库后,我们会发现对象库会分别给他们都添加一个index属性。但是我们透过了IEDevToolBar可以看到如下图片的树:
\mOgX[ A051Testing软件测试网 jUFWh2o A%r W`7o
/A4hxh J}0B6{0
可以看到原来每个连接分别包含在DIV节点下面,所以要点击第二个连接时候,可以这么写:
DQ4}B$J*w.p&T:{U.L0browser("Browser").Page("Page").webelement("html id:=div2").link("index:=0").click51Testing软件测试网%fkX7},r?4R_nn
在这里,先通过ID获取了DIV的这个对象,然后点击它下面的第一个Link。这个方法的优点在于我们不是直接的在Page上寻找Link,而是更为仔细的透过它的父节点来找到它。有些时候对象添加进对象库,由于识别机制问题,若干个对象都被添加为同一个对象,导致了无法操作,这时候,我们如法炮制的使用这个方法,哪么问题也就迎刃而解。
8rASmT ML0哪么,我们使用这种方法就只能做这点事情吗?你可以带着这个问题继续往下看。
0D.A+X*_;o;[r'q02、 页面元素动态变化,难以通过Index去识别?51Testing软件测试网6Z @b ]%A*QF,L
在做自动化项目中,由于用户的权限的不同,菜单、页面显示的效果也不一样,哪么我们录制的脚本完全就排不上场,好比下面的2个图片:51Testing软件测试网6L v2r)O`yRi1xq
DH2l,_`9x"B0(用户1) (用户2)
M b5|S{3p"hO0首先,我在这里需要解决2个问题:51Testing软件测试网 La3?;sF/m+zq
第一个是因为用户权限、其他因素导致了页面元素动态变化,同一个“打开”对象在不同情况下功能不一致。
;{gQ6Y9Aa4f#k/|w0第二个是页面需要被操作的元素属性基本一致。51Testing软件测试网P*Jv:o&s!V8P%d'q
这个效果很像我们有时候在项目中遇见的菜单的展开和收缩。我们需要以不变应万变。(连接也可以换成图片“+”、“-”等。)
1Ozl1x2Cge&l$K0大家同样有兴趣可以建一个Html文件,并保存下面代码:51Testing软件测试网&mtEc*nVJ,U
<table id=table2> 51Testing软件测试网1bpWX*I9Em
<tr><td>
6yH(n8`M0<a href=http://www.google.com>打开</a></td>51Testing软件测试网d*C&@v$Rw7]
<td><table >
{%P+q7i5~ t0<td><div>谷歌</div></td>51Testing软件测试网|IX j/WLN4]
</table></td></tr>51Testing软件测试网 fv4~kW1xv
</table>
&T3j{4rf0<table id=table1>
H p @S}0<tr><td>