结果QTP报错了
这是因为在同一个窗口下的四个子窗口使用的是同一个句柄,所以无法加入到Dictionary对象里去。只要对代码稍加修改就可以了:
Function EnumIE()
Set EnumIE = CreateObject("Scripting.Dictionary")
Set winShell = CreateObject("Shell.Application")
Set allWins = winShell.Windows
For each win in allWins
If instr(1,win.FullName,"iexplore.exe",vbTextCompare) Then
If Not EnumIE.Exists(win.hwnd) Then
EnumIE.Add win.hwnd,win
End If
End If
Next
End Function
调用的时候,我采用了递归调用,只要有子窗口没有关完,就会继续关。这里用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标签。