sesamehch 发表于 2004-11-16 18:44:18

大虾请出手啦!关于Robot测试Delphi程序中的冲突问题

问题描述如下:
    在使用Rational Test Enablers生成的接口单元SQASrvr.pas(针对Delphi的控件进行了功能扩展)进行自动化测试的时候,如果程序A(一般为Exe程序)和程序B(例如:Ocx等)同时都使用了接口单元SQASrvr.pas.
    那A和B就会有冲突,Robot识别了A里的控件就识别不了B里的控件,反之亦然.
    也就是说,Robot在录制和回放的时候就只能对第一个控制的程序有效,对其他程序无效,例如:程序A启动后,就用Robot录制Exe程序A,录制过程中调用Ocx程序B,虽然B也包含了接口单元,但Robot不能正确的认识B,与此相反,在录制前先把程序B调用出来,再进行录制,录制中关闭B录制A,也不能正确录制程序A,回放过程也一样的会有这种情况.
    有谁碰到过这种问题,或知道原因吗?谢谢
在线等待,急呀:|

[ Last edited by sesamehch on 2004-11-16 at 18:54 ]

pcl2004_27 发表于 2004-11-16 22:04:46

我觉得你的问题在于对不同的对象识别用了同一个识别方法!

robot针对delphi程序识别用到delphi enabler,而针对ocx(ocx是activex控件),robot针对ocx控件识别使用的是Rational ActiveX Test Control控件。

明白了么!

这里可能有个问题,你说的a和b有冲突!
你是否对delphi enabler中的单元进行了扩展(接口,识别你的控件属性!)!?

sesamehch 发表于 2004-11-17 08:48:57

谢谢斑竹的热心解答!我还想问一下:
robot针对ocx控件识别使用的是Rational ActiveX Test Control控件。
那Rational ActiveX Test Control控件该怎么用?
我在安装Rational Test Enablers时也看到了Rational ActiveX Test Contro安装选项,安装了它好像没什么变化,不懂用。请斑竹再说明一下要怎样使用它。
另外,我是对delphi enabler中的单元进行了扩展,主要是扩展各种控件的属性接口,从而让Robot可以识别我所扩展的属性。

sesamehch 发表于 2004-11-18 15:06:57

各位大虾快来帮忙啊!!

斑竹也不知道跑哪儿去了。

各位大虾快来帮忙看看啊!

我自己先顶一下。

pcl2004_27 发表于 2004-11-18 16:13:03

关于第一个问题那Rational ActiveX Test Control控件该怎么用?
我有一篇关于Rational ActiveX Test Control的识别的文章

blog.csdn.net/piaocl/archive/2004/05/17/19560.aspx
你可以参考一下!

sesamehch 发表于 2004-11-18 16:36:21

非常感谢斑竹!

    那篇文章我已经看过了,图片显示不出来,还有它说的是在VC中的应用,在Delphi中应该如何用啊?

    另外文章说“添加Rational ActiveX Test Control”是否就是添加SQAOTE32.ocx控件到程序中啊?我也试了把SQAOTE32.ocx添加到我的程序中,拖到窗体上也出现了一个robot的图标控件,但好像没什么作用,程序依旧会有我之前说的冲突。

    请斑竹能否说的再详细点关于Rational ActiveX Test Control是怎样在Delphi中应用的。
    谢谢!

pcl2004_27 发表于 2004-11-18 16:57:42

你添加之后要先把带有activex控件的程序中的sqasvr.pas去掉!

pcl2004_27 发表于 2004-11-18 17:02:43

delphi程序中如果重复引用某个单元也会出现问题的!

delphi enabler的核心是sqasvr.pas,它是利用com原理实现的。你可以在调试的过程中发现,这个单元先初始化。初始化的过程就是把你们的程序中所有用到的控件先注册一遍,运行的过程中你调用了另一个程序,robot已经和delphi建立了通道,那么厚调用的这个程序界面中的控件相当于没有注册!所以robot识别不了!

sesamehch 发表于 2004-11-18 20:24:44

非常感谢斑竹!

根据你说的情况试用了很多种方法,还是没能成功.
能否麻烦斑主写一个简单的例子自己试试看。

我们要测试的程序情况和要求如下(举一个简单例子):
在一个主程序(普通的Exe程序)中调用各个子模块,每个模块是一个单独的OCX文件。

不仅要正确测试Exe程序,也要能正确的测试OCX程序。

在Robot里简单的调用语句如下:
Dim s as string
Window SetContext, "CurrentWindow", ""
SQAGetProperty "Name=Button1", "Caption", s

另外OCX程序的建立是在Delphi环境里使用:
新建->ActiveX页->ActiveForm项 生成的,
并通过定义的一个过程(如Start)来调用显示出生成的一新窗体

在主程序(EXE)端,可以使用一个按钮的点击来调用这个控件的Start过程显示出OCX里的窗体,
调用的示例代码如下:
var
olevar:variant;
begin
try
olevar:= CreateOleObject('TestOcxP.TestOcx');
    olevar.start;
finally
    olevar := null;
end;
end;

如果现在我把sqasrvr.pas添加到主程序(EXE)里面,
则对于主程序(EXE)的窗体使用我上面列出的Robot调用语句是可以的,
而对于OCX程序里的窗体是不行的。

我试了你的方法把SQAOTE32.ocx控件添加到了主程序(EXE)的窗体里面或
把SQAOTE32.ocx控件添加到了OCX程序里的窗体里面,结果都是不行的,
对于OCX程序里的窗体使用我上面列出的Robot调用语句还是不起作用。

另外我之前的解决方法如下:
要想令Robot调用语句在OCX程序里的窗体也起作用的话,
单单把sqasrvr.pas添加到OCX程序里是不行的,
还要在OCX程序的初始化后段加如下一句代码:
initialization
TActiveFormFactory.Create(
    ComServer,
    TActiveFormControl,
    TTestOcx,
    Class_TestOcx,
    1,
    '',
    OLEMISC_SIMPLEFRAME or OLEMISC_ACTSLIKELABEL,
    tmApartment);
   //下面是添加的代码
   Application.CreateHandle;
end.
因为可能Robot找不到OCX的句柄,所以要创建一下句柄。

这样的话如果直接运行主程序(EXE)点击按钮调出OCX程序里的窗体,
再使用Robot调用语句是可以成功的。

根据上面的做法还有一种情况是如果先对于主程序(EXE)的窗体
使用Robot调用语句(肯定不起作用因为主程序没有添加sqasrvr.pas)后,
再点击按钮调出OCX程序里的窗体,再对OCX程序里的窗体使用Robot调用语句就变得不起作用了。

从上分析可见他们之间产生冲突了,如果主程序里也添加sqasrvr.pas,
则无论先对哪个程序里的窗体使用Robot调用语句都可以成功,而之后对另一个使用就不行了,
也就回到了我之前说的那样。


请麻烦斑竹再帮忙研究研究。谢谢先!

sesamehch 发表于 2004-11-22 08:52:59

斑竹帮忙试了没有?

等待答复中。。。。。。

sesamehch 发表于 2004-11-25 21:03:23

都快看不到我的帖子了。
顶上去!

pcl2004_27 发表于 2004-11-25 21:35:30

最近比较忙,没有时间自己搭建环境!如果不着急请耐心等两天!

sesamehch 发表于 2004-11-26 08:43:45

谢谢斑竹!

好的。没问题。

sesamehch 发表于 2004-12-6 18:00:43

pcl2004_27 有空了吗?

To:pcl2004_27

有空帮我看看噢,过好久了,有点急。

guirongb 发表于 2004-12-7 09:05:59

帮忙手工顶,关注中。

sesamehch 发表于 2004-12-7 13:10:35

To:pcl2004_27

delphi程序中如果重复引用某个单元也会出现问题的!


delphi enabler的核心是sqasvr.pas,它是利用com原理实现的。你可以在调试的过程中发现,这个单元先初始化。初始化的过程就是把你们的程序中所有用到的控件先注册一遍,运行的过程中你调用了另一个程序,robot已经和delphi建立了通道,那么厚调用的这个程序界面中的控件相当于没有注册!所以robot识别不了!


我觉得你说的很有道理,根据你说的我继续研究,如果只在exe程序里添加sqasvr.pas单元,而不在其他ocx程序里添加该单元,这种情况下想要Robot既可以识别exe程序里的控件,又可以识别ocx程序里面的控件,只有一个方法就是exe程序和ocx程序的运行时包都要打上钩,只对一个程序打钩是不行的,要都打上。这样Robot就都可以识别了。

但我对这里面的原理不是很懂,为什么都要把运行时包都打上钩才可以,它里面做了些什么操作,是怎样建立了通道,我想要不打钩的情况下也能识别要怎么处理?

麻烦pcl2004_27帮忙解答一下。谢谢!

sesamehch 发表于 2004-12-13 10:32:56

pcl2004_27兄有空了吗?

pcl2004_27兄有空帮我解答一下!谢谢!

pcl2004_27 发表于 2004-12-13 10:47:27

sesamehch不好意思,最近很忙好多朋友的问题都没有及时解答,实在抱歉!
我在逐渐整理自动化版面没有回答的问题!

我会尽快试验,给你个答复!再次抱歉!

这里有个不清楚的地方,你说的:
只有一个方法就是exe程序和ocx程序的运行时包都要打上钩,只对一个程序打钩是不行的,要都打上。这样Robot就都可以识别了?
打上钩是说得什么呢?

sesamehch 发表于 2004-12-13 11:04:54

To:pcl2004_27兄

没事。反而是我有点不好意思了,老是麻烦你。再次感谢pcl2004_27兄的热情帮助。

sorry。没有说清楚,运行时包打上钩就是:
编译时把Project--〉Options--〉Packages属性页下面的Build with runtime packages选中。

sesamehch 发表于 2004-12-28 11:17:48

已经看不到我的贴子了,顶一下。
页: [1] 2
查看完整版本: 大虾请出手啦!关于Robot测试Delphi程序中的冲突问题