三、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,接着把代码片复制下去并保存。
<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 文件,并保存下面代码:
<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,可以瞧到下面的树形结构:

我们这里就做个点击“谷歌”字样前面的“打开”实例:
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,由于它会根据用户或者其他因素发生页面变动,
所以它代码生成都是有自己的规则,也就是节点顺序一般都套用到其他地方,不
会发生变化。