|
最近有人问我,有这样一个自动化的需求,该怎么实现:
把鼠标移到某个链接上,但不点击。该链接上利用css或js实现了某些效果或事件,但触发方式并不是点击,而是将鼠标移动过去(并非焦点移动过去)。
以中国雅虎首页的效果为例,以下代码实现了模拟鼠标从“站长天下”“今日焦点”“邮箱”“建站”“空间”“群组”“相册”顺次移动的过程:
Option Explicit
'定义变量
Dim oWin32 'win32对象
Dim sTitle '页面标题
Dim arrLinkText '链接文字数组
Dim sLinkText '链接文字
Dim sEventName '操作事件名称
Dim iWaitTime '两次操作时间间隔
Dim iIdentifyTimeOut '识别对象超时时间
Dim n '循环变量
Main
Sub Main
Set oWin32 = CreateObject("wscrīpt.shell")
sTitle = "中国雅虎.*"
arrLinkText = split("站长天下;今日焦点;邮箱;建站;彩票;空间;群组;相册",";",-1,1) '定义链接文字数组
sEventName = "onmouseover" '鼠标移到对象上的事件
iWaitTime = 1 '操作等待1秒
iIdentifyTimeOut = 3 '识别对象存在性超时时间设置为3秒
oWin32.Run("http://cn.yahoo.com/") '打开浏览器,进入中国雅虎首页
For n=0 to ubound(arrLinkText)
Wait iWaitTime '操作等待
sLinkText = arrLinkText(n) '从链接文字数组中取出链接文字
moveMouseOnIt '调用操作时间函数
Next
Browser("title:="&sTitle).Close '执行完毕关闭浏览器
End Sub
Function moveMouseOnIt()
'检查链接是否存在,存在则触发事件
If Browser("title:="&sTitle).page("title:="&sTitle).link("innertext:="&sLinkText,"index:=0").Exist(iIdentifyTimeOut) Then
Browser("title:="&sTitle).page("title:="&sTitle).link("innertext:="&sLinkText,"index:=0").FireEvent sEventName
moveMouseOnIt = True
Reporter.ReportEvent micPass,sEventName,"Trigger the event """&sEventName&""" successfully."
Else
moveMouseOnIt = False
Reporter.ReportEvent micFail,sEventName,"Fail to trigger the event """&sEventName&""" because of the absence of the link."
End If
End Function
运行后会发现有一步执行抛出了Fail,检查是一个名为“彩票”的链接不存在导致;原来中国雅虎不提供彩票服务啊~^_^
所实现代码中最关键部分是FireEvent方法,针对Link对象,该方法除了onmouseover时间, 还有onchange, onclick, ondblclick, onblur, onfocus, onmousedown, onmouseup, onmouseout, onsubmit, onreset, onpropertychange事件可以使用,涵盖了目前我们所能做的全部操作。
至于其它对象的FireEvent方法,请参照QTP帮助文档中的FireEvent Method定义。
灵活运行FireEvent方法,可以很容易操纵页面对象触发各种事件,对自动化功能实现的程度也很有帮助。 |
|