以后不在此处更新日志了,欢迎测友到新窝找我:http://www.wuchuanhu.cn/

使用AutoIT测试系统登录实例七(COM错误截获)

上一篇 / 下一篇  2012-02-11 23:43:42 / 个人分类:AutoIT实战

使用AutoITweb自动化测试会经常使用到两个用于捕获异常或者错误的函数,分别为ObjEvent与_IEErrorHandlerRegister。ObjEvent可用来拦截COM调用中产生的错误或者异常,而_IEErrorHandlerRegister用来注册一个处理IE操作异常或错误的函数。
(1)ObjEvent ( "AutoIt.Error" [, "function name"] )
ObjEvent函数有两种调用方式,这是其中一种。用来处理COM调用产生的错误或者异常。前面已经提到AutoIT可以通过ObjCreate创建COM对象,如果在创建COM对象之前使用这个函数创建一个拦截函数,当创建过程中出现错误,或者COM对象在调用相关函数时出现错误的时候就会调用这个创建的拦截函数,从而达到捕获错误的效果。
Local  $oIEEvents = ObjEvent("AutoIt.Error", "_ErrFunc")
$testURL="http://www.baidu.com"
Local $OIE = ObjCreate("InternetExplorer.Application")
$OIE.Navigate($testURL)
$OIE.visible=True
  If @error Then Return
Send("!+{SPACE}+X")
$OIE.test    ;这里调用了一个不存在的函数
Sleep(4000)
$OIE.Quit()
#forceref $oIEEvents

Func _ErrFunc($oError)
 MsgBox(1,"通知","COM Error测试完成")
 ConsoleWrite("err.number is: " & @TAB & $oError.number & @CRLF & _
        "err.windescription:" & @TAB & $oError.windescription & @CRLF & _
        "err.description is: " & @TAB & $oError.description & @CRLF & _
        "err.source is: " & @TAB & $oError.source & @CRLF & _
        "err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
        "err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _
        "err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
        "err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
        "err.retcode is: " & @TAB & $oError.retcode & @CRLF & @CRLF)
EndFunc 
  
  ObjEvent 函数中第二个参数[, "function name"]不传入的时候,函数返回值为一个错误处理函数名称,但我这里没有试验成功,不知何解。
  使用IE.au3这个UDF中的_IECreate创建IE对象时,使用ObjEvent ( "AutoIt.Error" [, "function name"] )来捕获错误的时候,会提示“Cannot register internal error handler”,(即便会有这样的提示,有的时候还是能够被ObjEvent 截获到)这个时候就只能使用后面将要介绍的_IEErrorHandlerRegister函数了。至于为什么会出现这样的情况,能力有限无法探究,欢迎高人出手。这里附上帮助中的解释:
“AutoIt有捕获COM错误的能力并使用ObjEvent函数传递自定义错误处理程序. 然而因为一次只能使用一个单独的COM错误处理程序所以对于使用它的UDF作者存在一个问题. 对于将使用一个COM错误处理程序的UDF, 必须先注销用户的错误处理程序, 安装其自身的并将用户错误处理程序原地返回. 不幸的是, UDF默认无法获取用户错误处理程序的句柄.
通过此程序你可以注册自己的COM错误处理程序, 同样的方法, 在需要时, IE.au3也可轻而易举的移除和重新注册. 你可以指定你自己的自定义错误处理程序也可以使用为IE.au3开发的(默认). 使用默认的IE.au3错误处理程序, 可以得到很好的写入控制台的诊断信息和一些包含关于捕捉到的错误的信息的全局变量.
如果你即时化你自己的COM错误处理程序而不使用该程序, IE.au3将无法捕捉一些COM错误, 其结果是你可能会遇到脚本中断.”
另外,附上我的结论。首先IE.au3中的_IECreate函数中会首先使用COM创建一个IE对象,同时调用_IENavigate去打开一个URL。其次,_IENavigate这个函数中对去检查传入的参数$o_object是否为可识别的对象(调用__IEIsObjType这个方法)。在__IEIsObjType这个方法中调用了__IEInternalErrorHandlerRegister这个函数去截获COM error。而__IEInternalErrorHandlerRegister函数中则使用了ObjEvent去截获。因此如果我们在脚本前再使用一次ObjEvent的话就会出错。当把__IEIsObjType函数中__IEInternalErrorHandlerRegister注释掉,则COM error可以正常的被ObjEvent捕获。考虑到IE.au3中很多函数都是通过__IEInternalErrorHandlerRegister来捕获错误的,所以当使用IE.au3这个UDF时,不建议使用ObjEvent,而建议使用_IEErrorHandlerRegister。


TAG: aslandhu autoit Autoit AutoIT web自动化测试 autoIT

 

评分:0

我来说两句

Open Toolbar