Ⅰ.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对象引发的,因此事件句柄被定义为这些对象的属性。例如,要定义在...

深入了解Windows句柄到底是什么

总是有新入门的Windows程序员问我Windows的句柄到底是什么,我说你把它看做一种类似指针的标识就行了,但是显然这一答案不能让他们满意,然后我说去问问度娘吧,他们说不行网上的说法太多还难以理解。...

计算机网络-IP数据报格式

经典格局图 版本:占4位字,现今主流的两种版本为IPv4与IPv6; 首部长度:占4位字,记录IP数据报文首部的大小,在数据报首部中一个32字等于4字节,通常IP数据报的首部并不需要增加额外的参数...

WinPcap基础知识(第五课:过滤信息)

WinPcap提供的最强大的特性之一就是过滤引擎。它是被集成到了winpcap的捕获机制中的,提供了一种非常高效的方法来获取部分网络数据。被用来过滤数据包的函数是 pcap_compile() 和 p...
  • qsycn
  • qsycn
  • 2009年08月18日 13:17
  • 2208

{{JS}}事件句柄

1.作为HTML属性的事件句柄 事件句柄被设置为js代码(在原始事件模型中),作为HTML的属性值。 2.事件句柄的返回值 在多数情况下,事件句柄(无论是HTML属性设置的,还是JS属性设置...

c# 线程同步: 详解lock,monitor,同步事件和等待句柄以及mutex

最近由于在准备Collection对象培训的PPT,因为涉及到SyncRoot的属性的讲解,所以对怎样在多线程应用程序中同步资源访问做了个总结:对于引用类型和非线程安全的资源的同步处理,有四种相关处理...

多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(下)

前两篇简单介绍了线程同步lock,Monitor,同步事件EventWaitHandler,互斥体Mutex的基本用法,在此基础上,我们对它们用法进行比较,并给出什么时候需要锁什么时候不需要的几点建议...
  • iamdll
  • iamdll
  • 2011年05月23日 13:48
  • 372

JavaScript中为事件句柄绑定监听函数

在JavaScript中为Dom元素绑定事件监听函数是一件非常常见的事情,但这里也有许多的Bug。各种浏览器对于事件绑定都提供了很多方法,但可靠的只有3中: 1、传统的绑定方法: elem...

C#多线程:深入了解线程同步lock,Monitor,Mutex,同步事件和等待句柄(中)

本篇继续介绍WaitHandler类及其子类 Mutex,ManualResetEvent,AutoResetEvent的用法。.NET中线程同步的方式多的让人看了眼花缭乱,究竟该怎么去理解呢?其实,...
  • ruijc
  • ruijc
  • 2013年03月14日 19:50
  • 491
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Ⅰ.5 如何使用事件句柄
举报原因:
原因补充:

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