调用的时候,我采用了递归调用,只要有子窗口没有关完,就会继续关。这里用do while的话会多执行一次EnumIE这个函数,大家可以考虑换一种循环方式,我就不多说了。
Set allIE = EnumIE()
Do while allIE.Count>0
For each oIE in allIE.Items
oIE.quit
Next
Set allIE = EnumIE()
Loop
当然了QTP有自己的方法会很快关闭所有的IE窗口:
SystemUtil.CloseProcessByName(“iexplore.exe”)
下面介绍下利用DOM操作测试对象的几种常用方法,还是用百度主页做例子,首先将百度主页加进对象库。
IE8里会自带F12开发工具,可以方便你看你需要的DOM属性
Set oDOM = Browser("百度一下,你就知道").Page("百度一下,你就知道").Object
需要注意的是,此处的Object属性目前只支持IE,而对其他的浏览器目前还没有加入支持。
1. 通过getElementById方法获取定位对象,对其进行操作:
oDOM.getElementById("kw").value = "态度决定测试"
oDOM.getElementById("su").click
2. 通过getElementsByName方法获取定位对象,对其进行操作:
方法一:
Set oEdits = oDOM.getElementsByName("wd")
For each oEdit in oEdits
oEdit.value = "态度决定测试"
Next
oDOM.getElementById("su").click
方法二:
Set oEdits = oDOM.getElementsByName("wd")
oEdits(0).value = "态度决定测试"
oDOM.getElementById("su").click
通过方法名里Element后面的复数形式也大概可以知道这个方法返回的是一个集合,所以需要遍历集合里的对象获取这个对象。
3. 通过getElementsByTagName方法获取定位对象,对其进行操作:
Set oEdits = oDOM.getElementsByTagName("INPUT")
For each oEdit in oEdits
If oEdit.type = "text" Then
oEdit.value = "态度决定测试"
End If
Next
oDOM.getElementById("su").click
用这个方法遍历之后通常要加判断,因为一个页面里可能有很多INPUT标签。
4. 利用FORM来获取对象元素,对其进行操作:
oDOM.f.wd.value = "态度决定测试"
oDOM.f.su.click
5. 访问页面里的Script脚本变量
通过DOM可以直接访问到页面中的JS或者VBS中的变量,还是以百度为例,我们用F12进行探测,可以看到k这个变量: k = d.f.wd
oDOM.parentWindow.k.value = "态度决定测试"
oDOM.getElementById("su").click
从代码里可以看出,我们只需要通过parentWindow去访问web页面中的变量即可。
下面我们来说说利用DOM完成QTP无法完成的任务:
还是百度,假设我们需要验证一些属性,此时我们可以使用CurrentStyle来验证。
Set oDOM = Browser("百度一下,你就知道").Page("百度一下,你就知道").Object
Set p = oDOM.f.CurrentStyle
msgbox p.color
我们可以验证表单的颜色。
利用DOM还可以提升我们的脚本性能,举个例子,自己构建一个含有100个文本框的HTML页面,每个文本框的name属性都是由text_开头,之后由1到100递增。首先将Page对象加到对象库里去。
效果图如下:
接下来我们就可以引入保留对象Services的Transaction属性来验证性能是否有提高。
QTP描述性编程:
Services.StartTransaction "test"
For i =1 to 100
Browser("Browser").Page("Page").webEdit("name:=text_"+cstr(i)).Set "hello world"
Next
Services.EndTransaction "test"
运行后结果大概用了11.5秒时间填写完一百个webEdit对象。
DOM操作脚本:
Set oDOM= Browser("Browser").Page("Page").Object
Services.StartTransaction "test"
For i =1 to 100
oDOM.getElementsByName("text_"+cstr(i))(0).value = "hello world"
Next
Services.EndTransaction "test"
结果只用了1.8秒时间,效率惊人。
如果文本框更多的话,那么DOM操作对象的优势将进一步显现出来。这对性能的提升会有巨大的帮助。