同步点
当被测的应用程序需要一定的时间去反映一个操作的时候,QTP会在应用程序还没准备好的情况下,就去执行下一个操作,在这总情况下,QTP可能会抛出一个异常,比如,在步骤1的时候,QTP从一个列表里边选择一个值,再进行某些操作之后会导致一个按钮会激活,QTP在按钮被激活之前,去尝试着点击这个按钮,此时QTP会抛出一个“Object is disabled”
的异常
同步点被用来在测试时候执行某些操作之前插入一个暂停时间或者等待时间,这些同步点帮助避免由于被测应用程序的高响应时间而引起的不必要的错误,QTP提供三种类型的同步点
第一种方法:使用Sync方法
'选择 Option1
Browser("..").Page("..").Weblist("List").Select "Option1"
'等待页面的重新加载
Browser("..").Sync
'现在点击Next按钮
Browser("..").Page("..").WebButton("Next").Click
但是有些时候Sync方法自身也会抛出一个异常,这种情况下可以使用On error resume next句法,使用如下:
'禁止所有弹出式错误
On Error Resume Next
'同步浏览器和页面对象
Browser("..").Sync
Browser("..").Page("..").Sync
'允许弹出式错误
On error go to0
第二种方法-使用Wait语句
'选择 Option1
Browser("..").Page("..").weblist("List").Select "Option1"
'等待2秒
Wait 2
'点击Next按钮
Browser("..").page("..").WebButton("Next").Click
第三种方法-WaitProperty 方法
'选择 Option1
Browser("..").Page("..").Weblist("List").Select "Option1"
'等待最长5秒,直到按钮被激活,取两者数值小者为准
Browser("..").Page("..").WebButton("Next").WaitProperty("Enabled",True,5000)
'点击Next按钮
Browser("..").Page("..").WebButton("Next").Click
如果在开始操作之前,对象不存在,我们还可以使用Exist方法
'选择 Option1
Browser("..").Page("..").Weblist("List").Select "Option1"
'等待最长5秒,直到出现
bButton= Br`.Exist(5)
' 检查按钮是否存在
If bButton Then
'点击next按钮
Browser("..").Page("..").WebButton("Next").Click
Else
'处理此错误
End if、
检查对象的存在
考虑如下登录例子
'设置用户名和密码
Browser().Page().WebEdit("uid").set "username"
Browser().Page().WebEdit("password").Set "password"
'点击登录按钮
Browser().Page().WeBbutton("login").Click
'检查登录失败的文字是否存在
If Browser().Page().WebElement("innerText :=Login failed").Exist(5)Then
Report.ReportEvent micFail,"Login","Login failed"
Else
Report.ReportEvent micPass,"Login","Login successful"
End If
使用如上的代码,如果用户输入了通常情况下的正确的用户名和密码,用户会浪费5秒的时间去等待一个不会出现的错误信息,使用如下的代码能减少不必要的浪费(使用了两种条件,一旦其中的一条件成立就往下进行)
Browser("百度一下,你就知道").Page("百度一下,你就知道").Frame("Frame").WebEdit("username").Set "a"
Browser("百度一下,你就知道").Page("百度一下,你就知道").Frame("Frame").WebEdit("password").SetSecure "a"
Browser("百度一下,你就知道").Page("百度一下,你就知道").Frame("Frame").WebButton("登录").Click
bLoginPass=Browser("百度一下,你就知道").Page("百度一下,你就知道").WebElement("innerText:=a").Exist(0)
bLoginFail=Browser("百度一下,你就知道").Page("百度一下,你就知道").WebElement("innerText:=登录").Exist(0)
i=0
While not bLoginPass or not bLoginFail and i<=5
wait 1
i=i+1
bLoginPass=Browser("百度一下,你就知道").Page("百度一下,你就知道").WebElement("innerText:=imcora").Exist(0)
bLoginFail=Browser("百度一下,你就知道").Page("百度一下,你就知道").WebElement("innerText:=登录").Exist(0)
Wend
If bLoginFail Then
reporter.ReportEvent micFail, "login","login Failed"
Elseif bLoginPass then
reporter.ReportEvent micPass ,"login","login Successful"
else
reporter.ReportEvent micFail ,"login","fail to determine login status"
End If
上面的代码看起来可能有点长,但是把这个代码放在一个函数里边,并且去重复利用它,那么会减少我们在执行过程中所浪费的时间。
Browser和Page 同步点
没有文献记载Browser sync点和Page sync点的区别,尽管他们两个看起来好像所等待的不同,Page同步点等待页面的加载,在页面里没有frames的情况下才可以工作。Browser
同步点等待页面和网页内所有的的frames的加载。
Events
可能有些时候,同步点也不能解决问题,这种情况的出现有可能是Events没有被触发,我们来看下下面的HTMl代码
<HTML>
<BODY>
<INPUT name=txtName type=text size=10 οnkeyup="cmdclick.disabled=false">
<INPUT name=cmdclick type=button DISABLED value="Click me">
</BODY>
</HTML>
此网页是这样的:当用户在输入框中按下任意的键,会把Click me 按钮激活,我们把我们在输入框中按键的操作录制录制下来
'设置WebEdit的值为Test
Browser("..").Page("..").WebEdit("txtName").Set "Test"
但是当重新运行此代码的时候,发现按钮并没有被激活,如下图:
当我们在QTP中运行如上的代码的时候,我们发现,文本被设置了,但是按钮并没有被激活,这种情况的出现是因为QTP有有个事件配置,它会使QTP有选择的录制事件,看看如上的HTML源代码,我们发现onkeyup事件需要触发,才能激活button,因此,我们可以用下面的QTP代码去引起此事件的发生。
'设置WebEdit的值为Test
Browser("..").Page("..").WebEdit("..").Set "test"
'触发onkeyup事件
Browser("..").Page("..").WebEdit("..").Set "test".FireEvent "onkeyup"
如果我们不知道编辑框中定义的是哪种事件,我们可以触发所有的事件
'触发所有的事件
Browser("Browser").Page("Page").WebEdit("txtName").FireEvent "onkeydown"
Browser("Browser").Page("Page").WebEdit("txtName").FireEvent "onkeyup"
Browser("Browser").Page("Page").WebEdit("txtName").FireEvent "onkeypress"
当我们使用描述性编程的时候,我们经常需要自己添加触发事件,有三种可能的配置(Low,Medium&High).要改变此配置,选择Tools-Web Event Recording Configuration…,点击 Custom Settings...按钮,选择我们需要修改的测试对象,如图:15-2
注意在最高配置下,只支持onkeydown,但是,我们的例子中的onkeyup的事件必须触发,但是QTP不支持录制此事件,QTP支持如下的,其他的必须靠手动触发:
onchange,onblur,onfocus,onmousedown,onmouseup,onmouseover,onmouseout,onsubmit,onreset 和 onpropertychange
Replay选项
QTP默认的设置是不支持web对象使用浏览器事件,那也是我们为什么在上面的代码中显式的使用FireEvent,但是我们也可以配置QTP,使它回放事件的时候使用鼠标。要修改回放类型,请选择Tools-Options…-Web(tab)-Advanced…(button)并且选择Replay Type的Mouse单选按钮,如下:
或者我可以在运行时使用如下的语句去改变设置:
Setting.WebPackage("ReplayType")=2
Browser("..").Page("..").WebEdit("..").Set "Test"