51Testing软件测试论坛

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

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3129|回复: 12
打印 上一主题 下一主题

[原创] 开发第三方的DLL时遇到的问题(6月18日更新)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2007-6-6 12:30:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
51testing上关于Dll的讨论已经很多了,我仔细地阅读了各位高手的例子,得到了很多启发,总的来说,有两种方法调用dll

一种是:
extern.declare .................
然后调用时
extern.methodNAME

另外一种是:
set object1=createobject("projectname.classname")
然后调用时
object1.methodname

但是这两种方式都有同一个问题,那就是都必须使用exten或objcet1这种预先声明的对象来调用dll里的方法

这样的dll只能是一个普通的函数库的在作用,而我更希望能使用dll来解决第三方软件的方法调用

比如我们在开发时经常有可能使用到第三方的组件和插件,这时QTP不一定会有相关的ADD-IN,甚至可以说是90%的可能性没有,比如CELL插件,QTP在识别它们时就无可奈何了。我想通过了自己写DLL来实现操作这些组件的方法,然后通过QTP来调用DLL的方法。但是我失败了!

我依照论坛上的帖子写了一个VB的DLL文件,有两个class,一个是普通的msgbox(),另一个是调用了cell的方法(并且在vb里编译成功),在QTP里运行时第一个成功了,说明语法没有问题,但是第二个却说不能产生对象,源代码如下:

Dim data
set data=Createobject("aaa.class2")

VB里如下
Public Sub getcelldata()
Dim a
a = cell.getcelldouble(1, 1, "sheet1")
MsgBox (a)
End Sub

我自己分析了一下原因,也是我的困惑,主要有两点:
1、data这个对象不能调用cell里的getcelldata方法导致错误,因为它只是我声明的一个变量,而不是我用QTP在网页上捕获的cell插件对象,但是我如何才能把这个dll里的方法与网页上捕获的对象关联起来呢?

我思考了半天也找不出方法。

同样用extern.declare即时能调用dll成功,也面临同样的问题,因为也必须通过extern.来调用方法,同样无法与网页上捕获的对象关联。

2、即时有办法能关联在一起,QTP捕获的这个对象就能顺利使用其方法吗?比如

browser("browser").Page("主页面").frame("name:=cellIFrame").Activex("acx_name:=CellWeb5 Control").cell.getcelldouble(1, 1, "sheet1")

后面那段红字是CELL参考手册提供的方法调用语法,我这里只是想说明我的目的,实际这样写当然是失败的。

所以我请问大家,以及各位i潜水的高手,是否有人开发出QTP可以调用的针对第三方的DLL?这两个问题怎么样解决?如果能给出一个实际的例子,就更好了.

[ 本帖最后由 kursk 于 2007-6-18 14:04 编辑 ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
 楼主| 发表于 2007-6-6 14:30:28 | 只看该作者
没有人来回帖?为什么每次我的帖总是没有人回?
回复 支持 反对

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2007-6-6 17:20:55 | 只看该作者
大家来说说自己的想法吧
回复 支持 反对

使用道具 举报

该用户从未签到

4#
 楼主| 发表于 2007-6-7 09:00:25 | 只看该作者
继续耐心等待.l...............
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2007-6-7 09:37:33 | 只看该作者
帮你顶一下,希望有高手可以解决你的问题!sdlkfj6
我也遇到了和你类似的问题,希望可以从你的贴中得到答案!
回复 支持 反对

使用道具 举报

该用户从未签到

6#
发表于 2007-6-7 13:29:43 | 只看该作者

回复 #1 kursk 的帖子

这个问题的话,你看能不能这样,把getcelldata当做一个函数来写,传入一个object类型的参数,在调用这个函数的时候,将页面中捕捉的cell对象传进去,这样也许可以。
----------------------------------
1、data这个对象不能调用cell里的getcelldata方法导致错误,因为它只是我声明的一个变量,而不是我用QTP在网页上捕获的cell插件对象,但是我如何才能把这个dll里的方法与网页上捕获的对象关联起来呢?

我思考了半天也找不出方法。

同样用extern.declare即时能调用dll成功,也面临同样的问题,因为也必须通过extern.来调用方法,同样无法与网页上捕获的对象关联
回复 支持 反对

使用道具 举报

该用户从未签到

7#
 楼主| 发表于 2007-6-8 00:56:42 | 只看该作者
原帖由 wuzhuayu 于 2007-6-7 13:29 发表
这个问题的话,你看能不能这样,把getcelldata当做一个函数来写,传入一个object类型的参数,在调用这个函数的时候,将页面中捕捉的cell对象传进去,这样也许可以。
----------------------------------
1、 ...


怎么将“将页面中捕捉的cell对象传进去”?

如果直接写入DLL文件,则DLL文件会报错,如果这样写:

set object=browser().page().frame().webelement()   '这是我在网页上捕获的对象

'如果再声明一个同名的object
set object=("project1.class1")  '即使这个object得到了这个dll文件的方法,但是也同时失去了网页上捕获的对象

我想不出好的方法来,请再给些提示
回复 支持 反对

使用道具 举报

该用户从未签到

8#
 楼主| 发表于 2007-6-18 10:50:26 | 只看该作者
今天尝试将object作为一个参数传入函数,但是最后还是失败了,现在将我的过程写下来,抛砖引玉,望大家多多指点

因为我们公司主要用到的是用友CELL报表插件,所以我所指的第三方软件指的用友CELL报表

第一步:我在VB6.0里编写了一个DLL文件,在其中调用了CELL的方法getcelldouble(得到单元格的数值)。当然了,因为需要使用CELL的方法,所以在component中加入了cell的OCX文件。

代码如下:

'声明成一个方法,将CELL作为一个参数输入,因为getcelldouble是私有的方法,所以这个方法也必须是private
Private Function getcellvalue(cellobj As Cell, col As Long, row As Long, sheet As Long) As Double
'调用CELL的GetCellDouble方法
getcellvalue = cellobj.GetCellDouble(col, row, sheet)
End Function

在VB中编译DLL文件通过了。

第二步:新建一个QTP脚本,代码如下

'新建一个cellobj,并用dll文件声明成cell对象
Dim cellobj
Set cellobj=createobject("dlltest.dllclass")

'将网页中的cell控件捕获,并声明成一个对象以便调用,
Dim cellactivex
Set cellactivex=browser("browser").Page("主页面").Frame("cellIFrame").ActiveX("ActiveX").WinObject("AfxWnd42s")
'If cellactivex.exist Then
        'msgbox("good")
'End If

'然后调用方法
msgbox(cellobj.getcellvalue(cellactivex,1,1,1))

但是执行到调用方法,也就是msgbox(cellobj.getcellvalue(cellactivex,1,1,1))这句话时QTP报错,说没有此类参数或方法!

我思考失败的原因,可能是如下的情况:
我在网页中捕获的cell对象,也就是cellactivex,和在VB中作为参数输入的cell对象不是同一个类型,前者是QTP从网页捕获的,后者是cell报表的源生对象——前者和后者的类型是不一致的!

如果真是这样,那DLL文件可能只能调用微软的DLL文件,而针对其他第三方软件的dll文件可能都不能成功

不过希望大家能提出更多的建议,给小弟指条明路吧!

[ 本帖最后由 kursk 于 2007-6-18 11:12 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

9#
 楼主| 发表于 2007-6-18 14:15:24 | 只看该作者
好像没有太多人关注啊...........
郁闷中,难道真的没有办法吗?sdlkfj7
回复 支持 反对

使用道具 举报

该用户从未签到

10#
 楼主| 发表于 2007-6-18 15:06:19 | 只看该作者
反思以前的尝试,我感觉QTP不一定支持我的这种做法。

刚开始,我之所以要在CELL报表中自动输入数据,是因为报表中的数据太多,用手工测试太慢。但是因为QTP将CELL报表插件识别为一个winobject,这就导致只能使用QTP自己封装的一些方法,但是这些方法远远不能满足我的测试需要,所以我就自然而然的想到使用CELL开发所用的方法,那样我就可以灵活地操作CELL报表,包括使哪个单元格获得焦点,返回哪个单元格的值,因此也就自然而然地想到利用QTP可以导入DLL的功能,在VB里调用CLL的方法,然后生成DLL文件,然后再QTP调用DLL文件。

但是我忘记了重要的一点——软件测试脚本应该是基于用户活动,这就是说用户能够做的,测试脚本才能做;而用户作不到,测试脚本也应该做不到。

现在想想,QTP可能是基于这种理念而开发的,因此它有比较丰富的用户操作方法,但是几乎没有让脚本开发者可以调用后台程序,比如CELL的方法,而那个extern.declare语句更像是专门为win而设计的 ——看看帮助手册的例子,而且没有留有用户自定义对象的余地!

所有的这一切,都让我感觉QTP根本上就反对测试者从开发的角度调用开发的一些方法,而竭力地逼迫测试者编写基于用户操作的脚本。

当然,我们可以这样想,QTP这样做也是有商业目的的!试想一下,如果可以轻松地调用开发函数,那么测试者就可以针对各种软件,开发出自己的所需要的脚本,那么MI的add_in还有人买吗?

因此我现在处于一种怀疑阶段,QTP是不是从根本上,就杜绝了针对第三方软件的开发?
回复 支持 反对

使用道具 举报

该用户从未签到

11#
发表于 2007-6-18 17:57:42 | 只看该作者

一个简单的方法

如果你不能识别某些空件,或者识别了某些功能不满足你的要求
可以让研发配合你增加一些代码,公开一些测试点函数
但是该函数只能传入和传出基本数据类型
比如表格对象,要想获取/设置某个单元格 ,让研发增加一个方法 getVal(int row,int col)
你可以这样用
set mytblOjb=window("**").wintable("******").object
val=mytblObj.getVal(100,101)
ok?
回复 支持 反对

使用道具 举报

该用户从未签到

12#
 楼主| 发表于 2007-6-18 22:39:20 | 只看该作者
原帖由 volvoo 于 2007-6-18 17:57 发表
如果你不能识别某些空件,或者识别了某些功能不满足你的要求
可以让研发配合你增加一些代码,公开一些测试点函数
但是该函数只能传入和传出基本数据类型
比如表格对象,要想获取/设置某个单元格 ,让研发增加 ...


但是QTP一运行这些方法
val=mytblObj.getVal(100,101)

就报错说非法的属性和方法啊?

[ 本帖最后由 kursk 于 2007-6-18 22:41 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

13#
发表于 2007-6-20 22:27:59 | 只看该作者
希望这个帖子不要沉.严重关注这个问题.我也遇到了同样的困惑.基本都dll快失去信心了.希望高手解答啊
回复 支持 反对

使用道具 举报

本版积分规则

关闭

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

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

GMT+8, 2024-11-11 09:08 , Processed in 0.077321 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

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