软件测试


网站首页 | 软件测试论坛 | 软件测试培训 | 软件测试博客 | 软件测试杂志 | 软件测试沙龙 | 软件测试下载 | 软件测试顾问
业界新闻 | 软件测试人才 | 软件测试技术 | 软件测试工具 | 行业软件测试 | 软件测试管理 | 软件质量专栏 | 软件开发专栏
当前位置:首页>>软件测试工具>>Rational>>正文
Rational 识别 Delphi TDBGrid的解决方法
文章出处:51testing博客 作者:pcl 发布时间:2006-07-18

当时看到这个问题,想到两个的解决方法一个是利用对象的方法,赋值,编写程函数,输入列和行,然后由这个函数处理,这样做直接,高效率,还有一个思路是利用坐标定位然后输入数据,也是便写函数,具体计算由函数处理,这种方法虽然不能做到通用,但简单实用。

按照第一个思路开始行动,因为那位朋友测试的软件用delphi开发,其中gird是个第三方控件,这里我用TDBGrid来代替他的第三方控件做到问题简单化,先把实际问题解决,自己动手做了个程序,用ADO连接数据库,利用DataGrid显示数据,来模拟实际情况。录制脚本如下:

Sub Main

    Dim Result As Integer

 

    'Initially Recorded: 2004-4-22  23:01:19

    'Script Name: First

   

StartApplication """C:\Documents and Settings\Administrator\桌面\T\Project1.exe"""

   

    Window SetContext, "Caption=Form1", ""

    GenericObject DblClick, "Class=TDBGrid;ClassIndex=1", "Coords=168,27"

    InputKeys "good"

    GenericObject Click, "Class=TDBGrid;ClassIndex=1", "Coords=369,33"

    Window CloseWin, "", ""

 

End Sub

用过delphi的人都知道TstringGrid有个Cell属性,我们可以利用robot函数SqaSetPropertycell赋值完成上边要的功能,首先用robot来的gui insertobject properties来抓取对象TDBGrid的属性,这样做是因为函数SqaSetProperty只能对robot抓取道的属性起作用,也就是说即使有cell属性,robotobject properties抓取不到这个属性,我们也无法实现前边的想法。用object properties抓取TDBGrid的属性后发现,只抓取到了部分属性,根本没有可以利用的cell属性,怎么办,利用delphi enabler来做一次看是否可以得到更多的属性,我把sqasrv.pas(其实delphi enabler的核心就是这个delphi单元文件)加入到工程文件中,重新编译(可能编译的时候有一些问题,我遇到的问题是Unit 'oleAuto' is deprecated,$WARN UNIT_DEPRECATED ON/OFF编译开关,就可以解决了),重新录制脚本如下:(这回TDBGrid的属性基本都抓取到了)。

 

Sub Main

    Dim Result As Integer

 

    'Initially Recorded: 2004-4-22  23:38:55

    'Script Name: Second

    StartApplication """C:\Documents and Settings\Administrator\桌面\T\Project1.exe"""

   

    Window SetContext, "Name=Form1;Type=Form", ""

    GenericObject DblClick, "Name=DBGrid1;Type=CustomGrid", "Coords=93,30"

    InputKeys "jack"

    GenericObject Click, "Name=DBGrid1;Type=CustomGrid", "Coords=338,26"

    Window CloseWin, "", ""

 

End Sub

 

可是仍然没有我们要的cell属性,只有columns属性,没有我需要的cell属性,怎么办?于是研究delphiTDBGrid的源代码发现TDBGrid继承的TcustomGrid中有HideEditUpdateEdit等方法,说明在输入数据的时候TDBGird在后台是生成了一个输入文本框,焦点改变后这个文本框自动消失把数据输入到TDBGrid。这样我们只要能给这个EDITTEXT属性赋值同样可以实现,因为TDBGrid没有CELL属性,不能直接利用SQASetProperty函数给cellfocus属性赋值,只能利用点击这个cell来赋予它焦点,因为只有焦点在这个cell上后才会出现浮动的文本框,修改上边的脚本:

 

Sub Main

    Dim Result As Integer

    Dim Var as String

    'Initially Recorded: 2004-4-22  23:38:55

    'Script Name: Second

    StartApplication """C:\Documents and Settings\Administrator\桌面\T\Project1.exe"""

   

    Window SetContext, "Name=Form1;Type=Form", ""

    GenericObject DblClick, "Name=DBGrid1;Type=CustomGrid", "Coords=93,30"

   

       

    Result = SQASetProperty ("Name=;Type=CustomGrid;Index=1", "Text", "Mr.")

    Result = SQAGetProperty("Name=;Type=CustomGrid;Index=1", "Text", VAR)

    GenericObject Click, "Name=DBGrid1;Type=CustomGrid", "Coords=338,26"

   

       

    if Result = 0 then

       MsgBox "Hello"

    End if

    GenericObject Click, "Name=DBGrid1;Type=CustomGrid", "Coords=338,26"

    'Window CloseWin, "", ""

 

End Sub

虽然赋值成功,但是datagrid无法显示你需要的数据(这里需要研究一下),因为时间的缘故,就用第二种方式坐标的方式来实现,考虑多平台共享使用,写SetGridFocus函数,思路这样得到tdbgrid对象,得到其中column的属性宽高,计算坐标(这些都在函数内部实现),其中移动有个固定值24是追踪tdbgrid代码中defaultHeight24

最后代码如下:

Sub SetGridFocus(strObject as String, strCol as String, strRow as String, strValue as String)

  

   Dim iResult as Integer

   Dim iCount as Integer

   Dim ColWidth() as integer

   Dim iWidth as Integer

  

   Dim strColPos as Integer

   Dim strRowPos as Integer

   Dim strCor as String

  

   Dim iTemp as integer

  

   strColPos = 0

   strRowPos = 0

   iTemp = 0

  

   SQAGetProperty strObject ,"Columns.Count", iCount

  

   if iCount <> 0  then

      Redim ColWidth(iCount - 1)

     

      While iTemp < iCount

         iResult = SQAGetProperty (strObject, "Columns.Items(" + CStr(iTemp) +").Width",iWidth)

         ColWidth(iTemp) = iWidth

         iTemp = iTemp + 1

     wend

     

   End if

      strColPos = 20

      if CInt(strCol) <> 1 then

          for iTemp = 1 to CInt(strCol)-1

                strColPos = strColPos+ ColWidth(iTemp-1)

          next iTemp         

      End if         

     

      for iTemp = 1 to CInt(strRow)

         strRowPos = 24 +strRowPos

      next iTemp

     

     

     

   strCor = "Coords=" & strColPos &","+CStr(strRowPos)

  

  

   GenericObject Click, strObject, strCor

   InputKeys strValue

   stop

   strCor = "Coords=" & strColPos &","+CStr(strRowPos + 24)

   GenericObject Click, strObject, strCor  

  

  

End Sub

 

上编写的还有很多疏漏的地方,对于浮动文本框赋值成功,却无法改动tdbgrid中的值没有深入研究,该函数在实际应用中还有个小问题,没有做到很完全“周到“ ,下回有时间改正。

备注:

最后我把代码进行优化和扩展,开发了针对grid的相关函数,下边是其中之一

//得到列数

Function GetColCount(sGridRecogStr as String) as Integer

    Dim Result as Integer

    Dim vValue as Variant

    Dim sLogMessage as String

    Dim sErrorMessage as String

 

    grdGetRowCount = -1

 

    Result = SQAGetProperty(sGridRecogStr, "Column.Count", vValue)

    If Result = sqaSuccess Then

        GetRowCount = CInt(vValue)

    Else

        sLogMessage = "无法得到Grid的列数

        sErrorMessage = "[" & CStr(Result) & " = " & Error(Result) &"]"

        SQALogMessage sqaFail, sLogMessage, sErrorMessage

    End If

   

End Function

 

就到这里吧。


站内搜索
相关文章
◎Rational robot 识别对象的方法
◎使用IBM Rational的测试理念成功打造测试团队
◎使用Rational的测试理念
◎Rational系列产品大概的介绍
◎Robot压力测试实例
◎理解Rational分析三层结构观点
◎robot函数实例讲解(二)
◎robot函数实例讲解(一)
◎IBM Rational XDE tester使用指南
◎详解 Rational ClearCase中的lost+found目录
◎关于Rational与软件质量保证
◎Robot手工编写GUI脚本如何获取对象识别方法和属性
◎rational对象脚本命令
◎Robot GUI脚本操作SQL SERVER数据库
◎GUI录制回放测试方法缺点
◎Rational中DataPool的介绍与实际应用-续(2)
◎Rational中DataPool的介绍与实际应用-续(1)
◎Rational中DataPool的介绍与实际应用
◎ClearCase迁移中的一些经验
◎IBM Rational ClearCase 视图全攻略
◎浅谈ClearQuest 2002.05 建库指南
◎Rational ClearQuest介绍
◎数据池(DATAPOOL)专题
◎使用IBM Rational PurifyPlus测试J2EE应用程序
◎使用Rational Robot测试含有数据关联的Web应用
◎IBM Rational Robot
◎用Rational Functional Tester创建随需应变的自动测试脚本
◎解决Grid自动化测试的思路
◎Base ClearCase与ClearQuest的集成
◎IBM Rational助您轻松完成基于J2EE的Web应用系统的性能测试和性能优化
◎IBM Rational 助您轻松完成自动化功能测试
◎使用 Rational PureCoverage 诊断 C/C++ 程序覆盖信息和用户环境的集成
◎Rational XDE tester使用指南
◎Rational 完成自动化功能测试
◎定制ClearQuest以通过所有者、角色或组来分隔记录
热门文章
◎IBM Rational Robot
◎Rational 完成自动化功能测试
◎Rational系列产品大概的介绍
◎Robot压力测试实例
◎Rational ClearQuest介绍
◎用Rational Functional Tester创建随需应变的自动测试脚本
◎robot函数实例讲解(一)
◎Robot手工编写GUI脚本如何获取对象识别方法和属性
◎关于Rational与软件质量保证
◎IBM Rational 助您轻松完成自动化功能测试
◎IBM Rational XDE tester使用指南
◎robot函数实例讲解(二)
◎使用 Rational PureCoverage 诊断 C/C++ 程序覆盖信息和用户环境的集成
◎rational对象脚本命令
◎GUI录制回放测试方法缺点
◎IBM Rational ClearCase 视图全攻略
◎使用IBM Rational的测试理念成功打造测试团队
◎数据池(DATAPOOL)专题
◎详解 Rational ClearCase中的lost+found目录
◎IBM Rational助您轻松完成基于J2EE的Web应用系统的性能测试和性能优化
◎Base ClearCase与ClearQuest的集成
◎理解Rational分析三层结构观点
◎浅谈ClearQuest 2002.05 建库指南
◎使用IBM Rational PurifyPlus测试J2EE应用程序
◎Rational中DataPool的介绍与实际应用
◎使用Rational的测试理念
◎Robot GUI脚本操作SQL SERVER数据库
◎ClearCase迁移中的一些经验
◎Rational中DataPool的介绍与实际应用-续(2)
◎Rational Robot 常用语句
◎Rational robot 识别对象的方法
◎使用Rational Robot测试含有数据关联的Web应用
◎Rational中DataPool的介绍与实际应用-续(1)
◎定制ClearQuest以通过所有者、角色或组来分隔记录
◎Rational XDE tester使用指南
◎浅谈RFT
◎解决Grid自动化测试的思路
◎Robot如何测试帮助c++程序员识别自定义或第三方控件
◎Rational Robot项目移植
◎用Robot写Java代理(一)
◎如何在Robot脚本中使用Object Data
◎用Robot写Java代理(二)
◎在VU脚本中使用HTTP连接
◎使用Robot连接SQL的例子
◎使用Robot输入清单
◎Robot进行数据库的并发测试
◎使用自定义代码对数据池进行随机访问

Google提供的广告