技术开发 频道

扼杀QTP检查点完结篇--节点的故事

  三、Dom 的节点属性

  在对节点操作的时候,我们除了借助辅助工具去获取上下层节点的同时,但

  有时候可能因为节点的属性不确定,让我们不能直接获取节点。因此我们会借助

  一些比较常用的节点属性来获取。

  (一)DOM 节点属性

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

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

  ame

  2、nodeType 属性返回一个整数,这个数值代表着给定节点的类型:

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

  ype

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

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

  alue

  (二)遍历节点树

  1、childNodes 属性将返回一个数组,这个数组由给定元素节点的子节点构

  成:

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

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

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

  3、lastChild 属性将返回一个给定元素节点的最后一个子节点:

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

  4、nextSibling 属性将返回一个给定节点的下一个子节点

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

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

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

  四、实战节点

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

  首先看看下面的Html 代码片,如果读者有兴趣,可以自己建一个Html 文

  件,命名为

  Test.html,接着把代码片复制下去并保存。

<DIV id=div1>
<a href=http://www.51testing.com>测试</a>
</DIV>
<DIV id=div2>
<a href=http://www.baidu.com>测试</a>
</DIV>

  使用QTP 我们把2 个“测试”的Link 都添加进对象库后,我们会发现对象

  库会分别给他们都添加一个index 属性。但是我们透过了IEDevToolBar 可以看

  到如下图片的树:

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

  时候,可以这么写:

  browser("Browser").Page("Page").webelement("html id:=div2").link("index:=0").

  click

  在这里,先通过ID 获取了DIV 的这个对象,然后点击它下面的第一个Link。

  这个方法的优点在于我们不是直接的在Page 上寻找Link,而是更为仔细的透过

  它的父节点来找到它。有些时候对象添加进对象库,由于识别机制问题,若干个

  对象都被添加为同一个对象,导致了无法操作,这时候,我们如法炮制的使用这

  个方法,哪么问题也就迎刃而解。

  那么,我们使用这种方法就只能做这点事情吗?你可以带着这个问题继续往

  下看。

  2、页面元素动态变化,难以通过Index 去识别?

  在做自动化项目中,由于用户的权限的不同,菜单、页面显示的效果也不一

  样,那么我

  们录制的脚本完全就排不上场,好比下面的2 个图片:

  首先,我在这里需要解决2 个问题:

  第一个是因为用户权限、其他因素导致了页面元素动态变化,同一个“打开”

  对象在不同情况下功能不一致。

  第二个是页面需要被操作的元素属性基本一致。

  这个效果很像我们有时候在项目中遇见的菜单的展开和收缩。我们需要以不

  变应万变。(连接也可以换成图片“+”、“-”等。)

  大家同样有兴趣可以建一个Html 文件,并保存下面代码:

<table id=table2>
<tr><td>
<a href=http://www.google.com>打开</a></td>
<td><table >
<td><div>谷歌</div></td>
</table></td></tr>
</table>
<table id=table1>
<tr><td>
<a href=http://www.51testing.com>打开</a></td>
<td><table >
<td><div>51Testing</div></td>
</table></td></tr>
</table>

  保存完毕后,我们打开了IEDevToolBar,可以瞧到下面的树形结构:

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

Public function open(opentext)
Dim guge
If browser("Browser").Page("Page").WebElement("html tag:=DIV","innertext:="
&opent
ext,"index:=0").Exist then ‘首先判断有这个字样的对象是否存在
set guge=browser("Browser").Page("Page").WebElement("html tag:=DIV","innertext:=
谷歌","index:=0") ‘把对象赋值给guge
newid=guge.object.parentNode.parentNode.parentNode.parentNode.parentNode.parentN
ode.parentNode.parentNode.id ‘透过上面图片可以看到第8 个节点是有id 这个值的,
这也是非常有价值的一个节点,所以我们只能通过它来做下步操作。所以这步的操作,
可以记成一个简单的口诀,寻有价值节点。
browser("Browser").Page("Page").WebElement("html
id:="
&newid).link("index:=0").click ‘和第一个例子的点击连接一样
end if
End Function
open("谷歌")

  实现了上面的点击打开操作后,在实战1 中的问题也就没有了(什么?你忘

  记第一个问题是什么,也难怪,读得入神了)。

  而在这个例子中,可能你会提出一个小小问题,是否它就真的能适用整个项

  目呢?其实像这种动态的Web,由于它会根据用户或者其他因素发生页面变动,

  所以它代码生成都是有自己的规则,也就是节点顺序一般都套用到其他地方,不

  会发生变化。

0
相关文章