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

  • 概述

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

  • 问题描述

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

利用RFT+VBS实现对表格控件的数据录入_第1张图片

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

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

  • 设计思路

1、要求被测系统必须支持界面的复制粘贴操作;

2、利用excel准备好表样和测试数据,要求表样必须与界面的表样一致;

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

4、RFT调用该VBS函数,将excel中的数据粘贴到被测系统的表格中。

注意,利用复制excel然后粘贴实现录入的做法并不是自动化测试的标准方法,利用对象属性识别单元格并进行数据录入才是王道

使用该方法需要了解以下知识:

1、excel 对象模型方法;

2、 wscipt对象

3、RFT对第三方函数和文件的调用

4、RFT(JAVA)获取VBS函数的返回值

  • 代码实现

1、public function getRange(sheet):将excel sheet的名称做为参数传递进去,返回有数据的单元格区域

public   Function  getRange(sheet) ' 返回有数据的单元格区域的区域,要求开始单元格式必须为(a1)
     Dim  m,n,rowcount,colcount
    
For   Each  r In sheet.range( " a1:a100 " ) ' 目前只是将搜索范围限制在1000行以内
        m  =  r.row
        
If  r  <>   ""   Then
            rowCount 
=  m
        
End   If
    
Next
' MsgBox "有数据的行数是"&rowcount
     For   Each  c In sheet.range( " a1:z1 " ) ' 搜索范围限制在a~z列之间
        n  =  c.column
        
If  c  <>   ""   Then
            colCount 
=  n
        
End   If
    
Next
' MsgBox "有数据的列数是"&colcount
    getRange  =   " a1: " & sheet.cells(rowcount,colcount).address ' 返回有数据的单元格区域
End Function

2、public function copyExcel(filenname,sheet):将excel文件路径和sheet传递进去,实现 excel复制粘贴的操作

Public   Function  copyExcel(filename,sheet) ' 复制指定EXCEL中的数据,方法必须设置为public 的,如果设置为private的话,不能被调用
     ' 王云鹏2007-11-22修改,修正在复制EXCEL时,如果excel表数据表处于未打开状态时无法复制合并单元格,导致数据录入失败的问题.
     ' Set excelobj = GetObject(filename)
     ' Set sheets = excelObj.worksheets(sheet)
     Set  excelobj  =   CreateObject ( " Excel.Application " )
    
Set  workbook  =  excelobj.Workbooks.Open(filename)
    
Set  sheets  =  workbook.Worksheets(sheet)
    sheets.activate
' 激活要复制的工作表
    address  =  getRange(sheets) ' 得到要复制区域
    isCopy  =  sheets.range(address).copy ' 其实这里的返回值没有任何意义,只是为了调试用
     ' 王云鹏2007-11-23修改,修正EXCEL打开没有关闭,造成测试机运行缓慢的问题
     ' 王云鹏2007-11-23修改,将关闭EXCEL的方法改写到pastevalue函数中,以解决复制单元格时丢失单元格格式的问题
     ' workbook.Close'关闭excel
    wscript.sleep  2000
    
Set  ws  =   CreateObject ( " WScript.Shell " )
    ws.AppActivate 
" 兼容性测试-数据录入 " ' 激活数据录入窗口,获取焦点
    ws.SendKeys  " ^v "
    wscript.sleep 
1000
    excelobj.displayalerts
= false ' excelobj是excel自动化对象模型里的顶级对象
    workbook.Close
End Function

3、public function setvalue(filename,sheetname):调用copyExcel方法,实现复制粘贴,并返回一个布尔值

Public   Function  setValue(filename,sheetname) ' 在IE表格中录入数据
     Call  copyExcel(filename,sheetname)
    isdone 
=   true
End Function

4、在D盘根目录中新建一个ReadExcel_demo.vbs文件,编辑代码如下:

filename  =   " d://测试数据表.xls "
sheetname 
=   " shee1 "
Set  excelobj  =   CreateObject ( " Excel.application " )
Set  workbook  =  excelobj.workbooks.open(filename)
Set  worksheet  =  workbook.worksheets(sheetname)
Call  setValue (filename,sheetname)

编辑完成后,点击保存;

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

package  NewFolder1;
import  resources.NewFolder1.Script3Helper;
import  com.rational.test.ft. * ;
import  com.rational.test.ft.object.interfaces. * ;
import  com.rational.test.ft.object.interfaces.SAP. * ;
import  com.rational.test.ft.object.interfaces.siebel. * ;
import  com.rational.test.ft.object.interfaces.flex. * ;
import  com.rational.test.ft.script. * ;
import  com.rational.test.ft.value. * ;
import  com.rational.test.ft.vp. * ;

/**
 * Description   : Functional Test Script
 * 
@author Administrator
 
*/

public   class  Script3  extends  Script3Helper
{
    
/**
     * Script Name   : <b>Script3</b>
     * Generated     : <b>2008-5-24 下午12:23:47</b>
     * Description   : Functional Test Script
     * Original Host : WinNT Version 5.1  Build 2600 (S)
     * 
     * 
@since  2008/05/24
     * 
@author Administrator
     
*/

    
public void testMain(Object[] args) 
    
{
        
        
        
boolean isdone = false;
                
   
        
while(!isdone){
            isdone 
= shellExecute("d:/ReadExcel_demo.vbs");//当setvalue方法执行完毕后,则结束循环
            System.out.println(isdone);
        }

        
    }

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

  • 总结

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

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

将JAVA和VBS结合能做到很多我们意想不到的事情,如果对这个论题感兴趣,需要进一步了解RFT的API和windows 的com技术。上次看到有人问:测试人员需要掌握哪些技术?我现在的回答是:掌握任何一门技术都会对你的测试工作大有裨益,因为测试本身就是一门综合性很强的学科。

你可能感兴趣的:(windows,function,测试,Excel,脚本,测试工具)