原创日志转载请标明出处与连接! 大家的支持是我的动力!_______卢晨之 (luchenzhi@21cn.com/@hotmail.com)

【节点的故事】

上一篇 / 下一篇  2009-08-03 21:54:11 / 个人分类:QTP

出自 《51测试天地》第十四期 作者:卢晨之51Testing软件测试网3P){8Y#Gq5m7L

gFq4?Y([/X0

前言:51Testing软件测试网pj7f z$k.W'^3~

   有一天,一家学校的校长在典礼上叫了Tom的名字,这时候有8位学生都站了出来。校长事先已经记住了排队顺序中第3个班的Tom就是他要叫的。但由于今天班级顺序都打乱了,校长看了,只能再次叫道,父亲是Jack,出列。幸运的是,这个时候学生只有2位。校长再加了个条件,爷爷叫William,父亲是Jack的出列.最后,就只剩下一个学生出列。51Testing软件测试网;p8k O%V z Y

   在做WebQTP自动化测试时候,不免会出现这样几种情况:

/S)ZP+Jt a-a F*L|t?0

1, QTP中相同属性的对象,通过添加Index去区别;51Testing软件测试网t ]2Y S]e#^N

2, 页面元素动态变化,难以通过Index去识别;51Testing软件测试网jQW X.CWl

3, 想根据文本提示不同,对相同类型元素做操作,却无从下手;

&Xp*E Wo)Z0

   而我们透过上面的故事可以知道,原来我们可以透过节点去解决这些问题,但要怎么做呢?

2[Zg2^s|G%B5W0

 51Testing软件测试网;N Lo"U)K {

一,简单了解Html节点

uTrS T&@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'{wfr i0

   </书架>

#x.Rru*x[-D0

      <书架  名字=B >51Testing软件测试网Zw|+LV8Vv

             <书本名字= Java Cook Book >51Testing软件测试网Q&zpJ*[iD(?s

             <笔记名字=QTP学习笔记>

w5Y5X6ZzB2{0

   </书架>51Testing软件测试网[,rblG cv6@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'|0

1,下载安装:

I(p};Fd,x hSs0

http://www.microsoft.com/downloads/details.aspx?FamilyID=e59c3964-672d-4511-bb3e-2d5e1db91038&DisplayLang=en

$r/J4Z,Z~7W?'w^0

安装之后,在IE顶部菜单的查看工具栏里面钩选“Developer Toolbar”项即可。重启IE后,可以在界面上看到一个这样的小图标,点它。打开它,如图:

/F:v%z4@%t.j7u0

$AS3J O^P \)bpS0

pMFh.w8tt0

2,功能简介:

.prVK Fp)n0

一般我们主要使用的几个功能:

BZ6C3o5W |n"S-U0

      1),FindàSelect Element By Click

6Tf4J!C#y7J V6xJF ~0

       简单的获取页面元素,方便在树中查看。提示:在点击页面元素前,先随便选中节点树上面的一个节点,使得在做点击获取元素操作时候,能够展其开所在位置。

E'| fhkx]#\^0

      2OutlineàTable CellsOutlineàTablesOutlineàDIV Elements

J7I!IL'ebh"a0

       用不同颜色标出所有的Table CellsTablesDIV

2gl%Lt7xuz3Z3v2n0

3)       OutlineàAny Elements51Testing软件测试网jO b:{1T mVU(q|9a

通过用户自己输入节点名,并选择颜色后,确定。在界面上会标示出所有同类型节点的元素。51Testing软件测试网I;|t#G2HsiXR

 

d6xE[;N0

三,Dom的节点属性

V'fG l~/H1c3s0

在对节点操作的时候,我们除了借助辅助工具去获取上下层节点的同时,但有时候可能因为节点的属性不确定,让我们不能直接获取节点。因此我们会借助一些比较常用的节点属性来获取。51Testing软件测试网N*c` Lu5rz

DOM节点属性

I dyt%x"@Ia%KU*r9K,y0

1.nodeName属性返回一个字符串,其内容是给定节点的名字:

5L.f*ZM i-x `0

例子:Browser(“browser”).page(“page”).Link(“link”).object. parentNode.Nodename

f+g eXLKpz_0

 

D9k4k;~w E0

2.nodeType属性返回一个整数,这个数值代表着给定节点的类型:51Testing软件测试网9e.d!cR(wD*VP2kg

例子:Browser(“browser”).page(“page”).Link(“link”).object. parentNode. nodeType

,?7B0nPTaY2U#k:a0

 

Gf^kY4M9w l V0

3.nodeValue属性将返回给定节点的当前值:

*b,I9];IG2W8h-@c0

例子:Browser(“browser”).page(“page”).Link(“link”).object. parentNode. nodeValue

&s ?^Y[E$F0

 

/Ml {/I J:@ _0

遍历节点树

%Fg/j!MR` f?0j0

1.childNodes属性将返回一个数组,这个数组由给定元素节点的子节点构成:51Testing软件测试网!u[7}-X3YC|7?d$R

例子:Browser(“browser”).page(“page”).Link(“link”).object. childNodes51Testing软件测试网 P\r+@%W.g5eYz

 51Testing软件测试网r/`D'J?JQH

2.firstChild属性将返回一个给定元素节点的第一个子节点:

nD(n xs0

例子:Browser(“browser”).page(“page”).Link(“link”).object.firstChild

{~fuKo%[ a0

 51Testing软件测试网_2iZDyi%O3x/kE

3.lastChild属性将返回一个给定元素节点的最后一个子节点:51Testing软件测试网4JGe.p JV"_a[%\s

例子:Browser(“browser”).page(“page”).Link(“link”).object.lastChild

2BA0t:L5IN0]_c0

 51Testing软件测试网)W)t3T N4kt

4.nextSibling属性将返回一个给定节点的下一个子节点51Testing软件测试网5a@#r qBZ*g5jF8B

例子:Browser(“browser”).page(“page”).Link(“link”).object.nextSibling51Testing软件测试网'St&ESbMvd-zp

 

1_^-x qW,R$I.\kY0

5.parentNode属性将返回一个给定节点的父节点:

?p+Se"e U0

例子:Browser(“browser”).page(“page”).Link(“link”).parentNode

m#Kn,F+Cl b0

 51Testing软件测试网`*D;}e9xk%l

四,实战节点51Testing软件测试网7[1y0I[XFO_

 51Testing软件测试网v1k7D^&Y ^

1、 QTP相同属性的对象,如何不通过添加Index去区别?

a$o f"j2|?:U.IXS8s0

首先看看下面的Html代码片,如果读者有兴趣,可以自己建一个Html文件,命名为Test.html,接着把代码片复制下去并保存。

H)@/F(n4[+a0

<DIV id=div1>51Testing软件测试网7D6@'xgY!}5m6l\

      <a href=http://www.51testing.com>测试</a>

"@:h?_.fC/rr%D7K0

</DIV>51Testing软件测试网atz]+Jo

 51Testing软件测试网!o(aM!b}

<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[ A0

51Testing软件测试网 jUFWh2o A%r W`7o

/A4hxh J}0B6{0

可以看到原来每个连接分别包含在DIV节点下面,所以要点击第二个连接时候,可以这么写:

DQ4}B$J*w.p&T:{U.L0

browser("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'q0

 51Testing软件测试网~o7V.Lc7n9|5@r

2、 页面元素动态变化,难以通过Index去识别?51Testing软件测试网6Z@b]%A*QF,L

在做自动化项目中,由于用户的权限的不同,菜单、页面显示的效果也不一样,哪么我们录制的脚本完全就排不上场,好比下面的2个图片:51Testing软件测试网6L v2r)O`yRi1xq

 

DH2l,_`9x"B0

 

!e Y%Q*| _ eh3B1S0

(用户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软件测试网&mt Ec*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软件测试网|I X j/WLN4]

   </table></td></tr>51Testing软件测试网 f v4~kW1xv

</table>

&T3j{4rf0

 51Testing软件测试网a2zj~+^ ^a

<table id=table1>   

Hp@S}0

   <tr><td>

y/Z!CJh(T0

      <a href=http://www.51testing.com>打开</a></td>51Testing软件测试网{^L I'_

      <td><table >51Testing软件测试网 ^2](| t[:C"x

       <td><div>51Testing</div></td>

{ v5@ T9mF+{P [0

   </table></td></tr>

:UK d r]&q0

</table>51Testing软件测试网+A!XSc3l)w

保持完毕后,我们打开了IEDevToolBar,可以瞧到下面的树形结构:51Testing软件测试网'Ov U\W

:[ \~?"g MP%d$z0

 

`#K;JVBo9O#d5o"_0

我们这里就做个点击“谷歌”字样前面的“打开”实例:

0BU^3_8l!e`8j0

Public function open(opentext)51Testing软件测试网pz-}'N%o6eo"C/?h"w

  Dim guge

kQb2F [Ho/U0

      If browser("Browser").Page("Page").WebElement("html tag:=DIV","innertext:="&opentext,"index:=0").Exist then ‘首先判断有这个字样的对象是否存在

.o?;sH+R;H0

         set guge=browser("Browser").Page("Page").WebElement("html tag:=DIV","innertext:=谷歌","index:=0")  把对象赋值给guge

{'SSf1`-oP0

            newid=guge.object.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.id      透过上面图片可以看到第8个节点是有id这个值的,这也是非常有价值的一个节点,所以我们只能通过它来做下步操作。所以这步的操作,可以记成一个简单的口诀,寻有价值节点。

|'}kq$T-Xyza0

             browser("Browser").Page("Page").WebElement("html id:="&newid).link("index:=0").click 和第一个例子的点击连接一样51Testing软件测试网iL.k;pa!N

      end if51Testing软件测试网4m.x$Z!huT

End Function51Testing软件测试网8z.nO O+?9g$l3F} H

open("谷歌")51Testing软件测试网X~w]U

实现了上面的点击打开操作后,在实战1中的问题也就没有了(什么?你忘记第一个问题是什么,也难怪,读得入神了)。51Testing软件测试网6t lq?)B"f#@(`

而在这个例子中,可能你会提出一个小小问题,是否它就真的能适用整个项目呢?其实像这种动态的Web,由于它会根据用户或者其他因素发生页面变动,所以它代码生成都是有自己的规则,也就是节点顺序一般都套用到其他地方,不会发生变化。51Testing软件测试网j$[C;X7kB

 

R,z(l)g$T u0

3,除了类似菜单选择实例,我们还能做什么?

xD7f/bWBo0

在项目里面,某些页面可输入框可谓是多不胜数,所以我们都只填写了必填的,而非必填的在测试用例中也很少体现出来,那么这部分是否也会成为漏网之鱼而今后成为一个祸根呢?如果你已经懂得如何应用节点去解决类似菜单的问题,同样的它也适用在这里。

{H:Ow1]U%L e0

看看下面图片:

!v9q5l(P?5].D]4t0

51Testing软件测试网w$eZz/]G+qD

51Testing软件测试网 \"R G!H[W yW

见 【节点的故事】续 http://www.51testing.com/?uid-174770-action-viewspace-itemid-142621

$sPiS0qVyi9rN,{0


%A!^n/M0Gr*H.j0

QY$u:p;oG1lw.[-h u0

版权声明:本文出自51Testing软件测试网电子杂志——《51测试天地》第十四期。51Testing软件测试网及相关内容提供者拥有51testing.com内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。51Testing软件测试网4U] | qU8vD
51Testing软件测试网zy6]9x:I5V

51Testing软件测试网$vQCd#TY


TAG:

 

评分:0

我来说两句

Open Toolbar