Ⅰ.5 如何使用事件句柄

原创 2015年11月20日 16:05:07

在Squish测试脚本中有可能要对AUT内部发生的事件做出反应。这可能是有用的,例如,当对话框意外出现时 比如一个错误消息提示,提供一个测试脚本来响应它。可以通过注册一个事件句柄函数来实现该功能,当一个指定的对象、一个指定类型的对象或者任何对象的事件发生时,调用句柄。

事件句柄函数通过调用 installEventHandler 函数来注册。对于一个应用于所有AUT对象的句柄,即全局事件句柄,只有事件类型和句柄函数被当做参数传递。对于一个应用于某一个特别的对象或者一个特殊类型的所有对象,该对象或者类型被当作第一个参数传递,接下来的参数是事件类型和句柄函数。除了标准的工具包事件(例如 Qt的QKeyEvent),也支持一些特定的Squish和工具包泛型事件如MessageBoxOpened 和 Crash。

特定的Web版的Squish

对于支持Web的Squish,始终不带参数的调用事件句柄函数,而不是传递对象作为参数(通常是事件发出的对象)。仍是有可能访问Web版的Squish事件句柄内部的对象的,但是我们必须获取指向该对象的引用,例如,使用waitForObject函数。

下面的几个小部分中我们将会看到上面三种情况下的事件句柄的示例。

Ⅰ.5.1 全局事件句柄

当弹出一个消息框时,发出MessageBoxOpened事件。(事实上, MessageBoxOpened 事件只应用于Java版的Squish,Qt版的Squish以及Windows版本的Squish;然而,对于其他的工具包有一些相似的事件。)像这种事件的所有测试脚本将会忽略事件,但是我们可以注册一个事件句柄函数,无论何时事件发生,都会调用该句柄。

将一个这样的全局事件与一个特定对象或者类型联合在一起并没有多大的意义,因此通常由一个全局事件句柄来处理。

下面我们看一个为message box创建和安装的句柄。

def handleMessgeBox(messageBox):
    test.log("MessageBox opened:'%s' - '%s'" %(messageBox.windowText, messageBox.text))
    messageBox.close()

def main():
    startApplication("myapp")
    installEventHandler("MessageBoxOpened","handleMessageBox")
注意到,如果我们正在使用一个类似Web版的Squish事件(如,ModalDialogOpened),对话框将不会作为参数传递,因为Web版的Squish事件句柄不接收参数。

另一个特别的事件是Crash。当我们想安装一个AUT 崩溃时调用的事件句柄是有用的——例如,清理或者重启AUT。(所有版本的的Squish都支持Crash事件,除了Web版的Squish)。下面是一个示例:

def crashhandler():
    test.log("Deleting lock files after AUT crash")
    deletelockFiles()

def main():
    startApplication("myapp")
    installEventHandler("Crash","crashHandler")
    ...
第三种特殊的事件是Timeout事件。无论何时AUT在五分钟之内响应一些Squish命令失败,都会触发这些事件。如果应用程序卡在了死循环中或者有些其他的原因导致应用程序不能响应,这个事件是有可能发生的。可以为该事件安装一个事件句柄,这样你的测试就可以轻松的处理这种情况了。超时时间可以通过使用squishrunner 或者Squishserver的 serResponseTimeout选项或者使用Squish IDE设置。

 

Ⅰ.5.2 指定类型的所有对象的事件句柄

可以为指定类型的所有对象设置一个响应特定类型事件的事件句柄.例如,使用Qt版的Squish,我们可以安装一个事件句柄,当QMouseEvent 在QCheckBox上发生时总是调用此事件句柄。这就意味着每当事件发生时,就是当点击AUT的checkboxes时,调用事件句柄。下面是一个示例:

 

def handleCheckBox(obj):
    test.log("QCheckBox '%s' clicked" % objectName(obj))

def main():
    startApplication("myapp")
    installEventHandler("QCheckBox","QMouseEvent","handleCheckBox")                                                                           ...                      

可以使用其它的Squish支持的工具包为相似事件创建相似的事件句柄,但对于Web版的Squish会重新调用,如果我们想与一个我们首先要获取引用的对象交互的话(使用waitForObject 函数),没有参数传给该事件句柄。

Ⅰ.5.3 特定对象的事件句柄

第三种Squish支持的事件句柄针对的是发生在特定对象的事件。例如,再一次使用Qt toolkit,我们可以安装一个事件句柄,每当line editor接收到一个QKeyEvent事件时调用该句柄,所以每次测试键入一些文本到line editor中时都将会调用事件句柄,下面是一个例子:

def handleDescriptionLineEdit(obj):
    lineEdit = cast(obj, QLineEdit)
    test.log("QLineEdit ’%s’ text changed: %s" %( objectName(obj),lineEdit.text))                                                                                                                                                                   def main():
    startApplication("myapp")
    lineEdit = waitForObject(":Description:_QLineEdit")
    installEventHandler(lineEdit, "QKeyEvent",
        "handleDescriptionLineEdit")
    ...



传给obj的对象只是一个泛型Squish对象;我们必须使用cast 函数将它转换成正确的类型,这样能访问对象的方法和属性。

 

 


版权声明:本文为博主原创文章,未经博主允许不得转载。

HTML中的事件句柄

很多动态性的程序都定义了事件句柄,当某个事件发生时,Web浏览器会自动调用相应的事件句柄。由于客户端JavaScript的事件是由HTML对象引发的,因此事件句柄被定义为这些对象的属性。例如,要定义在...
  • confirmAname
  • confirmAname
  • 2013年06月06日 22:57
  • 1810

Spring 4.2框架中注释驱动的事件监听器详解

Spring 4.2框架中注释驱动的事件监听器详解 作者:chszs,版权所有,未经同意,不得转载。博主主页:http://blog.csdn.net/chszs 事件交互已经成为很多应用...
  • oLeiChang
  • oLeiChang
  • 2016年02月01日 16:30
  • 822

探讨Windows编程中句柄的本质

一、书上定义:   >(Microsoft Press,by Richard Wilton)   在Windows环境中,句柄是用来标识项目的,这些项目包括:模块(module)、任务(...
  • zxxSsdsd
  • zxxSsdsd
  • 2013年08月06日 16:41
  • 803

C++句柄类详解

昨天由于时间的关系剩下一个小尾巴,今天忙里偷闲来把这个洞洞填上昨天学习了“面向对象编程”的部分,详细讨论了复制控制与类作用域需要注意的问题。这里有一个新的问题,如何实现一个类似“购物车”的数据结构呢?...
  • u012398613
  • u012398613
  • 2015年12月11日 09:38
  • 757

线程、线程句柄、线程ID的关系

什么是句柄:     句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时...
  • qazwsx185313301
  • qazwsx185313301
  • 2014年03月30日 17:38
  • 996

HTML 5 服务器发送事件

对于一般的 Web 应用开发,大多数开发人员并不陌生。在 Web 应用中,浏览器和服务器之间使用的是请求 / 响应的交互模式。浏览器发出请求,服务器根据收到的请求来生成相应的响应。浏览器再对收到的响应...
  • zhuchunyan_aijia
  • zhuchunyan_aijia
  • 2017年01月06日 15:23
  • 536

Linux中句柄是什么?

句柄:句柄是一个32位的整数,实际上是windows在内存中维护的一个对象(窗口等)内存物理地址列表的整数索引 指针:指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据 ...
  • lufeisan
  • lufeisan
  • 2016年11月14日 10:26
  • 3802

qt中的句柄类,实体类

1.应用程序封装成so动态库时,需要提供头文件,此时为了把私有数据封装起来,就需要把私有数据封装成private的类,把它放在cpp文件而非h文件中, 这样就把私有数据封装起来不给用户看了。 2....
  • u010856776
  • u010856776
  • 2013年05月30日 14:38
  • 1686

MATLAB函数句柄(@),feval与内连函数(inline)

转载地址:http://www.cnblogs.com/begtostudy/archive/2012/06/27/2565920.html MATLAB函数句柄 函数句柄(Functio...
  • hzhaly
  • hzhaly
  • 2014年01月07日 16:22
  • 3583

委托和事件的区别

原文地址:http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx  委托 和 事件在 .N...
  • j6915819
  • j6915819
  • 2016年05月13日 11:17
  • 1400
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Ⅰ.5 如何使用事件句柄
举报原因:
原因补充:

(最多只允许输入30个字)