具体的winrunner的版本号为8.2,请大家帮忙

解决方案 »

  1.   

    比较早以前写的, 参考看看, 有问题可再和我联系WinRunner的Delphi插件先说明一下WinRunner中识别控件的方式打开GUI map configuration,找到obligatory项、WinRunner首先会根据这个设定来识别控件
    对于标准的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
    单元中也加入了一些额外处理