51Testing软件测试论坛

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

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 6884|回复: 23
打印 上一主题 下一主题

[原创] 用QTP实现网页上两表数据的验证

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2008-6-3 10:59:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚学QTP,自己写的一段脚本,用QTP实现网页上两表数据的验证,实现的方法绕了一个大弯,希望大家多给意见。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2008-6-3 12:05:36 | 只看该作者
先支持一下,喜欢这种讨论和学习气氛都比较浓厚的贴子
回复 支持 反对

使用道具 举报

该用户从未签到

3#
发表于 2008-6-3 12:23:22 | 只看该作者
没仔细看代码,呵呵
但MM的这种学习精神值得学习,善于总结
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2008-6-3 13:05:08 | 只看该作者
看完了那份PPT,不错的做法。
但是我觉的借助EXCEL实现数据的比较好一些,主要是能将datatable从测试实现的过程中分离出来,如果脚本迁移到其他支持VBS的测试工具上,也能保证正常运行。另外一个理由,可以充分的利用excel的公式功能,设置工作表之间的关联,减少维护的工作量。具体做法分为如下几步:
1、利用objects.childobject和objects.getRoproperty分别获取表一和表二中所有的数据单元格,并存到两个数组中
2、将两个数组中的值写入不同的excel工作表中。
3、利用vbs函数实现对两个工作表中的数据比较,对于比较规则我们可以写在VBS函数中,也可以固化在excel中。
以上是个人想法,仅供讨论用,呵呵
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2008-6-3 13:11:50 | 只看该作者
不错,支持!LZ以前是不是做过开发呢?
回复 支持 反对

使用道具 举报

该用户从未签到

6#
 楼主| 发表于 2008-6-3 13:22:22 | 只看该作者
谢谢你的建议。

请问用objects.childobject这个方法可以取出表二中的单元格的数据吗?如果可以的话那就省了好多麻烦了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
回复 支持 反对

使用道具 举报

该用户从未签到

7#
 楼主| 发表于 2008-6-3 13:27:59 | 只看该作者

回复 5# 的帖子

做过半年
回复 支持 反对

使用道具 举报

该用户从未签到

8#
发表于 2008-6-3 13:33:06 | 只看该作者
不知道表二是不是IE界面,如果是的话就一定可以。对于IE来说,只要开发人员能识别和调用,我们在QTP就能进行识别和获取。
回复 支持 反对

使用道具 举报

该用户从未签到

9#
 楼主| 发表于 2008-6-3 13:37:04 | 只看该作者

回复 8# 的帖子

表二是在IE里面的,我是说用objects.childobject这个方法可以取每个等级医院下的医院的亏损次数吗?
回复 支持 反对

使用道具 举报

该用户从未签到

10#
发表于 2008-6-3 14:33:00 | 只看该作者
ding ding ding
回复 支持 反对

使用道具 举报

该用户从未签到

11#
发表于 2008-6-3 16:22:21 | 只看该作者
原帖由 FLY000 于 2008-6-3 13:37 发表
表二是在IE里面的,我是说用objects.childobject这个方法可以取每个等级医院下的医院的亏损次数吗?

是这样的:
1、定义个描述性编程对象DESC
2、用spy查看亏损单元格对象的属性,并将该属性值赋给DESC,形如:desc("micclass").value = "td",其中这个属性值应该能唯一标识出“亏损”单元格的属性。
3、执行object.childobject(desc),其中object是对象库中单元格的上层对象节点;该方法返回的是一个集合我们可以用set item = .......来获取。
4、定义一个循环,然后执行item(i).getRoproperty("value")来获取每个单元格的值,其中I 是循环变量,value是我们要获取的属性的名称。有可能你们的开发人员是用title,name这样的属性名称来存储的。
这样我们就可以获取每个单元格的值,把这些值存到EXCEL里,并进行比较即可。
回复 支持 反对

使用道具 举报

该用户从未签到

12#
 楼主| 发表于 2008-6-4 11:03:34 | 只看该作者
3、执行object.childobject(desc),其中object是对象库中单元格的上层对象节点;该方法返回的是一个集合我们可以用set item = .......来获取。
--------
object是对象库中单元格的上层对象节点-----我怎么能确定object是desc的上层对象节点呢?
比如:我想让“妇保医院等级下的单元格”是object,“亏损次数下的单元格”是desc,但是我怎样确定“妇保医院等级下的单元格”是“亏损次数下的单元格”的上层节点呢?
回复 支持 反对

使用道具 举报

该用户从未签到

13#
发表于 2008-6-4 13:39:17 | 只看该作者
不是这个意思。比如说QTP中对象的层次结构从顶层往下依此是:browser(“IE”)——PAGE(“查询结果”)——Frame("mainbody").WebElement("妇保院等级“)
在这样的一个对象结构中,你那张图里所有的单元格(包括那个“妇保院等级”单元格)都在Frame("mainbody")这个对象下面,是它的子对象。Frame("mainbody")就是我所说的object,
desc就是你创建的代表单元格的描述性语言。
对于开发人员来说,页面中每一类单元格都需要有一个标识,拿那张图来说,他们在生成那张图里的页面时,也需要区分行表头、列表头单元格、只读单元格、可编辑单元格等等,他们会给这些单元格(在HTML是TD)加一个唯一标识的属性,例如对于表头,可能会有一个属性叫isheadcell=true,所有该属性为True的单元就是表头,而对于那些统计数字的单元格类型也会有类似的一个标识。这些标识是能够被QTP的SPY直接识别出来的(除非用的是DIV或自定义控件,那会麻烦一点,但是也能实现)。
只要知道了那些统计数字的单元格标识,我们就可以用描述性编程对象来实现了。比如说如果所有单元格都有一个属性:isCountResult,而统计单元格该属性为True,其他单元格属性为false,那么我们就可以象下面这样获取单元格对象:

Set cellobjs = description.Create '创建描述性编程对象
cellobjs("micclass").value = "td"  '设置该对象的类型是单元格(TD)
cellObjs("isCountResult").value = true  '设置该单元格是统计数字的单元格,具体的属性名和属性值可以从spy来查看,我只是举例
Set objitem = browser("IE").PAGE("查询结果").Frame("mainbody").ChildObjects(cellobjs)'该语句获取页面中所有micclass为TD、isCountResult为True的单元格,并返回一个集合
'下面用一个循环来访问所有的单元格
For i = 1 to objitem.count
    objitem(i).click'点击每个统计数字的单元格,此步骤只为举例,如果只获取单元格的值,该步骤可省略
    a = objitem(i).getRoProperty("value")'获取每个单元格的值,当然实际中属性值未必一定是value,这里也只是举例

    'code……可以写代码将a与预期结果进行比较,一致的话则通过,不一致的话则失败,最后生成测试报告

Next
回复 支持 反对

使用道具 举报

该用户从未签到

14#
 楼主| 发表于 2008-6-5 15:00:57 | 只看该作者
我明白你的意思了。

但是:
一级甲等下的医院的亏损次数的单元格的属性和一级乙等下的医院的亏损次数的单元格的属性没有什么区别。也就不能用这种方法取出一级甲等下的医院亏损次数。
回复 支持 反对

使用道具 举报

该用户从未签到

15#
发表于 2008-6-5 15:26:37 | 只看该作者
原帖由 FLY000 于 2008-6-5 15:00 发表
我明白你的意思了。

但是:
一级甲等下的医院的亏损次数的单元格的属性和一级乙等下的医院的亏损次数的单元格的属性没有什么区别。也就不能用这种方法取出一级甲等下的医院亏损次数。

仍然可以实现,只是做法上稍微有些不同:
首先,利用上述方法取出所有单元格的值,包括一级甲等和一级乙等,并将值写入一个二维的数组中。这是数组里的行数、列数及与数组中值的对应关系应该是与IE界面中的表格完全一致的;我们把这个数组写入excel表,我们暂时把这张表叫做测试结果表。
然后,需要实现准备一张EXCEL表,该表中的表样与IE界面中的表样完全一致,我们暂时把这张表叫做校验表;
最后,利用脚本比较测试结果表和校验表中的数据是否一致,如果一致,则测试通过,如果不一致,则测试失败;
这样的做法我个人倒不喜欢,因为这不是自动化测试的标准做法。我之所以提出这样的做法,是因为上次的自动化测试项目中,对于EXCEL的读取和写入已经有了一些积累。代码不用从头写,无论是写入还是读取都很方便,所以我才这么喜欢用excel代替QTP的datatable,这个方法也许适合于我,但是未必所有人都会觉的爽
另外一点,对于自动化测试来说,我觉的不用区分一级甲等或一级乙等。如果界面中同时存在一级甲等和一级乙等的数据,我觉的最好的做法是两个级别的数据都进行测试,不用克意把一部分数据摘出来。毕竟不是人工测试,你给脚本再多的任务它也不会喊累。
回复 支持 反对

使用道具 举报

该用户从未签到

16#
 楼主| 发表于 2008-6-5 18:08:22 | 只看该作者

回复 15# 的帖子

谢谢你回复了这么多,但是在取完数后一定知道哪写数据是属于各等级医院的,因为最后要对各等级医院的各医院亏损次数作统计的。

呵呵。
回复 支持 反对

使用道具 举报

该用户从未签到

17#
发表于 2008-6-6 13:08:40 | 只看该作者
我也是对这个题目感兴趣,所以想和大家交流的,但是看来一直讨论的只有我们两个。我觉的对这些设计方法讨论的意义应该会远大于那些类似datatable如何读取这样的问题,因为设计方法是通用的,无论换了什么测试工具都能实现
对于你刚才说的那个问题,我觉的如果能把表格中的数据取到数组里,就一定能写出代码判断出是属于哪个等级医院的,这其实就是对二维数组的操作。例如,对于一个二维数组来说,可以用一个双循环来实现,循环中每个循环变量都对应行表头和列表头,然后依此读取,设置一个计数器count ,当I = 3时count = count+1,这样就可以实现对行表头值为3的各列的的统计,如果我们行表头的值是各个医院的等级或名称,我们就能实现相应的数据统计。甚至于我们可以把excel作为sql数据表,在VBS中用select count(*) from来实现。(这个好象是创建ODBC数据源的吧)

[ 本帖最后由 dreamever 于 2008-6-6 13:14 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

18#
 楼主| 发表于 2008-6-6 14:41:16 | 只看该作者
IsBox=Browser("登录服务器").Page("华普财务分析系统").WebTable("正在计算,请稍等......").Exist
        nCount=1
        While IsBox
                wait(3)
                IsBox=Browser("登录服务器").Page("华普财务分析系统").WebTable("正在计算,请稍等......").Exist
                nCount=nCount+1
                If nCount=20 Then
                        msgbox("等待时间太久,请重新计算")'要停止qtp
                        Isbox=false
                End If
        Wend

执行到while循环里时,Browser("登录服务器").Page("华普财务分析系统").WebTable("正在计算,请稍等......") 这个对话框在已经不存在了,但是取的IsBox=Browser("登录服务器").Page("华普财务分析系统").WebTable("正在计算,请稍等......").Exist, IsBox还是true. 为什么啊?

[ 本帖最后由 FLY000 于 2008-6-6 16:05 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

19#
发表于 2008-6-12 10:22:03 | 只看该作者
讨论的很热,不错,先看看再学习总结一下.
回复 支持 反对

使用道具 举报

该用户从未签到

20#
发表于 2008-6-25 13:07:24 | 只看该作者
谢谢,下载来学习先
回复 支持 反对

使用道具 举报

本版积分规则

关闭

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

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

GMT+8, 2024-11-17 16:30 , Processed in 0.081075 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

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