萧萧的枫林,萧萧的我

发布新日志

  • QTP中Index,CreationTime属性特点的总结

    2009-07-22 21:15:04

    在QTP中我们常常会看到Index,CreationTime属性出现在对象中,
    但是往往我们无法正确理解这2个属性的含义和变化规律,就会给我们的测试带来很多困惑.
    (曾经我也深深困惑过!还求助无门)

    下面我就来说说我使用过程中的总结吧,相信用QTP做WEB测试的人,一定都有这方面的困惑

    总结1:
        Index和CreationTime属性的特点是一样的,唯一不同的地方是,index一般用来表示页面中的对象,元素的先后创建,CreationTime只用来表达浏览器(还有其他的window)相对于QTP启动时间上的顺序关系.

    总结2:
        index是一个辅助识别属性
    (有时可以没有"在已经唯一标识一个对象的情况下"有时又必须"某些对象什么属性都相同")
    这就决定了在"相同描述的对象"出现多个的情况下就一定有index,在一个对象现有"描述属性"已经能唯一标识一个对象的情况下,index是不会出现的.此时的index属性QTP里面标识为"none"
    比如"性别=男"这个"描述属性"在"全家"里因为有多个,所以就一定要Index来辅助描述.
    那么"称呼=爸爸"这个"描述属性"在"全家"里只有1个,所以我们说"爸爸"就马上知道是谁

    总结2:
        index在对象是唯一的情况下,没有任何意义和价值
    也就是说,只要这个对象在这个页面中确实是唯一的,那么无论你的index是什么值都能够正确识别这个对象
    比如当前页面中只有一个叫"风景"的图片,那么这个"风景"图片在任何index属性下都能正确识别

    总结3:
        当index,CreationTime属性在对象库中为none的时候,不能使用SetTOProperty赋值index属性,
    这个现象的原因目前还不明,不过现象是赋值能够成功,
    但是你无法使用赋值后index属性来正确识别你想像中的对象.


    总结4:
        index属性是QTP自己标识的.和程序编程里的index无关.
    学过编程的人,容易带入编程里面的概念,然而在QTP中,index属性是QTP自动生成的,和程序编程的时候使用的index是没有任何关系的,
    index属性的生成是按照相同对象出现的顺序来排列的,就是你用ChildObjects方法获得的对象集合中item(i)索引的顺序.

    总结5:
        index属性我们只能尝试改变对象库中的,不能改变实际对象
    因为index属性是由QTP自动标识的,而实际对象是没有index属性的,所以我们不能使用SetROProperty方法尝试改变实际对象的index属性,只能使用SetTOProperty方法改变对象库中的对象,让QTP识别.

    最后希望对那些还困惑在其中的同仁有少许帮助,我以前在index为none时候用SetTOProperty方法无效上面可是花了好多时间理解

  • QTP中Excel文件无法导入问题的解决办法

    2009-07-02 08:31:19

    最近用QTP导入EXCEL文件的时候常遇到excel文件无法导入的问题.
    找了很久论坛也问过了,都没有根本解决,一天突发奇想既然excel文件导入不了,那么QTP导出来的excel文件总应该可以使用吧

    于是写脚本,直接从excel文件中取出数据,写入DataTable然后从DataTable中导出成excel文件.就可以使用Import导入了.

    代码如下:(其实代码不复杂,关键是要有解决理路)

    ''***********************************************************
    '功能说明:把无法正确导入到QTP中的excel文件,转换为可以导入到QTP中的excel文件
    '脚本说明:excel文件中,如果第一行的某列没有内容,将自动停止转换.
    'excel中任何一列中间掺杂空白表格,将从此空白表格处停止转换下方的内容.
    '输出文件和源文件在同一个目录
    '脚本必须放在QTP中执行
    '***********************************************************

    Dim row,row2
    row=2        '设置开始转换的行
    row2=1       '设置开始转换的列
    tablename=""
    workbookurl=Select_File("D:\")
    If workbookurl="" Then
     msgbox("没有选择文件.程序将退出")
     exitrun
    end if


    Set ExcelObj = CreateObject("Excel.Application")     ' 创建excle工作表对象
    ExcelObj.Visible = False    '不显示打开的excel窗体      
    Set xlsWorkBook = ExcelObj.Workbooks.Open(workbookurl)  '打开excle文件
    Set NewSheet = xlsWorkBook.Sheets(1) '选择添加数据的工作表


    Do  '列循环开始
       If NewSheet.Cells(1,row2) = "" then'如果纵单元格第一行没有内容,就说明不需要转换了.
      Exit do
     else
      tablename=NewSheet.Cells(1,row2)
       tablename=DataTable.GetSheet("Global").AddParameter(tablename,"").Name '新建导入数据的字段名称.并赋值内容""
     end if
     row=2      '初始化开始的行
     Do         '行循环开始
      tmp=NewSheet.Cells(row,row2)
      If tmp = "" then'如果列中某单元格为空,则进入下一列开始转换
       Exit do
      end if
      datatable.GlobalSheet.GetParameter(tablename).ValueByRow(row-1)=tmp'写入数据到datatable中
      row=row+1
     loop
     row2=row2+1
    loop


    xlsWorkBook.close  '关闭工作表
    Set xlsWorkBook = Nothing
    datatable.Export(workbookurl&"-转换后的.xls")
    msgbox("转换完成")


    '选择文件函数
    Function Select_File(From_FilePath)
    If not existed(From_FilePath,"^[A-Za-z]:.*") Then
      From_FilePath="C:\"
    End If

    Set bjDialog = CreateObject("UserAccounts.CommonDialog")
    objDialog.Filter = "Excel文件|*.xls"
    objDialog.InitialDir = From_FilePath
    intResult = objDialog.ShowOpen
    Select_File=objDialog.FileName
    End Function

    '正则表达式函数
    Public Function Existed(Exist_String,Reg_Pattern)
     Dim re
     Set re = New RegExp
     re.Pattern = Reg_Pattern 
     re.IgnoreCase=True
     Existed=re.test(Exist_String)
     Set re=Nothing
    end Function


    '结束脚本
    ExitRun

  • QTP中正则表达式搜索/匹配字符串方法

    2009-06-14 15:38:51

    由于QTP是使用的vb语言,所以其实就是VB中正则表达式的使用,
    我稍微总结下喽!其中加入了我的理解,也正是由于我充分理解了正则表达式对象,所以在QTP中对于很多情况的判断游刃有余,希望每一个看到这篇文章的希望在QTP上有所深入的人,认真,仔细的理解正则表达式,它是一个非常强大的东西.
      
    第一.首先正则表达式使用如下对象.
    1. RegExp 这是使用正则表达式匹配模式的主要对象了
      属性:
      Pattern:一个字符串,用来定义正则表达式<匹配规则>。
      IgnoreCase如果True,则忽略英文字母大小的匹配,False对大小写进行匹配。
      Global:设置True则必须匹配整个<匹配规则>,设置False只匹配第一个<匹配规则>。
      MultiLine:设置True则在多行中搜索。设置False则在换行时停止
      方法:
      Execute:返回一个 MatchCollection 对象,该对象包含每个成功匹配的 Match 对象。
      Replace返回一个将符合<匹配规则>的字符串替换为指定字符串。
      Test:返回一个布尔值,该值指示正则表达式是否与字符串成功匹配。

    2. MatchCollection 是集合对象,该对象包含每个成功匹配的 Match 对象。

       属性:
      Count:匹配对象的总数。
      Item:匹配对象的索引。

    3. Match 是成功匹配的对象。

        属性:
      FirstIndex:匹配对象所匹配字符串的起始位置。
      Length:匹配对象所匹配字符串的字符长度。
      SubMatches:匹配对象所匹配结果的子项。也就是<匹配规则>中下一个匹配项"一般一个()代表一个匹配项"
      Value:匹配对象所匹配的值。

     

    第二. RegExp对象的Test方法:测试字符串是否符合匹配规则

    Function RTest(s, p)
        
    Set re = New RegExp
         re.IgnoreCase =
    False '设置是否忽略大小写
         re.Pattern = p
         RTest= re.Test(s)
    End Function

    一般我们在QTP中使用正则表达式来匹配字符串的话,会编写如上面那样的一个函数.使用方法如下
        s = "我的邮箱: test@163.com 。
    欢迎致电!" '用来匹配的字符串,也就是实际上我们要测试的内容

         '检查测试字符串中是否包含数字
        p = "\d+"  '测试是否包含数字的匹配规则
        
    MsgBox RTest(s, p)

        
    '检查测试字符串是否全是由数字组成:
         p = "^\d+$"
        
    MsgBox RTest(s, p)

        
    '检查测试字符串是否有大写字母:
         p = "[A-Z]+"
        
    MsgBox RTest(s, p)
        

    第三. RegExp的Replace方法:把测试字符串中符合匹配规则的字符串替换为指定内容

    Function StrReplace(s , p , r )
        
    Set re = New RegExp
         re.IgnoreCase =
    True '设置忽略大小写
         re.Global =
    True  '设置必须匹配整个规则
         re.Pattern = p
         StrReplace = re.Replace(s, r)
    End Function

    上面的就是一般情况下使用这个方法所需要编写的一个函数,下面的就是如何使用

      
    '以下是如何使用这个方法替换邮箱地址   
         s = "我的E-mail: Test@163.com 。欢迎致电!"
         p = "\w+@\w+\.(com|cn|net)"
         r = "E_Mail@sohu.net"
         s = StrReplace(s, p, r)
         MsgBox s
        
    '结果:我的E-mail: E_Mail@sohu.net 。欢迎致电!

    第四. Match的SubMatches属性:下一个匹配项的匹配内容

    仔细看下面这段代码的含义...
        inpStr = "我的E-mail: lucky@163.com 。欢迎致电!"
        
    Set re = New RegExp
        re.Pattern = "(\w+)@(\w+).(\w+)" 
    '注意!这个匹配规则有3个(),一个()代表一个匹配项

        Set mhs = re.Execute(inpStr)
        
    Set mh = mhs(0)             '根据上面的匹配规则可以计算出只有一个匹配结果
        
        MsgBox  "电子邮件地址是:"&mh.Value                
    '这里是匹配的内容
        MsgBox  "用户名是:"&mh.SubMatches(0)  '第一个括号<匹配项>中的内容
        MsgBox  "邮箱是:"&mh.SubMatches(1)  '第二个括号<匹配项>中的内容
        MsgBox  "域名是:"&mh.SubMatches(2)  '第三个括号<匹配项>中的内容
        

Open Toolbar