技术开发 频道

解决Grid自动化测试的思路

【IT168 技术文章】

    最近一个广州的测试朋友在实际工作中学习自动化测试的时候遇到这样一个问题,怎样做把点击 Grid ,然后输入数据,自动化。

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

    按照第一个思路开始行动,因为那位朋友测试的软件用 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 函数 SqaSetProperty 给 cell 赋值完成上边要的功能,首先用 robot 来的 gui insert 的 object properties 来抓取对象 TDBGrid 的属性,这样做是因为函数 SqaSetProperty 只能对 robot 抓取道的属性起作用,也就是说即使有 cell 属性, robot 的 object 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 属性,怎么办?于是研究 delphi 的 TDBGrid 的源代码发现 TDBGrid 继承的 TcustomGrid 中有 HideEdit , UpdateEdit 等方法,说明在输入数据的时候 TDBGird 在后台是生成了一个输入文本框,焦点改变后这个文本框自动消失把数据输入到 TDBGrid 。这样我们只要能给这个 EDIT 的 TEXT 属性赋值同样可以实现,因为 TDBGrid 没有 CELL 属性,不能直接利用 SQASetProperty 函数给 cell 的 focus 属性赋值,只能利用点击这个 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 代码中 defaultHeight 为 24

    最后代码如下:

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
 

    就到这里吧。

0
相关文章