具体的winrunner的版本号为8.2,请大家帮忙
解决方案 »
- delphi中鼠标拖动的事件是什么,怎么使用?
- 如何通过编程锁住注册表
- serversocket 和 clientsocket 怎样传自定义类型数据?
- 怎样判断一个组件已经创建了?用Assign吗,怎么用呢?谢谢!
- ★怎样让PC喇叭发出“Bi”的一声?
- 请问怎么得到当前windows所用的解析度?
- 关于DELPHI中遍历一个窗体中的所有控件!
- ###急急####用ado通过ODBC连接dbf数据表编的数据库程序怎么才能让程序在别的电脑正常运行?
- Spcomm问题,急急!!
- 關于打印錯誤 Printer selected is valid! 急急急﹗
- ExpressQuantumGrid Suite v6.34版本,cxGrid导出excel文件?
- 制作系统安装程序怎样设置odbc数据源的问题
对于标准的Windows编辑控件(edit),默认设置的属性是Class和Attached_Text。
Attached_Text值取决于创建窗口时传入的窗口文本参数,而非最终显示出来的Text
(对于前者可使用GetWindowText函数,后者则需通过发送WM_GETTEXT消息)
所以通常对于Delphi中的编辑控件来说,只要WindowText不为空,并且在窗体中是唯一
的,则WinRunner可以正常识别它。
在Delphi中默认会以name做为编辑控件的text(这种情况下text是可以做为标识的),
但有些情况下我们需要去改变它,
用caption做为标识也无法确保唯一性。针对这种情况有两种解决方案,
1,自己开发的控件或第三方控件,重载CreateWindowHandle过程,指定Caption参数
为Name,再在创建窗口后还原文本为设置的文本:
procedure TSomeEditControl.CreateWindowHandle(const Params: TCreateParams);
var
AParams: TCreateParams;
begin
AParams := Params;
AParams.Caption := PChar(Name);
inherited CreateWindowHandle(AParams);
if HandleAllocated then
CallWindowProc(DefWndProc, Handle, WM_SETTEXT, 0, Integer(WindowText));
end;有些第三方控件如DevExpress的cx系列控件,它默认不会为它的编辑控件
指定name,需另外增加指定name属性处理。
(关于cx编辑控件的一点说明:cxEdit控件通常由两部分组成,一部分是Inner Edit,
Inner Edit是标准的Windows编辑控件,用于交互用户操作,响应、转接鼠标键盘事件、
它是动态创建出来的,name通常为空。另一部分是Container,用于控件外观的绘制,创建
Inner Edit等等。为了WinRunner可以正常识别cxEdit,可为Inner Edit指定它的name
为Container的名称(Owner.Name)再另外加一些区别字符)
)2,使用delphi插件
A、Mercury公司提供了专门的delphi插件。对于Delphi应用程序可以直接按Name来找控件。
安装delphi插件后、在WinRunner启动时勾选它即可
(注:delphi插件也需要license、默认不可用。WinRunner根据名称来检验它。
由于默认会有一些可用的插件如ActiveX、VB等等、为了使用没有license的delphi插件、
一种简单的办法是找到WinRunner的注册表项、找到它的Installed Components项、
把它下面的如VB项更改为其他名称、再把delphi名称改为VB即可)
PS、使用delphi插件cx系列控件依然会存在问题、解决方案参照上面的第1点B、关于WinRunner的插件机制
WinRunner运行时会从注册表项加载已安装的插件、载入注册表项记录的对应初始化文件夹
下的Script文件。
以delphi插件为例,其安装的脚本文件位于winrunner安装目录下lib\dlphinit
子文件夹、如果要加入其他新的delphi第三方控件的支持、用记事本打开script文件、
按照现有的方式调用add_dlph_obj、、、(这个函数定义在lib\dlphlib的script文件中)
PS、我测试的winrunner版本(7.6)在按插件的方式录制delphi应用程序时存在一点问题、
无法正常录制编辑控件的鼠标事件。为解决这个问题可在lib\dlphlib\script的
add_dlph_obj过程增加
set_record_method(obj, RM_AS_OBJECT);
不过对于这个改动我没有做过很详细的测试、只测试了一些简单的录制是可行的。C、Delphi插件的实现和一些说明
首先需要在delphi的工程文件中加入引用TestSrvr.pas单元
如前面所提到的、delphi插件最主要实现的是根据属性名称来取得它的属性值(如Name)、
在winrunner安装目录下的arch\dlph_ext.dll是它的另一部分实现也是方法的导出接口、
TestSrvr.pas在初始化时会创建一个隐藏的窗口、而dlph_ext.dll要做的事情是创建
一个文件内存映射、写入标识、然后根据Caption找到TestSrvr创建的窗口、发送取属性或
设置属性消息至该窗口、窗口在接收到消息后先读取标识(确认要取什么属性)、通过delphi
中的RTTI来取得属性值、再写入返回信息至映射的内存地址、来交换数据。实现方法相对
比较繁琐、另外需注意的是Grid控件、由于它的特殊性、在MercCustControl.pas
单元中也加入了一些额外处理