大虾请出手啦!关于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 ] 我觉得你的问题在于对不同的对象识别用了同一个识别方法!
robot针对delphi程序识别用到delphi enabler,而针对ocx(ocx是activex控件),robot针对ocx控件识别使用的是Rational ActiveX Test Control控件。
明白了么!
这里可能有个问题,你说的a和b有冲突!
你是否对delphi enabler中的单元进行了扩展(接口,识别你的控件属性!)!? 谢谢斑竹的热心解答!我还想问一下:
robot针对ocx控件识别使用的是Rational ActiveX Test Control控件。
那Rational ActiveX Test Control控件该怎么用?
我在安装Rational Test Enablers时也看到了Rational ActiveX Test Contro安装选项,安装了它好像没什么变化,不懂用。请斑竹再说明一下要怎样使用它。
另外,我是对delphi enabler中的单元进行了扩展,主要是扩展各种控件的属性接口,从而让Robot可以识别我所扩展的属性。
各位大虾快来帮忙啊!!
斑竹也不知道跑哪儿去了。各位大虾快来帮忙看看啊!
我自己先顶一下。 关于第一个问题那Rational ActiveX Test Control控件该怎么用?
我有一篇关于Rational ActiveX Test Control的识别的文章
blog.csdn.net/piaocl/archive/2004/05/17/19560.aspx
你可以参考一下! 非常感谢斑竹!
那篇文章我已经看过了,图片显示不出来,还有它说的是在VC中的应用,在Delphi中应该如何用啊?
另外文章说“添加Rational ActiveX Test Control”是否就是添加SQAOTE32.ocx控件到程序中啊?我也试了把SQAOTE32.ocx添加到我的程序中,拖到窗体上也出现了一个robot的图标控件,但好像没什么作用,程序依旧会有我之前说的冲突。
请斑竹能否说的再详细点关于Rational ActiveX Test Control是怎样在Delphi中应用的。
谢谢! 你添加之后要先把带有activex控件的程序中的sqasvr.pas去掉! delphi程序中如果重复引用某个单元也会出现问题的!
delphi enabler的核心是sqasvr.pas,它是利用com原理实现的。你可以在调试的过程中发现,这个单元先初始化。初始化的过程就是把你们的程序中所有用到的控件先注册一遍,运行的过程中你调用了另一个程序,robot已经和delphi建立了通道,那么厚调用的这个程序界面中的控件相当于没有注册!所以robot识别不了!
非常感谢斑竹!
根据你说的情况试用了很多种方法,还是没能成功.能否麻烦斑主写一个简单的例子自己试试看。
我们要测试的程序情况和要求如下(举一个简单例子):
在一个主程序(普通的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调用语句都可以成功,而之后对另一个使用就不行了,
也就回到了我之前说的那样。
请麻烦斑竹再帮忙研究研究。谢谢先!
斑竹帮忙试了没有?
等待答复中。。。。。。 都快看不到我的帖子了。顶上去! 最近比较忙,没有时间自己搭建环境!如果不着急请耐心等两天!
谢谢斑竹!
好的。没问题。pcl2004_27 有空了吗?
To:pcl2004_27有空帮我看看噢,过好久了,有点急。
帮忙手工顶,关注中。
To:pcl2004_27
delphi程序中如果重复引用某个单元也会出现问题的!delphi enabler的核心是sqasvr.pas,它是利用com原理实现的。你可以在调试的过程中发现,这个单元先初始化。初始化的过程就是把你们的程序中所有用到的控件先注册一遍,运行的过程中你调用了另一个程序,robot已经和delphi建立了通道,那么厚调用的这个程序界面中的控件相当于没有注册!所以robot识别不了!
我觉得你说的很有道理,根据你说的我继续研究,如果只在exe程序里添加sqasvr.pas单元,而不在其他ocx程序里添加该单元,这种情况下想要Robot既可以识别exe程序里的控件,又可以识别ocx程序里面的控件,只有一个方法就是exe程序和ocx程序的运行时包都要打上钩,只对一个程序打钩是不行的,要都打上。这样Robot就都可以识别了。
但我对这里面的原理不是很懂,为什么都要把运行时包都打上钩才可以,它里面做了些什么操作,是怎样建立了通道,我想要不打钩的情况下也能识别要怎么处理?
麻烦pcl2004_27帮忙解答一下。谢谢!
pcl2004_27兄有空了吗?
pcl2004_27兄有空帮我解答一下!谢谢! sesamehch不好意思,最近很忙好多朋友的问题都没有及时解答,实在抱歉!我在逐渐整理自动化版面没有回答的问题!
我会尽快试验,给你个答复!再次抱歉!
这里有个不清楚的地方,你说的:
只有一个方法就是exe程序和ocx程序的运行时包都要打上钩,只对一个程序打钩是不行的,要都打上。这样Robot就都可以识别了?
打上钩是说得什么呢?
To:pcl2004_27兄
没事。反而是我有点不好意思了,老是麻烦你。再次感谢pcl2004_27兄的热情帮助。sorry。没有说清楚,运行时包打上钩就是:
编译时把Project--〉Options--〉Packages属性页下面的Build with runtime packages选中。 已经看不到我的贴子了,顶一下。
页:
[1]
2