不谋万世者,不足谋一时;不谋全局者,不足谋一域。君子敏于事而慎于言 新浪微薄:土司阿哈

利用RFT+VBS实现对表格控件的数据录入

上一篇 / 下一篇  2008-05-25 11:48:51 / 个人分类:Rational

1208328177
  • 自动化测试:
  • 测试文档:
  • 概述
51Testing软件测试网t;_#v"a,tbL~

    在自动化测试过程中,我们不可避免的要面临GUI对象识别的问题。目前主流的测试工具如RFT、QTP等,都能够很好的识别标准的对象元素,如windows的按钮、下拉列表,IE中的html标签等。但是也有一些定制的控件和元素是自动化测试工具所识别不了的。对于这种情况,我们或者依靠测试工具提供的API函数来实现,或者想一些变通的办法来实现。本文所说的就是用RFT和VBS脚本结合的方式来解决OCX数据录入的问题。

^c+Dsz4b ar0
  • 问题描述
51Testing软件测试网?,H9m-w~

    在我所负责的自动化测试项目里,被测系统的界面中使用了OCX控件,该控件的作用是接收用户在界面上录入的金额,并保存到数据库中。由于该OCX控件是开发人员自己定制的,因此开发测试脚本时运到了问题:在控件所生成的界面中包含多个录入单元格,但是RFT或者QTP都把该OCX控件识别成了一个整体。如下图所示:

%keI$a k051Testing软件测试网R9O|7[;l7I8|8Pf

51Testing软件测试网w/i/d3qn,L%E

51Testing软件测试网&FU(mG Z

    这就带来一个问题,如果要实现多个单元格的录入,我们只能把每个单元格都执行一遍录入操作,脚本参数化时也是这样,每个单元格录入所对应的脚本都要进行参数化,增加了脚本的维护工作量,降低了自动化测试的可用性。51Testing软件测试网 qWl$p p,Jr

F#J:F9pLr*C0    对于OCX控件操作,一般有两种解决方法:1、RFT提供了invoke方法,利用该invoke方法实现对OCX的属性访问和方法调用,但是invoke调用在我本机上会报异常;2、利用开源框架,如jacob,实现对OCX控件的调用。但是我却不知道如何将控件的值传递给IE接收。无奈之下我只能用复制粘贴的方法来实现数据的录入了。51Testing软件测试网;hl pM`

  • 设计思路

Llv1zmp_(n{'Ok01、要求被测系统必须支持界面的复制粘贴操作;

?N _7qkh B Q!\[0

S L"A\g,iJ02、利用excel准备好表样和测试数据,要求表样必须与界面的表样一致;

X0bcf4s!yi051Testing软件测试网b#X:iWK AU4^-H

3、编写vbs函数实现复制粘贴操作

-q jVM2a3S0

y+NJ;_(N04、RFT调用该VBS函数,将excel中的数据粘贴到被测系统的表格中。51Testing软件测试网PRAN ]X4|V

J1q4a M~7Q"o {+V:p6pW0注意,利用复制excel然后粘贴实现录入的做法并不是自动化测试的标准方法,利用对象属性识别单元格并进行数据录入才是王道51Testing软件测试网 G7P"wX}1T;]k

51Testing软件测试网PloS$qG2lw ?

使用该方法需要了解以下知识:51Testing软件测试网 CY[F Bs

51Testing软件测试网X ~ lM#l1i

1、excel 对象模型方法;

|$^No(@Q!p!R c#i051Testing软件测试网4YSb+r;I(h'f

2、 wscipt对象

Ak5w5s`|'FZ0

d5@e\9B4m03、RFT对第三方函数和文件的调用51Testing软件测试网'_!Rx'FN2d

p |uyC:\3[04、RFT(JAVA)获取VBS函数的返回值51Testing软件测试网&` nPcs@#Q

  • 代码实现
51Testing软件测试网,]t"G&m5m?

1、public function getRange(sheet):将excel sheet的名称做为参数传递进去,返回有数据的单元格区域51Testing软件测试网#Z!t*r2Nr$R:I5|

public Function getRange(sheet)'返回有数据的单元格区域的区域,要求开始单元格式必须为(a1)
4s T ^#e3b:tF8p0
    Dim m,n,rowcount,colcount
8oY[v ` X#f|\wB0    
For Each r In sheet.range("a1:a100")'目前只是将搜索范围限制在1000行以内
$v!R"[A8S3Rv Tzpyt0
        m = r.row51Testing软件测试网`+zm-N&tW7gA
        
If r <> "" Then
t3P6V4R`*p-]0            rowCount 
= m51Testing软件测试网1s1]h\1a!] Di
        
End If51Testing软件测试网ih_2L d
    
Next
,s1a$G4Yq0
'MsgBox "有数据的行数是"&rowcount51Testing软件测试网"N4^8l us
    For Each c In sheet.range("a1:z1")'搜索范围限制在a~z列之间
s1u+J#Y%y4zGKo0
        n = c.column51Testing软件测试网iC$H'i6G,y|r y
        
If c <> "" Then
v&l'xkayg-Qj0            colCount 
= n51Testing软件测试网4D*^%L.VV;N~:a
        
End If51Testing软件测试网'sn0pw,OM
    
Next
G:k4E8\,K:o%mn_0
'MsgBox "有数据的列数是"&colcount51Testing软件测试网j3C"S0qZ"~M
    getRange = "a1:"&sheet.cells(rowcount,colcount).address'返回有数据的单元格区域
.M6TD v2C0
End Function

6I+Gt^1i02、public function copyExcel(filenname,sheet):将excel文件路径和sheet传递进去,实现 excel复制粘贴的操作

"vP6k;k Mi8P:N"hf0
Public Function copyExcel(filename,sheet)'复制指定EXCEL中的数据,方法必须设置为public 的,如果设置为private的话,不能被调用51Testing软件测试网a]"_6A8jK
    '王云鹏2007-11-22修改,修正在复制EXCEL时,如果excel表数据表处于未打开状态时无法复制合并单元格,导致数据录入失败的问题.
FX4J+^:qR,oZ.Z)T0
    'Set excelobj = GetObject(filename)51Testing软件测试网J,wVu:ccS
    'Set sheets = excelObj.worksheets(sheet)51Testing软件测试网Zi(c'o,d`/`1jg)S
    Set excelobj = CreateObject("Excel.Application")51Testing软件测试网*W5sl^xl7yn(a
    
Set workbook = excelobj.Workbooks.Open(filename)51Testing软件测试网Rf2QY*w9pK'tT+o
    
Set sheets = workbook.Worksheets(sheet)51Testing软件测试网[)GCwY8i'b Z]g"H
    sheets.activate
'激活要复制的工作表51Testing软件测试网Lht!H Zq2m!j3a8F
    address = getRange(sheets)'得到要复制区域51Testing软件测试网FdL%x!m!P~L.C
    isCopy = sheets.range(address).copy'其实这里的返回值没有任何意义,只是为了调试用
?n%_G"P&B0W2c0
    '王云鹏2007-11-23修改,修正EXCEL打开没有关闭,造成测试机运行缓慢的问题
u(Ru[7{ V0
    '王云鹏2007-11-23修改,将关闭EXCEL的方法改写到pastevalue函数中,以解决复制单元格时丢失单元格格式的问题
\6|vqrfi5i!_0
    'workbook.Close'关闭excel51Testing软件测试网)L.g;`2gEwuym
    wscrīpt.sleep 2000
z%`I^8bfoo0    
Set ws = CreateObject("Wscrīpt.Shell")51Testing软件测试网uo(xdF0j b6j
    ws.AppActivate 
"兼容性测试-数据录入"'激活数据录入窗口,获取焦点
8e"~ e/f,j RT0
    ws.SendKeys "^v"51Testing软件测试网$@ FT6{}P ?
    wscrīpt.sleep 
100051Testing软件测试网a#jSwA5Xr
    excelobj.displayalerts
=false'excelobj是excel自动化对象模型里的顶级对象
[ n2O ^.@!tV0
    workbook.Close51Testing软件测试网6s7x}N5cD G
End Function
51Testing软件测试网sU0J%^ eg

3、public function setvalue(filename,sheetname):调用copyExcel方法,实现复制粘贴,并返回一个布尔值51Testing软件测试网#QXE\ V

Public Function setValue(filename,sheetname)'在IE表格中录入数据51Testing软件测试网G(gMYg0EPT
    Call copyExcel(filename,sheetname)
?!Y/DLo0    isdone 
= true
F1_\`1F)b h0
End Function

5e!Iucg04、在D盘根目录中新建一个ReadExcel_demo.vbs文件,编辑代码如下:51Testing软件测试网8H!mEX6m![c

filename = "d:\\测试数据表.xls"51Testing软件测试网1Z;Q0FF vfn1n/u!p
sheetname 
= "shee1"51Testing软件测试网]1L&r"}6zCu6Y
Set excelobj = CreateObject("Excel.application")51Testing软件测试网W*Lg]Q
Set workbook = excelobj.workbooks.open(filename)
r8xgja.~7j0
Set worksheet = workbook.worksheets(sheetname)
0TW0y IJCz0
Call setValue (filename,sheetname)

8QIx,K-Ocp e0编辑完成后,点击保存;51Testing软件测试网-Tbb Z%|0mF

51Testing软件测试网nmIsW s'Ha

4、在RFT中新增一个脚本文件,代码如下:

Q,y9nM1X0
package NewFolder1;51Testing软件测试网IW${*AV)}7\8w ~?
import resources.NewFolder1.scrīpt3Helper;
,{j$Ri,HV0
import com.rational.test.ft.*;51Testing软件测试网%a}2tCk-On j
import com.rational.test.ft.object.interfaces.*;
"ub{Y`0
import com.rational.test.ft.object.interfaces.SAP.*;51Testing软件测试网 uk \{j%rp
import com.rational.test.ft.object.interfaces.siebel.*;
1Ic8Nj5Z"S|c`0
import com.rational.test.ft.object.interfaces.flex.*;51Testing软件测试网P Z(PT2Y%m8I{0Q
import com.rational.test.ft.scrīpt.*;
9h$Qt*W%e!]6`0
import com.rational.test.ft.value.*;51Testing软件测试网(\7]a:H(~5D;r9?
import com.rational.test.ft.vp.*;51Testing软件测试网9o1x:j ^%t? ]U!j)\-I_

,y(N~GHM0
/**51Testing软件测试网4H8c%VFl/pC*m!X
 * Descrīption   : Functional Test scrīpt51Testing软件测试网/A.`^k.\:Xl7Y
 * 
@author Administrator51Testing软件测试网+yXMuqs)g
 
*/
51Testing软件测试网;H&i jo,]6|'R
public class scrīpt3 extends scrīpt3Helper51Testing软件测试网(s ?S1d1[ ~R1B$m
{
Y M:u4M5owz0    
/**51Testing软件测试网%x'q&s+`2HRL7P2[$cH
     * scrīpt Name   : <b>scrīpt3</b>
7|,Mj P.Y3^0     * Generated     : <b>2008-5-24 下午12:23:47</b>
xB9VO*T0     * Descrīption   : Functional Test scrīpt51Testing软件测试网 h/fiG-jc kcA
     * Original Host : WinNT Version 5.1  Build 2600 (S)
l HkE#DR/u0     * 51Testing软件测试网'J/X#G I0C3FK
     * 
@since  2008/05/24
3azY}J0     * 
@author Administrator
'AkV{5F I,Y0     
*/

jj7m9YLXA/s0    
public void testMain(Object[] args) 51Testing软件测试网 U,_'sf P
    
{
.kf&w.o;D5G6`6S }*t0        
        51Testing软件测试网;m&y0PVj\x _d0N6N
        
boolean isdone = false;
^w jA'{9D,O3c&h0                
   51Testing软件测试网j.meVm X%P7B`/a'Q
        
while(!isdone){
GOI%jE3M0            isdone 
= shellExecute("d:\ReadExcel_demo.vbs");//当setvalue方法执行完毕后,则结束循环
6~}^0r(i X7gbG0
            System.out.println(isdone);
_R"}8N?z0        }

XAy9naO'I0        51Testing软件测试网,|6u@%K#MG%P:n
    }
51Testing软件测试网dh#](T,p.w _@s

回放脚本即可看到效果。RFT会调用封装在VBS中的函数,从指定的excel中复制有数据的区域,并粘贴到被测系统的界面中。使用while循环的目的是为了实现RFT与VBS的同步:只有当VBS函数执行完毕时,RFT脚本的运行才结束。51Testing软件测试网|qf)Ta0]:kNF_

  • 总结

T \V`{\'NY0使用这样的方法进行自动化测试,让我有一种哭不出来的感觉:明明我们已经有了很强大的测试工具,结果又大费周折自己写函数实现。但是有什么办法呢,测试工具提供的手段都不能实现我的需求。就好象当年红军放弃城市攻坚而转入农村包围,不管用什么方法,能达到目的才是最主要的。51Testing软件测试网A#n]TuV N,o

51Testing软件测试网8D4U z'D'}4u\

setValue方法不是这个项目才创造的,上一个自动化测试项目中就已经大量使用了。我把它贴出来,一是希望能和自动化测试的同行们交流与讨论,另一方面是为了给自己做一下总结。

cANV%h}A5O$vF0Q0

*~ {g'p `+a6Rg0将JAVA和VBS结合能做到很多我们意想不到的事情,如果对这个论题感兴趣,需要进一步了解RFT的API和windows 的com技术。上次看到有人问:测试人员需要掌握哪些技术?我现在的回答是:掌握任何一门技术都会对你的测试工作大有裨益,因为测试本身就是一门综合性很强的学科。51Testing软件测试网8N-W5j0[P}$t


TAG: Rational

 

评分:0

我来说两句

Open Toolbar