发布新日志

  • QTP 自定义COM组件的实现 activex dll篇

    2013-02-20 12:50:50

    自定义COM组件的实现 activex dll篇

    在上一章我们讲到了使用WSC向导生成WSC文件来创建自定义COM组件,并且实现在QTP中的调用

    今天来讲一下第二种方式,第二种方式其实说穿了就是在VB6里写好函数封装成DLL之后生成自定义COM组件。

    准备工作:下载VB6 ?网上有很多,也可以去这里下http://bbs.51testing.com/viewthread.php?tid=105570&highlight=%BE%AB%BC%F2%B0%E6

    1.装完之后,我们就可以开始打开VB6应用程序了,打开之后,选择ActiveX DLL,点击打开

    qtp-com-activex-dll

    qtp-com-activex-dll

    2.进入之后我们在脚本编辑的地方写两个简单的FUNCTION函数、

    qtp-com-activex-dll

    qtp-com-activex-dll

    3.修改右边的工程名和类名分别为: ? zzxxbb 和 operator

    qtp-com-activex-dll

    qtp-com-activex-dll

    4.点击左上角菜单栏的文件–》生成DLL

    qtp-com-activex-dll

    qtp-com-activex-dll

    5.生成完之后,如果你的QTP是 10.0以下的话,可以使用vbsedit直接在里边写好代码,然后黏贴进QTP

    因为VBSEDIT有代码提示,可以看到自己写的方法。

     

    6.上图的两个方法 就是我们之前写的 两个方法,然后我们写入方法,并运行

    qtp-com-activex-dll

    qtp-com-activex-dll

    运行结果为3,成功之后就可以把我们的脚本放入QTP之中运行了~

    如果你是QTP 10.0的话,可以不用VBSEDIT直接在QTP里写就会出现提示

    qtp-com-activex-dll

    qtp-com-activex-dll

    运行之后的结果也是一样

    qtp-com-activex-dll

    qtp-com-activex-dll

    qtp-com-activex-dll

    qtp-com-activex-dll

    注意事项:
    因为是本机生成的DLL,因此本机是自动注册DLL的,如果是要在别人的机器上调用这个DLL的话首先要注册一下这个DLL,然后就可以用了,注册方法:regsvr32 (DLL的路径) 比如:regsvr32 d:zzxxbb.dll


  • QTP自定义COM组件的实现 WSC篇

    2013-02-20 12:06:25

    by zzxxbb112 on 四月 22, 2011 with 0 Comments in QTP技巧展示

    在我们自动化测试中很常用的一个东西

    比如平时我们使用的scripting.filesystemobject,wscript.shell,excel.application等这些都是COM组件

    但其实我们不止可以调用这些COM组件,其实我们还可以自己开发COM组件来进行调用

    准备工作:

    首先我们需要下载一个WSC向导程序:windows script. component wizard(这个网上很多大家搜索一下就有了)

    =============== 实例 ===============

    1.下载完成后,打开程序,输入NAME为zzxxbb,并选择我们要生成WSC文件的路径,点NEXT

    qtp-com-wsc

    qtp-com-wsc

    2.这一步选择语言,我们这里就默认,点击NEXT

    qtp-com-wsc

    qtp-com-wsc

    3.这一步添加属性名和属性值的,也是默认,点击NEXT

    qtp-com-wsc

    qtp-com-wsc

    4.这一步是填写函数名和函数参数的,我们这里填入函数名:msg? 参数名:content,点击NEXT

    qtp-com-wsc

    qtp-com-wsc

    5.一直NEXT,最后点击FINISH,完成WSC的向导,成功在对应的路径生成了WSC文件

    qtp-com-wsc

    qtp-com-wsc

    6.点击确定后,找到生成的WSC文件双击打开后

    qtp-com-wsc

    qtp-com-wsc

    7.对此文件中的MSG方法进行修改,把原来的语句注释掉,添加”msgbox content”

    qtp-com-wsc

    qtp-com-wsc

    8.添加完保存文件并关闭,我们右键点击我们之前生成的WSC文件选择注册

    qtp-com-wsc

    qtp-com-wsc

    9.注册完之后我们自己开发的COM组件就成功完成了并导入注册表了,接下来就可以通过QTP来调用它了。

    qtp-com-wsc

    qtp-com-wsc

    10.输入以上代码之后,我们就可以成功执行刚才我们写的那个函数了,回放之后弹出消息框

    qtp-com-wsc

    qtp-com-wsc

    这样一个COM组件就已经生成并已经能够成功调用了~

    其实我们平时可以把经常需要使用的方法都注册进COM里,以后就可以直接使用这些方法来调用了

    总结:

    1. COM组件有很多种我们可以下载一个VBSEDIT进行查阅

    查阅方法,打开VBSEDIT之后,点击菜单栏的TOOLS–REFERENCE–ADD,打开下拉框就全部出来了

    2.自定义COM组件的方法不止这一种,还有一种方法通过VB6生成ACTIVEX DLL来生成COM组件

    这个会在下一章讲解,个人比较推荐后一种


  • Selenium 介绍

    2011-04-11 14:51:31

    Selenium 

    严格说来,Selenium是一套完整的Web应用程序测试系统,它包含了测试的录制(Selenium IDE)、编写及运行(Selenium Remote Control)和测试的并行处理(Selenium Grid)。Selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此可运行于任何支持JavaScript的浏览器上。Selenium Core由一种指定格式的HTML文件驱动,在一定程度上增强了测试套件(Test Suite)的可读性。Selenium Remote Control允许测试人员使用常见的语言(自然包括C#等.NET语言)编写测试代码,并支持不同操作系统下的各种主流浏览器。Selenium Grid的作用是将测试分发至多台机器,这样便可大大加快测试速度。与WatiN相同,Selenium也是一款同样使用Apache License 2.0协议发布的开源框架。  

     

    Selenium IDE 
           Selenium IDE是基于FIREFOX浏览器的一个插件,提供GUI界面来运行Selenium测试。Selenium IDE提供脚本录制功能,可以将用户在浏览器中执行的操作记录下来,生成各种形式的脚本,可以将这些脚本保存供以后使用。 
           安装Selenium IDE的步骤如下: 
        * 从www.openqa.org/selenium-ide/download.action下载Selenimu IDE(一个XPI后缀的文件)。 
        * 启动FIREFOX浏览器,打开刚才下载的文件。 
        * 重启FIREFOX浏览器,在工具菜条下应该就可以看到Selenium IDE菜单项 

     

    --------------------------------------------------------------------------------------------------------- 

    一 Selenium-RC 是 selenium-remote control 缩写,是使用具体的语言来编写测试类。
    二 准备工作: 1,下载 selenium 了,到 http://www.openqa.org/selenium/ 下载就可以了,记得选择selenium-rc 的版本 
                 2, 学习一下xpath 的知识。有个教程:http://www.zvon.org/xxl/XPathTutorial/General_chi/examples.html 
                 3, 安装 jdk1.5 


    三 selenium-rc 一些使用方法 
        1,解压selenium-rc压缩包 
        2,启动服务器  
            Selenium Server是用JAVA实现的,相应的库文件在HOME/server/selenium-server.jar。运行如下代码从命令行启动: 
           java 代码 : java -jar selunium-server.jar 


    四   编写测试用例 
        需要的JAR: selenium-java-client-driver.jar;junit 
        编写一个JUNIT的单元测试,要构建一个Selenium,包括如下步骤: 
        * 构建一个Selenium实例 
        * 启动Selenium实例 
        * 执行Selenium命令,并验证结果。 
        * 关闭Selenium实例 

    如下是一个示例,用来测试http://www.google.com/,查找selenium,期望结果中包含"OpenQA: Selenium" 
      代码

    package com.thoughtworks.selenium;      
    import junit.framework.*;   
    import org.openqa.selenium.server.*;   
    public class GoogleTest extends TestCase   
     {   
        
    private Selenium selenium;   
        
    public void setUp() throws Exception {   
             String url 
    = "http://www.google.com";   
             selenium 
    = new DefaultSelenium("localhost", SeleniumServer.getDefaultPort(), "*firefox", url);   
             selenium.start();   
        }   
             
        
    protected void tearDown() throws Exception {   
              selenium.stop();   
        }   
             
        
    public void testGoogleTestSearch() throws Throwable {   
              selenium.open(
    "/intl/zh-CN/");   
              selenium.type(
    "q""selenium");   
              selenium.click(
    "btnG");   
              selenium.waitForPageToLoad(
    "30000");   
              assertEquals(
    "selenium - Google 搜索", selenium.getTitle());        
           } 
      }    

     


    五 多环境测试 
     
     代码

     

     
     

    六 如何选取元素   selenium提供如下强大的定位元素的方法。    * id=id    * name=name    * dom=javascriptExpression    * xpath=xpathExpression    * link=textPattern    * css=cssSelectorSyntax1 通过ID,name选择元素  :  如 selenium.type("id=q","百度"); selenium.type("name=search","百度")2 link= 根据链接文字来操作:如 selenium.click("link=个人资料");3 根据XPath来选择元素  : XPath Checker    * xpath=//img[@alt='The image alt text']    * xpath=//table[@id='table1']//tr[4]/td[2]    * xpath=//a[contains(@href,'#id1')]    * xpath=//a[contains(@href,'#id1')]/@class    * xpath=(//table[@class='stylee'])//th[text()='theHeaderText']/../td    * xpath=//input[@name='name2' and @value='yes']    * xpath=//*[text()="right"]      如: selenium.type("xpath=//input[@name='user.email']", "xxx@123.com"); // 向input中type为text的栏位键入信息          selenium.check("xpath=//input[(@name='user.sex')and(@value='男')]");// 向input中type为radiod的 选取4 dom选择    * dom=document.forms['myForm'].myDropdown    * dom=document.images[56]    * dom=function foo() { return document.links[1]; }; foo();5 css选择器这个不常用,它可以支持css2, css3选择器    * css=a[href="#id3"]    * css=span#firstChild + span七 使用selenium 这个对象来进行测试1  获取标 : assertEquals("Insert title here", selenium.getTitle());2  判断页面是否存在一个user.email元素  :assertTrue(selenium.isElementPresent("xpath=//input[@name='user.email']"));3  得到文本框里的文字:   assertEquals(selenium.getValue("xpath=//input[@name='user.username']"),"xxxaas");4  测试check box  :    assertTrue(selenium.isChecked("xpath=//input[(@name='user.sex')and(@value='男')]"));5  点击提交按钮   : selenium.click("xpath=//input[@type='button']");6  等待页面载入   : selenium.waitForPageToLoad("2000");7  验证指定文本出现在提交给用户的页面上: assertTrue(selenium.isTextPresent("验证码输入有误,请核实后再输入"));8  判断下拉框里选择了哪个选项 :assertEquals(selenium.getSelectedIndex("xpath=//SELECT[@name='HATIMING']"), "1"); 9  如何测试一些错误消息的显示? assertTrue(selenium.getBodyText().indexOf("错误消息")>=0);    getBodyText 返回的时浏览器页面上的文字,不回包含html 代码的,如果要显示html 代码,用下面这个:selenium.getHtmlSource(); 

    八   Firefox 的插件     1 XPath Checker :可以用这个工具测试简化我们的xpath表达式     2 Firebug     3 Selenium IDE     4 Execute JS

  • Selenium入门

    2011-04-11 14:46:47

    Selenium简介:
        Selenium 是 Thoughtworks公司的一个集成测试的强大工具。Selenium 是 ThoughtWorks 专门为 Web 应用程序编写的一个验收测试工具。与其他测试工具相比,使用 Selenium 的最大好处是: Selenium 测试直接在浏览器中运行,就像真实用户所做的一样。Selenium 测试可以在 Windows、Linux 和 MacintoshAnd 上的 Internet Explorer、Mozilla 和 Firefox 中运行。其他测试工具都不能覆盖如此多的平台。
      Selenium 不同于一般的测试工具。一般的脚本测试工具录制脚本,实际上都是通过拦截浏览器收发的http 请求来实现的。事实上并没有办法录制用户对html 页面的操作。Selenium 的脚本录制工具是通过监听用户对html 页面的操作来录制脚本的。Selenium是真正能够监听用户对html 页面的操作的录制工具。Selenium 完全了解用户操作的html 页面。
    selenium原理:
    SeleniumServer 通过网络与Selenium 客户端通讯,接收Selenium 测试指令。
    SeleniumServer 通过向浏览器发出JavaScript. 调用实现对Html 页面的全面追踪,并通过网络把执行结果返回给Selenium 客户端。
    Selenium 客户端一般使用单元测试技术实现,通过判断返回的结果与预期是否一致来决定程序是否运行正确。
    Selenium 是通过javascript. 来实现对Html 页面的操作的。它提供了丰富的指定Html 页面元素和操作页面元素的方法。
    Selenium 打开浏览器时,把自己的JavaScript. 文件嵌入网页中。然后Selenium 的网页通过frame. 嵌入目标网页。这样,就可以使用Selenium 的JavaScript. 对象来控制目标网页。
    Selenium 的JavaScript. 对象中,最重要的就是Selenium 对象。它的作用是代表Java 中的Selenium 接口执行一系列的命令,让浏览器执行。

    好,下面进入正题!
    Selenium 的版本
    Selenium 现在存在2个版本,一个叫 selenium-core, 一个叫selenium-rc 。
    selenium-core 是使用HTML的方式来编写测试脚本,你也可以使用 Selenium-IDE来录制脚本,但是目前Selenium-IDE只有 FireFox 版本。
    Selenium-RC 是 selenium-remote control 缩写,是使用具体的语言来编写测试类。
    selenium-rc 支持的语言非常多,这里我们着重关注java的方式。这里讲的也主要是 selenium-rc,我们这里主要讲解selenium-rc方式。
    准备工作:
    1、 下载selenium-rc的压缩包,地址:http://seleniumhq.org/download/,将其解压缩到D:\selenium下。
    2、 开发工具eclipse\myeclipse
    3、 Jdk 1.5以上
    4、 学习一下xpath的知识。
    使用步骤:
    1、 在dos环境下进入selenium-server所在目录,运行命令:
    java -jar selenium-server.jar,如出以下画面则说明成功

    2、 启动eclipse,新建一个web工程,在工程中添加.jar文件,选择工程,鼠标右键—>Build path—>configure build path—>Libraries—>add external jars—>选择 selenium-java-client-driver 文件夹下的全部jar文件。
    另外点击 add library,选择Junit,点击next 选择Junit的版本 ,点击ok完成部署。
    3、 在工程下添加一个测试类。其代码如下:
    package selenium;

    import junit.framework.TestCase;

    import com.thoughtworks.selenium.DefaultSelenium;
    import com.thoughtworks.selenium.Selenium;

    public class SeleniumTest extends TestCase {

    private Selenium ss;

    @Override
    protected void setUp() throws Exception {
    ss = new DefaultSelenium("localhost", 4444, "iexplore",
    "http://www.google.com/");
    ss.start();
    }

    public void testSelenium() {
    ss.open("http://www.google.com/");
    ss.type("q", "hello world");
    ss.click("btnG");
    ss.waitForPageToLoad("5000");
    }

    @Override
    protected void tearDown() throws Exception {
    ss.stop();
    }

    }
    点击运行你就会看到selenium自动打开一个网页,输入Google的网址,再在Google的输入框中输入hello world关键字,点击查询按钮,不一会就会出现查询的结果,跟人的行为一样。
     
  • QTP讨论会记录

    2011-02-17 16:50:21

    1、主控调用的function中只能有一个参数,非主控调用的function可以多个参数

    2、关联VBS文件

    setting 中环境变量设置中 testdir

    A:获取环境变量“testDir”的方法

    testPath=Environment.Value("TestDir")

    B:动态加载VBS文件

    executefile logVbs

    logVbs=testpath&(或+)“\log.vbs”

     

  • QTP编码讨论会内容

    2011-02-17 16:48:41

    内容记录:

    1 为什么被主action调用的function参数只能是唯一的sheetName

      解答:自动化测试框架采用的是循环读取测试用例文件,并执行测试用例。这就要求所有组成测试用例的数据必须保持一致。

    测试用例文件表形式大致如下:

    其他判断标识等.........

    functionName

    Function所在的vbs

    Function所需数据对应的sheet

    其他说明(例如function功能说明等)........

     

     

     

     

     

     

    2 为什么function所需数据必须在调用function时必须已经导入完毕

      解答:参考问题1,为了保证后续的集成,function所需数据必须已知,对于function需要导出到外部的数据,是属于function自身的功能。

    3 function所需数据存储的excel文件为什么一定要使用相对路径方法?

      解答:测试规范中已经定义了工程目录的组织结构,在不改变工程目录的情况下,需要做到工程目录存储在任何位置脚本都可以正确执行,为此工程目录的存储位置只能动态获取。

    4 function所在的vbs文件为什么不能直接关联脚本,一定要动态加载。

      解答:参考问题3

    需要注意的是用于支撑框架的vbs文件是需要直接关联到脚本的。比如我们目前用户获取父路径方法所在的vbs文件。

    5 收集脚本开发过程中遇到的问题,并给予解答

      :她的function所需数据源自多个sheet表,最初的想法是增加function参数个数。

      解答:她的方法与要求不符,修改办法是建立主sheet表,其他协同工作的数据表放到主表中,协同工作的表中的数据因不会在测试用例中出现,所以协同工作的表格数据应在function内部进行处理。

     

    代码参考:

    '获取环境变量“testDir”的方法

    testPath=Environment.Value("TestDir")

    '组成完整文件路径的方法

    myLogVbs=testPath&"log.vbs"

    myLog=testPath&"log.txt"

    '动态加载vbs文件的方法

    Executefile myLogVbs

    注意事项:Executefile命令不能识别unicode格式的文件,而QTP自动存储的vbs文件恰恰是unicode格式的,所有要使用其他文本工具将vbs文件转换为非unicode格式,调试过程中如果报“非法字符”,多数为文件格式导致。

  • 转 QTP实用函数(包括WEBTABLE等)

    2010-12-28 15:34:43

    QTP实用函数(包括WEBTABLE等)


    DTParameter对象指的是运行时DataTable Sheet中的列对象。
    注意:所有应用于DTParameter对象的方法仅适用于run-time DataTable对象。所有对run-time DataTable对象的改变只影响测试结果,不影响design-time Data Table。
     
    1.     Property
    ??        Name
    描述
    返回run-time Data Table的列名。
    语法
    DTParameter.Name
    示例
    下面的例子使用“Name”方法返回run-time Data Table中新创建的列的名称,并将列名写入Report。
    Dim paramname
    paramname = DataTable.LocalSheet.AddParameter("Food", "pizza").Name
    Reporter.ReportEvent 1, "The New Parameter name is", paramname
    ??        RawValue
    描述
    获取当前行指定列所对应的单元格的原始数据。原始数据是尚未计算处理过的数据,如单元格中的公式内容等。
    语法
    DTParameter.RawValue
    本语法与DataTable.RawValueParameterID[,SheetID]用途是一样的,但是使用方法不同。
    示例
    下面的例子使用RawValue属性来获取run-time Data Table的“ActionA”表“Date”列的当前行所对应的单元格中的公式。本例中的返回值应该是“=Now()“。
    FormulaVal=DataTable.GetSheet("ActionA").GetParameter("Date").RawValue
    ??        Value
    描述
    这个属性是列对象的默认属性。获取或设置列的当前行所对应的单元格的数据。
    注意:这个方法返回的数据是计算后的数据。假如单元格中包括公式,则这个方法返回True或False。
    语法
    获取单元格数据:
    DTParameter.Value or DTParameter
    设置单元格数据:
    DTParameter.Value=newvalueor DTParameter=newvalue
    示例
    下面的例子使用Value来设置Sheet“ActionA”的“Destination”列的当前行所对应的单元格的数据。
    DataTable.GetSheet("ActionA").GetParameter("Destination").Value="New York"
    注意:可以省略本语句中的“Value”,因为Value是DTParameter的默认属性。
    ??        ValueByRow
    描述
    获取指定列指定行所对应的单元格的数据。
    语法
    DTParameter.ValueByRow(RowNum)
    Argument
    Type
    Descrīption
    RowNum
    Number
    指定行号。行号从1开始。
    示例
    下面的例子使用“ValueByRow”来获得表“ActionA”的“Destination”列的第4行数据。
    DataTable.GetSheet("ActionA").GetParameter("Destination").ValueByRow(4)

     1.GetCellData函数
     作用:获取单元格的值
     例: rowCount = Browser("xxx ").Page("xxx ").Frame("xxx").WebTable("xxx").RowCount
    For counter = 1 To rowCount
     text = Browser("xxx").Page("xxx").Frame("xxx").WebTable("xxx").GetCellData(counter,1)
     If (text = "xxx") Then
        counter = counter - 1
        selectNO = "#" & counter
        Browser("xxx").Page("xxx").Frame("xxx").WebRadioGroup("xxx").Select selectNO
        Exit For
     End If
    Next
     
    2.把值插入datatable里
     例:   datatable.setcurrentrow(i)
            datatable.value("name","Global")="name"
            datatable.value("passwd","Global")="passwd"
     
    3.用代码来启动浏览器
     Browser1 = "IE"
     StartURL = "www.51testing.com"
     IF Browser1 = "IE" THEN
         set IE = CreateObject("InternetExplorer.Application")
         IE.Visible = true
         IE.Navigate StartURL
     END IF
     
     
    4.ExecuteFile函数
     作用:ExecuteFile 可以直接执行vbs文件,而不需要将其导入resource中
           ExecuteFile FileName
     说明:where FileName is the absolute or relative path of your VBscrīpt file.
     
     例:ExecuteFile("F:"test.vbs")
     
    5.Strcomp函数
     作用:比较文本
     例:dim strtext1,strtext2,str ,str1,comp1
         strtext1 = "xxx"
         strtext2 = "xxx"
         str = VbWindow("xxx").VbWindow("xxx").VbLabe1("xxx").GetTOProperty("text")
         str1= VbWindow("xxx").VbWindow("xxx").VbLabel("xxx").GetTOProperty("text")
         comp1=strcomp(strtext1,str,0)
         If comp=0 Then
              msgbox “这两个串相等”
         else
           msgbox str
         End If
     
    6.CaptureBitmap
     作用:捕获屏幕
     
    7. GetROProperty
     作用:取对象属性值
     例:VbWindow("xxx").VbWindow("xxx").VbWindow("xxx").ActiveX("xxx").GetROProperty("TextMatrix(1,0)") 
     
    8.ExitAction - 退出当前操作,无论其循环属性如何。
     ExitActionIteration - 退出操作的当前循环。
     ExitRun - 退出测试,无论其循环属性如何。
     ExitGlobalIteration - 退出当前全局循环。
     
     
    9.如何使用Excel对象处理数据?
     Dim xl
     打开excel文件
     Function OpenExcelFile(strFilePath)
     Set xl = CreateObject("Excel.Application")
     xl.Workbooks.Open strFilePath
     End Function
     获得指定单元格数据
     Function GetCellData(strSheet,rwIndex,colIndex)
     GetCellData = xl.WorkSheets(strSheet).Cells(rwIndex,colIndex)
     End Function
     填充单元格数据
     Function PutCellData(strSheet,rwIndex,colIndex,varData)
     xl.WorkSheets(strSheet).Cells(rwIndex,colIndex) = varData
     End Function
     保存并推出
     Function SaveAndQuit()
     xl.Activeworkbook.save
     xl.Quit
     Set xl = nothing
     End Function
     
    10.连接sql数据库
     例:Dim res,cmd,sql
         Set Res=createobject("adodb.recordset")
         Set Cmd=createobject("adodb.command")
         Cmd.activeconnection="Provider=SQLOLEDB.1;Password=111111;Persist Security Info=True;User ID=sa;Initial Catalog=xhq;Data Source=192.168.191.142"  ’这句话是连接数据库的数据源,要做修改
        Cmd.CommandType = 1
        sql="selec t * from 表 where name=username"
        Cmd.CommandText = sql
        Set res = Cmd.Execute()
        Set res = nothing
        Set cmd.ActiveConnection = nothing
    Set Cmd= nothing
     
    11 检查页面是否存在
    对象exist可以检查某一个页面是否存在。
    代码:
    if Browser("…").Page(“…").Exist then
    ‘在运行结果中显示的报告, “micPass”的状态是通过, micFail是不通过
       reporter.ReportEvent micPass ,“页面存在“,”通过“ 
       else
       reporter.ReportEvent micFail ,"页面不存在“,"不通过"
    end if

    12 防止程序中断的方法
    在回放脚本的时候,有时因为错误导致运行的脚本中断,不能自动运行。为了能达到真正无人职守的状态可以在脚本的最前面加上如下的代码:
    On error resume next  ‘遇到错误返回到脚本的下一行继续执行。
    On error goto 0 ‘错误处理的控制权,平时是由QTP控制的(这个叫默认的),当有on error resume next 时,是交给on error处理,当on error goto 0时,就换给QTP

    13 同步点的设定
    等待某一对象出现后继续执行,为了防止qtp找不到对象而设定同步点。有2种方法:1种是用wait加等待的时间,如wait 5(qtp等待5秒钟后继续执行)。另一种方法是等待要执行对象的出现,如果出现就继续执行,否则一直等待,代码如下:
    y=......waitproperty("visible",true,10000)
    If y=true then
       ‘执行下一条语句
       else
        ’对象不出现就一直等待,直到过了10000秒后程序找不到对象报错
    End if

    14 截屏
    在优化脚本时,如果想查看某一页面在执行后的页面效果,可以采取截屏的办法截取当前的操作页面并保存到本地。代码:
        desktop. capturebitmap “c:"***.bmp“,ture     ’在脚本中想要查看的一行插入,运行后图片保存到设置的路径下

    15 导入execl文件并参数化数据方法
    Qtp自带了datatable表,可以把要参数化的数据写在里面,但这样写脚本和数据不能分离,后期不好维护脚本。现在采用从外部导入execl文件的方法导入数据。代码如下:
       datatable.ImportSheet “D:"..."data.xls”,“sheet1”,“global“
       ‘第一个参数是要导入文件的路径,第二个是execl的第一个表格,第三个参数是在execl的全局范围内查找
       另外datatable对象还有很多操作,比如:获取表中字段的行数,插入表数据,删除数据等,下面是获取表中数据的代码:datatable("A","dtglobalsheet)

    16 为描述性编程自动创建注释
       当希望在每一个新建action时都增加一些头部说明,比如作者、创建日期、说明等信息,那么用action template 来实现最简单快捷。 方法:用记事本等文本编辑器,输入如下类似的内容:           'Company:东方般若            'Date: Date          然后将文件保存为ActionTemplate.mst,并存放到QTP安装目录下的dat目录。

    17 导入vbs文件
    想要实现脚本的函数化,并更好的维护它,可以把一些公用的函数写到vbs里面,用qtp来调用它。
    实现调用vbs的方法有2种:
    1.函数executefile加vbs文件的路径
      executefile “c:"..."funcation.vbs”
    2.设置QTP test/settings/resources/+函数目录

    18 时间差函数
    统计两个日期时间段之间的间隔,还有多少小时
    Dim timediff
    timediff=datediff(“H”,now,“2008-8-8” )
    Print timediff

    19 获取web下拉框中数据的行数和数据值
    1.获取行数:首先将webtable添加到对象库中,查看对象库里有该webtable的属性后
    count=Browser("…").Page("Page").Frame("…").WebTable("...").RowCount
       Msgbox count ‘查看行数
    2.获取数据值,
       for i=1 to  count   
    value=Browser("…").Page("Page").Frame("…").WebTable("...").getcelldata(i,1)
       msgbox value
       next
    获取到列表中的数值后,qtp的对象库中没有这个WebElement的对象,一般采用描述性编程的方法获取对象,比如:用getcelldata获取的表中数据的innertext属性是“普通岗”,那么就可以用如下代码:
    for i=1 to  count   
       value=Browser("…").Page("Page").Frame("…").WebTable("...").getcelldata(i,1)
     
       Browser(“…”).Page(“Page”).Frame(“…”). WebElement(“innertext:=“&value,”index:=1”).click
    next

    20 对象获得焦点
    判断某个webedit输入框是否获取了焦点,如果没有获取就给它焦点,然后输入数值。代码如下:

    if not browser("**").page(“**").webedit(“
    **").object.isdisabled  then
             .object.focus
             .object.set "输入数值“

    21 获取对象当前属性值
    用GetROProperty可以获取对象的当前属性值,比如一些对象的属性经常发生变化,用getroproterty就能定位对象当前的属性状态来执行相应的操作。
    Dim pro
    pro= browser("**").page(“**").webedit(“
      **“). GetROProperty(“property”,value)
    Msgbox pro ‘弹出窗口,查看获取的属性。

    22 Systemutil对象的应用
    利用systemutil可以实现的功能:回放qtp脚本时禁止鼠标和键盘的输入;打开应用程序或web;通过句柄关闭进程;通过进程名关闭进程等。下面的代码是打开百度网页:
      systemutil.run “iexplore.exe”,“http://www.baidu.com”,“”,“”,“”,3        ‘打开百度的首页,最后面的参数“3” 代表打开ie后最大化

       SystemUtil.CloseProcessByName(“iexplore.exe”)      ‘关闭ie

      
    23 Action的使用
    action分为内部调用和外部调用2种方法:内部调用使用split划分;外部调用时被调用的action设置成share,并共享对象库。
       split action:RunAction "action", oneIteration

    24.  随机数
    在测试中有时会用到随即数,有多种方法:
    第一种 :n=randomnumber.value(1,255)  ’n的值从1到255之间随即产生
    第二种 :randomize      ‘更新反回的数据          dim n
                 n=int (10*rnd())
                 msgbox n        ‘n为10以内的整数


    25 “is+*”类型功能
       isarray'是否是数组 isconnected'判断QTP是否连接到TD isdate'是否是合法的日期类型 isempty'判断是否初始化 isNull'判断是否为空值 isNumeric'判断是否是数字型 isobject'判断是否一个功能对象 isready'判断设备是否准备就绪 isRootFolder'是否是根目录

    26 对象库
    打开对象库resources->object repository,或者用快捷方式:ctrl+r来打开。
    1.Qtp中的对象库和脚本是一一对应的,如果脚本中某个对象在对象库中不存在,则无法回放成功,会提示找不到对象。
    2.对无法识别的对象用spy工具获得后添加到对象库中。
    3.有时候脚本回放失败就是找不到对象的原因,可以通过用spy工具查看找不到对象的属性,然后打开对象库,比较二者的属性信息,如果属性有不相同的说明就是属性的原因,可以通过更改属性的方式统一对象属性。

    27 调试脚本
    1.脚本编写完毕,可以用按ctrl+f7来查看脚本是否有语法错误。
    2. Msgbox和print:在回放脚本时可以方便的查看自己想看到的信息。
    3.设置断点:为了测试某一小段脚本的功能,而当整个action很长的时
    候,可以设置断点单步debug。

    28 强制退出
    遇到问题退出可以用exittest或 exit for,例如下面代码:
    Public function text_exit()
         for i=0 to 10
                if i=3 then
                    exittest
                    ‘exit for
                end if
         next
    End function

    Text_exit()
         
    29 连接数据库_增删改
    Dim conn,strSql    '定义变量
    set conn = CreateObject("ADODB.Connection")   '创建连接
    conn.ConnectionString="Provider=SQLOLEDB.1;Password=isaac121379;Persist Security Info=True;User ID=sa;Initial Catalog=WisdomCRM;Data source=192.168.12.29"   '设置连接字符串
    conn.open  '开启连接
    'strSql="insert into UM_User  values(1,'UserID')"  '设置插入语句
    strSql="drop  table TM_Task_14_Target"
    'strSql="select *  from UM_User"

    If conn.state=0 Then   '如果连接状态为0,表示连接失败,写入reporter对象中,否则表示连接成功
        Reporter.ReportEvent micFail,"testing","数据库连接失败"
        conn.close
        Set conn = nothing
    else
       Reporter.ReportEvent micPass,"testing","数据库连接成功"
       conn.execute strSql    '执行更新语句
       conn.close
       Set conn = nothing
    End If

    30 连接数据库_查
    Dim conn,res,strSql    '定义变量
    set conn = CreateObject("ADODB.Connection")   '创建连接
    conn.ConnectionString="Provider=SQLOLEDB.1;Password=isaac121379;Persist Security Info=True;User ID=sa;Initial Catalog=WisdomCRM;Data source=192.168.12.29"  '设置连接字符串
    conn.open  '开启连接
    Set res = CreateObject("ADODB.RecordSet")   '创建一个记录集对象
    strSql="select * from UM_User"  '设置查询雨具
    If conn.state=0 Then   '如果连接状态为0,表示连接失败,写入reporter对象中,否则表示连接成功
        Reporter.ReportEvent micFail,"testing","数据库连接失败"
        res.close                               '关闭结果集和连接,并且置为空
        Set res = nothing
        conn.close
        Set conn = nothing
    else
       Reporter.ReportEvent micPass,"testing","数据库连接成功"
       res.open strSql,conn    '执行查询语句
       res.MoveFirst        '将记录集游标指到记录集的最开始
       Do
          Reporter.ReportEvent micPass,"file",cstr(res(0))+" : "+cstr(res(1))  '循环遍历查询结果,并且保持到reproter对象中,直到记录集到达末尾,循环结束
          res.MoveNext
       Loop until res.eof = true
       res.close
       Set res = nothing
       conn.close
       Set conn = nothing
    End If
    低级录制
    在无法识别对象时使用
    利用Vbs运行外部程序
    WSH也就是用来解析Vbs的宿主,本身包含了几个个常用对象:
    1、scrīpting.FileSystemObject  —>  提供一整套文件系统操作函数
    2、scrīpting.Dictionary  —>  用来返回存放键值对的字典对象
    3、Wscrīpt.Shell  —>  提供一套读取系统信息的函数,如读写注册表、查找指定文件的路径、读取DOS环境变量,读取链接中的设置
    4、Wscrīpt.NetWork  —>
    提供网络连接和远程打印机管理的函数。(其中,所有scrīpting对象都存放在SCRRUN.DLL文件中,所有的Wscrīpt对象都存放在WSHOM.ocx文件中。)
    现在我们需要的是第三个对象,好了,让我们先连接一下对象看看,在记事本的编辑窗口中输入:
    Set ōbjShell = CreateObject(“Wscrīpt.Shell”)
    objShell.Run “notepad”
    Objshell.run “calc”

    自建日志
    Public Sub logfile(message)
    Const ForReading = 1, ForWriting = 2, ForAppending = 8
    Dim fileSystemObj, fileSpec
    Dim currentTime
    currentDate = Date
    currentTime = Time
    testName = "log"
    Set fileSystemObj = CreateObject("scrīpting.FileSystemObject")
    fileSpec ="f:"log.txt"
    If Not (fileSystemObj.FileExists(filespec)) Then
    Set logFile = fileSystemObj.CreateTextFile(fileSpec, ForWriting, True)
    logFile.WriteLine("###############################################")
    logFile.WriteLine (currentDate & currentTime & " Test: " & environment.Value("TestName") )
    logFile.WriteLin("######################################")
    logFile.Close
    Set logFile = Nothing
    End If
    Set logFile = fileSystemObj.OpenTextFile(fileSpec, ForAppending, False, True)
    logFile.WriteLine (currentDate & " "& currentTime & " " & message)
    logFile.Close
    Set logFile = Nothing
    Set fileSystemObj = Nothing
    End Sub
    logfile(“ok")
    Vb6生成dll
    Environment对象
    检查页面文字显示颜色
    Set Elements = Browser(“WisdomCRM客户关系管理系统”).Object.Document.all.tags(“div”)’tags(“td”)为在td中检查
    For each Element in Elements
      If Element.InnerText="执行团队" Then
        strhtml=Element.Innerhtml
        n=instr(strhtml,"color=red")
        If n=0 Then
          msgbox "Text color is red!"
       exit for
        End If
      End If
    Next
    关闭重复的页面
    Dim loginwin
    Set loginwin = descrīption.Create()                               '创建对象名为loginwin的对象
    loginwin( "name").value="WisdomCRM客户关系管理系统"   '对象属性及值

    Set child=desktop.ChildObjects (loginwin)
    cout=child.count
    msgbox cout
    For i=1 to cout
       child(i-1).close  '循环寻找这个对象
    Next
    获取当前测试的路径
    Path = environment("TestDir")'获取当前测试的路径
    msgbox path
    获取本机ip
    set IPConfigSet = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery _
    ("select IPAddress from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")

    for each IPConfig in IPConfigSet
    if Not IsNull(IPConfig.IPAddress) then
    for i=LBound(IPConfig.IPAddress) to UBound(IPConfig.IPAddress)
    Msgbox IPConfig.IPAddress(i)
    next
    end if
    next
    点亮对象
    highlight
    fireEvent用法
    针对Link对象,onmouseover时间, 还有onchange, onclick, ondblclick, onblur, onfocus, onmousedown, onmouseup, onmouseout, onsubmit, onreset, onpropertychange事件可以使用
    sendkeys实例
    Set wshshell=createobject(“wscrīpt.shell”)
    其使用格式为:object.SendKeys string “object”:表示WshShell对象 “string”:表示要发送的按键指令字符串,需要放在英文双引号中。 1.基本键   一般来说,要发送的按键指令都可以直接用该按键字符本身来表示,例如要发送字母“x”,使用“WshShell.SendKeys "x"”即可。当然,也可直接发送多个按键指令,只需要将按键字符按顺序排列在一起即可,例如,要发送按键“happy”,可以使用“WshShell.SendKeys "happy"”。
    sendkeys实例
    2.特殊功能键 对于需要与Shift、Ctrl、Alt三个控制键组合的按键,SendKeys使用特殊字符来表示: Shift---------WshShell.SendKeys "+" Ctrl---------WshShell.SendKeys "^" Alt---------WshShell.SendKeys "%" 由于“+”、“^”这些字符用来表示特殊的控制按键了,如何表示这些按键呢? 只要用大括号括住这些字符即可。例如: 要发送加号“+”,可使用“WshShell.SendKeys "{+}"” 另外对于一些不会生成字符的控制功能按键,也同样需要使用大括号括起来按键的名称,例如要发送回车键,需要用“WshShell.SendKeys "{ENTER}"”表示,发送向下的方向键用“WshShell.SendKeys "{DOWN}"”表示。 Space---------WshShell.SendKeys " " Enter---------WshShell.SendKeys "{ENTER}" ←---------WshShell.SendKeys "{RIGHT}" ↑---------WshShell.SendKeys "{UP}" F1---------WshShell.SendKeys "{F1}" Tips:如果需要发送多个重复的单字母按键,不必重复输入该字母,SendKeys允许使用简化格式进行描述,使用格式为“{按键 数字}”。例如要发送10个字母“x”,则输入“WshShell.SendKeys "{x 10}"”即可。

    先录制取得初始脚本,再做简单的修改和参数化,再进行封装形成可重用的函数,最后回放调试,形成了最终的脚本。

Open Toolbar