51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 5031|回复: 8
打印 上一主题 下一主题

wr 的识别机制,以及扩充wr可用的控件

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2008-2-19 12:17:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在玩WinRunner的时候,发现了这样的问题:
1 什么控件被WinRunner认为是可以识别的?
在WinRunner里面提到的toolbar,button,edit,icon,list,menu,scroll,table,object, window, general等这些控件是可以被识别的,如果要进行扩充的话,比如自定义一个控件,那么怎么能保证被WinRunner识别,为什么有时候自定义的按钮都不能被识别?而在一些应用程序里面又可以被识别?那么WinRunner里面可以识别的控件都满足什么条件?
2 wr是怎么样识别这些控件的,它的识别机制是什么?
识别控件的要求是什么?wr能识别什么样的控件,他的识别机制是什么,或者依据是什么?
WinRunner控件可以识别的控件里面,控件的响应函数与与控件是怎么建立起联系的?它是怎么样捕获控件的消息,以及激发响应函数的?跟windows控件一样么?那么它的消息处理部分在哪里?是不是要引入什么消息钩子之类的,通过消息钩子来拦截windows消息。
3 在winRunner的wr_gen里面,我都看到了toolbar,button,edit,icon,list,menu,scroll,table,object, window, general的响应函数的外部引用,但是我不知道它对应的实现在哪里,我都用查看器找过arch目录下面的dll了,都没有发现响应的实现函数。那样的话,是不是也转接到windows里面去处理了?利用windows处理控件的方法?
好了,先谢谢大家,欢迎一起讨论,学习,请多多指教

[ 本帖最后由 jolley 于 2008-2-21 10:15 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2008-2-19 21:51:45 | 只看该作者
原帖由 jolley 于 2008-2-19 12:17 发表
我在玩WinRunner的时候,发现了这样的问题:
1 什么控件被WinRunner认为是可以识别的?
在WinRunner里面提到的toolbar,button,edit,icon,list,menu,scroll,table,object, window, general等这些控件是可以被识别的 ...

我对这方面了解的也不是很多,就简单说下吧,如果哪位前辈发现有什么不对的还请指出.
1.识别机制
Winrunner本身有一套自己的标准对象库,比如在物理描述中的class属性值就是标准对象,当在进行录制或对对象进行学习的时候Winrunner首先得到被测对象的属性,然后将这些属性与标准对象的属性进行对比,如果匹配就将被测对像转换成标准对象,否则转换成object对象,也就是非标准对象。
2.回放机制
讲最简单的,也就是根据句柄操作对象(一般写插件我们只要用这种方式就可以了).写一个录制函数的逆函数,也就是回放函数,给它传递一个句柄,然后调用DLL中对应的函数,对指定的对象发消息或做其他什么操作,以实现和录制时一样的操作.
回复 支持 反对

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2008-2-20 10:16:43 | 只看该作者
原帖由 lantianwei 于 2008-2-19 21:51 发表
识别机制
Winrunner本身有一套自己的标准对象库,比如在物理描述中的class属性值就是标准对象,当在进行录制或对对象进行学习的时候Winrunner首先得到被测对象的属性,然后将这些属性与标准对象的属性进行对比,如果匹配就将被测对像转换成标准对象,否则转换成object对象,也就是非标准对象。
2.回放机制
讲最简单的,也就是根据句柄操作对象(一般写插件我们只要用这种方式就可以了).写一个录制函数的逆函数,也就是回放函数,给它传递一个句柄,然后调用DLL中对应的函数,对指定的对象发消息或做其他什么操作,以实现和录制时一样的操作.

谢谢蓝天伟前辈,给这些好的解释。
我对你说的两个机制,在游戏里面想到了一些问题,希望你帮忙解答一下,以确保我完全理解你的意思:
1 如果要扩充WinRunner的标准对象库,那么是不是注意知会WinRunner被扩展对象的属性就可以了,这些属性就是这些扩展对象要提供的接口。匹配成功与否的标准就是被检测对象的属性呀?这些属性应该告诉WinRunner呢? 在对应的DLL里面给出,还是怎么样?我看到了以前wr_gen里面的一些控件属性,他们都是在那里声明的,但是我不知道自定义的函数应该在哪里,能够帮我看一下
[/quote]
在winRunner的wr_gen里面,我都看到了toolbar,button,edit,icon,list,menu,scroll,table,object, window, general的响应函数的外部引用,但是我不知道它对应的实现在哪里,我都用查看器找过arch目录下面的dll了,都没有发现响应的实现函数。那样的话,是不是也转接到windows里面去处理了?利用windows处理控件的方法?
[quote]
再次感谢蓝哥。
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2008-2-20 10:36:30 | 只看该作者
原帖由 jolley 于 2008-2-20 10:16 发表

谢谢蓝天伟前辈,给这些好的解释。
我对你说的两个机制,在游戏里面想到了一些问题,希望你帮忙解答一下,以确保我完全理解你的意思:
1 如果要扩充WinRunner的标准对象库,那么是不是注意知会WinRunner被扩展对 ...

1.扩充对象库的属性是在DLL文件里实现的,你可以看下VB的插件实现,它加了一个VBNANE的属性.但这个扩充比较麻烦,比如你开发VB插件你就必须对VB的非常熟悉,而不是用一个C本身就可以完成了(一般可以不用,因为不用它也同样可以完成任务,比如下面2的情况).
2.关于WR本身就可以识别到的子对象,可以直接通过该对象的句柄来操作对象,也就是一般最简单的插件开发.
3.对于WR本身不可以识别到子对象,但要操作,按fengxueren前辈说的是提供接口,但我没实现过,不过这是一个好消息,因为如果这个问题可以解决,那么从技术上讲没有操作不到的对象了.那自动化做起来就比较开心
回复 支持 反对

使用道具 举报

该用户从未签到

5#
 楼主| 发表于 2008-2-20 11:03:14 | 只看该作者
好的,我等下去看看现在已经有的插件是怎么实现的,现在看来,关键是怎么让WinRunner知道扩展对象的属性和接口的问题了,我刚才小结了一下,我是这么想的:
假如现在扩展一个标准控件,这个标准控件里面有控件属性,控件响应函数,控件消息处理机制。
属性 --- 游戏里面对应的控件属性。
消息处理函数 ---- 游戏里面特定控件的处理函数, 凭借DLL。
消息映射以及自定义 --- 游戏里面特定控件的特定消息,借助消息钩子。
并且应该将这些扩展的控件所包含的内容都告诉WinRunner.
我现在也将重心放在接口上面了,只不过fengxueren前辈一直都没有上线,不然可以当面讨教。呵呵。 ,再次谢谢蓝哥。
回复 支持 反对

使用道具 举报

该用户从未签到

6#
发表于 2008-2-20 14:26:49 | 只看该作者
啊哦,有什么成果要记得SHARE一下哦.
回复 支持 反对

使用道具 举报

该用户从未签到

7#
 楼主| 发表于 2008-2-21 10:29:20 | 只看该作者
大家好,我重新编辑了原始帖,上面增加了对我现在想自动化产品的截图,是个游戏来的,2D网络游戏,大话战国。,并且我已经试过了用Microsoft Active Accessibility,简称MSAA技术来识别(多亏shrinerain 兄的帮忙),以及多谢fengxueren兄的解释和建议的工具spy++.对游戏里面的控件增加说明的是:游戏控件都是自定义的,用win32程序编制的,并且有自己的鼠标响应和键盘操作处理。游戏里面很少用到MS能识别的控件,所以这也就是前面两位大哥提供的工具达不到效果的原因,这两个工具都能识别MS的标准控件,而对用户自定义的控件来说,一般都是不能识别的,这就是问题所在,当然落,就现在来说,问题还是没有得到真正的解决,两个工具都不能识别自定义控件,这跟原来的winRunner情形一致,如果要达到目的,又回到了要扩展对象的问题,还没有切中要害。呵呵
不过谢谢大家这么多的支持,继续接受各位前辈和高手的建议。

[ 本帖最后由 jolley 于 2008-2-21 11:05 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

8#
发表于 2008-2-21 11:59:48 | 只看该作者
lantianwei 斑竹说的是可行的啊,你没有尝试吧

用WR捕获窗体句柄,然后通过WIN API来模拟点击,

不过要想彻底点的话估计要参考一下我个人空间上转载的屏幕取词那遍文章,上面涉及到相关的技术.也就是进入到指定的进程空间并替换调用的函数.
回复 支持 反对

使用道具 举报

该用户从未签到

9#
 楼主| 发表于 2008-2-22 10:21:05 | 只看该作者
是可行的,但是问题是,仅仅是从DLL上面去分析还是有点问题的。
WR目前能识别的基本上不是我想要的东西,因为是windows方面的机制,但是在游戏里面,一般程序是用Dx编制的,不同于普通的win32程序,DX有自己独立于WINDOW消息处理的机制,现在要做的事情很多,主要是HOOK dx,让stupid的DX知道我游戏里面所要定制的控件,为了这个需要定义自动化测试接口,并且要自定义一套消息,使得自动化测试能够通过消息,内存文件映射来与被测试程序通信。
对于自动化测试接口, 在Windows系统上, 一般做法就是自定义一套消息. 自动化测试程序, 通过消息, 以及内存文件映射等机制与被测程序通信.

从函数层面来说, 被测试程序至少要提供一个"object GetValue的方法, 通过这个方法, 获取控件相应信息.
还要可以拦截事件, 比如你可以向被测程序的某个事件加一个回调函数, 这样就某个事件(比如按钮按下), 你就能得到通知.
另外, 如果不是纯粹模拟鼠标键盘, 还必须考虑bool SetValue等方法, 通过这个, 你可以直接设置控件属性.

从底层来说, 就是自定义windows消息, 怎么处理, 怎么进程通信, 这个可以有很多做法.
(shrinerain 前辈提供的。)
现在有个想法是,弄个简单的dx程序,但是要保证里面用到游戏里面的若干控件,针对这个demo做一些自动测试接口的设定,并且自定义消息机制,进程通信机制等等,若干问题。进行测试,现在还不知道具体会怎么样,但是现在基本的框架是出来了。
思路清晰了许多,但是现在就是要看技术层面的了。
谢谢大家,继续给一些cool的建议吧。呵呵,我也分享给大家这么多了。呵呵。
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-25 04:05 , Processed in 0.073449 second(s), 29 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表