zoukankan      html  css  js  c++  java
  • [转载]QTP问题汇总

    1、打开QTP录制的文件夹后报“Unexpected file format”错误。
    解决方法:用QTP安装程序重新修复QTP
    2、QTP 无法在对象库中识别出网页的对象,主要是由于以下两个原因:
    (1).QTP和IE的运行模式要以管理员身份运行(即:右键程序选择“Run as administrator” **俺是英文系统翻译俺不管鸟**)此条适用于vista和win7
    (2)QTP的运行要先于IE。即先将QTP 运行起来,待QTP运行后再启动IE。注意在QTP运行前就存在的网页要关掉
    okay了,这样就能搞定QTP的这个问题鸟。至于,QTP安装有问题,破解的问题,IE插件问题等等都不是问题所在。俺用的就是破解版,跑得很好没问题:)
    3、下拉菜单不能回放的解决方法
    在录制时,比如打开记事本,点击下拉菜单 "文件"-->"退出";
    回放时会出现 object not visible ;
    windows("记事本").click 193,117
    windows("记事本").winmenu("ContextMenu").Select "文件:退出"
    QTP默认录制方式是无法录制下拉菜单的,必须修改设置后再录制
    修改设置如下:
    在tools -> web event recording configuration 点击custom settings... 展开Web objects,
    选种webelement,点击event -> add -> onmouseover 。并确定在record栏内,状态是enabled。
    然后再重新录制你的脚本。
    执行录制后的脚本,无法回放成功,这是因为脚本只录制了鼠标的onmouseover 事件,却没有录制click事
    件,所以脚本录制完后要手动添加click事件。
    4、怎么修改QTP对象的默认识别属性
    以WebCheckBox为例:在QTP里面,选择Tools->Object Identification...Environment选择Web,找到WebCheckBox,看看QTP默认的识别WebCheckBox对象时使用的是哪些属性。可以修改识别WebCheckBox对象的属性。注意:修gia只对以后录制的脚本起作用。

    一、Cannot find the "shoujian.projectname" object's parent "10_2" (class Frame). Verify that parent properties match an object currently displayed in your application.问题的解决。
    这个问题真是郁闷,其实产生的主要原因是在录制脚本的时候,qtp没有识别出来框架Frame中的对象,回放时找不到对象出错。
    解决办法:通过object spy 识别对象 并将其添加到对象库;然后在录制点击对象的一段脚本(或者自己写),再次回放就ok了。

    二、注意:datatable.Importsheet "D:testUSER_INFO.xls",1,"Action1" 中,"Action1"一定要加双引号,要不然默认导入到Global中。

    三、自动启动qtp的vbscript脚本。
    dim qtapp
    Set qtapp=createobject("QuickTest.application")
    qtapp.Launch
    qtapp.visible=true
    用法:将脚本卸载记事本文件中,文件格式保存为.vbs 点击直接运行。就可以自动启动qtp。

    四、描述性编程中出现“The “[WinEdit]”object's description ,matches more than one of the objects currently displayed in your appliction.Add addtional properties to the objects ddescription in order to uniquely identify the object.”中问题的解决。
    这个问题看起来其实很简单就是在QTP描述过程中,发现匹配该对象的属性多于1个,因此无法正确匹配,所以QTP报错。错误如图下:
    qtp <wbr><wbr>问题汇总

    问题解决方法:
    添加更多的对象属性,以便正确匹配,在对象查看器点击该对象(我的是password对象),点击qtp <wbr><wbr>问题汇总,查看对象的属性,添加更多的属性,如:window id 等。同时将脚本修改为:
    Dialog("Login").WinEdit("attached text:=Password:","window id:=3001").Set "cheers_lee"
    注意红色字体部分,我是同个两个属性匹配WinEdit的,一个是attached text另一个是window id。再次运行脚本,测试通过OK!强调的是attached text和window id 是对象的属性,通过对象查看器可以看到。

    五、修改QTP中对象的默认识别属性

    WebCheckBox为例。
    QTP里面 ,选择Tools --> Object Identification...Environment选择Web,找到 WebCheckBox,看看 QTP默认的识别WebCheckBox 对象时使用的是哪些属性。可以修改识别WebCheckBox对象属性
    注意: 修改只对以后录制的脚本起作用。

    六、QTP如何测试鼠标右键菜单

    QTP附带的订票网站sample为例,edit控件username鼠标右键,点击paste(第4个菜单项)

    cur_replay_type = Setting.WebPackage("ReplayType")
    Setting.WebPackage("ReplayType") = 2
    Browser("Browser").Page("Welcome: Mercury Tours").WebEdit("userName").Click 5,4, micRightBtn
    Setting.WebPackage("ReplayType") = cur_replay_type

    index=4
    Set WshShell = CreateObject("Wscrīpt.Shell")
    For i = 1 To index
    WshShell.sendKeys "{DOWN}"
    Next
    WshShell.sendKeys "{ENTER}"
    Set WshShell = nothing
     

    七、如何设置让对象库不产生重复对象

    tools --options---web ---page/frame optinons
    都选择第二项.就OK了.
     

    八、QTP中用代码连接数据库

    Set Conn = CreateObject("ADODB.Connection" )
    str="DRIVER=Oracle in OraHome92;SERVER=192.168.0.1;DBQ=testdb;user id=test; password=test"
    Conn.open str
    Set Rs = CreateObject ("ADODB.Recordset" )
    sql = "select * from user_table t where table_name = 'XXX' "
    Rs.open sql,conn',1,3
     

    九、QTP测试页面字体颜色的办法

    set ōbj = Browser().Page().WebElement().Object
    ' Get the object
    set iStyle= obj.currentstyle
    ' Get the attribute
    sColor = iStyle.color
     

    十、下拉菜单不能回放的解决方法

    在录制时,比如打开记事本,点击下拉菜单 "文件"-->"退出";
    回放时会出现 object not visible ;
    windows("记事本").click 193,117
    windows("记事本").winmenu("ContextMenu").Select "文件:退出"

    QTP默认录制方式是无法录制下拉菜单的,必须修改设置后再录制
    修改设置如下:
    在tools -> web event recording configuration 点击custom settings... 展开Web objects,
    选种webelement,点击event -> add -> onmouseover 。并确定在record栏内,状态是enabled。
    然后再重新录制你的脚本。
    执行录制后的脚本,无法回放成功,这是因为脚本只录制了鼠标的onmouseover 事件,却没有录制click事
    件,所以脚本录制完后要手动添加click事件。
     

    十一、QTP中如何识别带参数的链接?

    QTP中如何识别带参数的链接?比如:"Browser("browser").Page("page").Link("href:=http://www.xxx.test/file/upload.php?matchable=0"

    特殊字符都需要用转义字符""来进行转义。

    十二、如何让QTP运行时自动产生提示信息并自动确定?

    Set WshShell = CreateObject("Wscrīpt.Shell")
    WshShell.Popup "123456789", 2, "标题内容"
     

    十三、QTP回放的过程中出现禁止运行控件提示的解决方法

    修改QTP设置如下:toos-->options..-->Active Screen-->Advanced-->点选Load ActiveX controls
     

    十四、从QC自动启动qtp如何自动加载插件

    '此函数用于加载指定Test所有的插件,若要运行Test可自己加个qtApp.Test.Run
    Function Load_Addins(testPath)
    Dim qtApp 'As QuickTest.Application
    Dim blnNeedChangeAddins
    Dim arrTestAddins
    Set qtApp = CreateObject("QuickTest.Application")
    arrTestAddins = qtApp.GetAssociatedAddinsForTest(testPath)
    blnNeedChangeAddins = False
    For Each testAddin In arrTestAddins
    If qtApp.Addins(testAddin).Status <> "Active" Then
    blnNeedChangeAddins = True
    Exit For
    End If
    Next
    If qtApp.Launched And blnNeedChangeAddins Then
    qtApp.Quit
    End If
    If blnNeedChangeAddins Then
    Dim blnActivateOK
    blnActivateOK = qtApp.SetActiveAddins(arrTestAddins, errorDescrīption)
    If Not blnActivateOK Then
    Call ErrorLog(errorDescrīption) '这里是调用自己的日志函数,可替换为自己的或注释掉
    Wscrīpt.Quit
    End If
    End If
    If Not qtApp.Launched Then
    qtApp.Launch
    End If
    qtApp.Visible = True
    qtApp.Open testPath
    '可在此加入qtApp.Test.Run来运行Test
    Set qtApp = Nothing
    End Function
     
     
     
    基础代码
     

    1 生产随机数列
    第一种方法

    CODE:

    randomize'更新反回的数据
    funcation rand(k,n)
    n=int((k-1)*rnd+1)
    rand=n
    end funcation

    第二种方法

    CODE:

    n=randomnumber.value(1,255)

    2 当运行到表中的某一行,自动导出表中的所有数据

    CODE:

    row=datatable.getcurrentrow
    if row="5" then
    datatable.export("d:data.xml")
    end if

    3

    CODE:

    webedit("txtpass").setsecure"sdsdf...."

    如果参数化密码,可以直接在数据表中写入未加密的密码,它会自动识别,即不用把setsecure改为set
    4 如果弹出对话框就获取上面提示信息并与表中的信息对比,不统一证明弹出的提示出错,主要用来验证

    '判断一个窗口是否存在
    if(Dialog(dialog_name).exist=true) then
    else
    end if
    '判断一个窗口是否激活
    if(window("window_name").active=true) then
    else
    end if

    导入一个EXCEL表
    datatable.Import(excel_name)'将该excel文件中的表全部导入
    datatable.ImportSheet(excel_name,sheet_name)'导入excel中名字为sheet_name的sheet表
    导出一个EXCEL表
    datatable.ExportSheet(excel_name,sheet_name)或
    datatable.ExportSheet(excel_name,sheet_index)
    获取表中当前的行数
    datatable.GetCurrentRow
    获取表中总行数
    datatable.GetRowCount
    返回EXCEL中表的数量
    DataTable.GetSheetCount
    获取运行的表中的某个值或者设置该值
    DataTable.Value(colume_name,sheet_name)'获取colume_name列中的当前光标处的值
    DataTable.value(colume_name,sheet_name)=New_Value'设置新值

    DataTable.GetSheet(sheet_name).GetParameter(colume_name).valueByRow(n)

    判断当前光标是否处于最后一列
    iRow=datatable.getCurrentRow
    if(dataTable.value(sheet_name).GetParameter(colume_name).ValueByRow(iRow)<>expected_value) then
    for iRow=0 to iRowrowNum=iRow
    next
    end if
    获取一列数据
    DataTable(colume_name,sheet_name)
    '一个登陆的对话框,首先为一个错误的判断,后来输入正确的值点击button_name按钮
    Dialog(dialog_name).WinEdit(login_name).set login_wrongname
    Dialog(dialog_name).WinEdit(login_pwd).set login_wrongpwd
    Dialog(dialog_name).Dialog(wrongdialog_name).WinButton(button_name).click
    Dialog(dialog_name).WinEdit(login_name).set login_correct_name
    Dialog(dialog_name).WinEdit(login_pwd).set login_correct_pwd
    Dialog(Dialog_name).WinButton(button_name).click

    window的方法和属性
    window(win_name).active

    CODE:

     if browser("web_name").dialog("dialog_name").exist(1) then'如果不出现=false
    error_message=browser("web_name").dialog("diaglog_name").static("用户密码错误!".getRoproperty("text")
       if error_message<>(datatable.value("error_info"))then
    msgbox(error_message)
    end if
    browser("web_name").dialog("diaglog_name").close
    end if

    这里我总结了两点技巧:
      一是:对于dialog中,虽然提示信息对象名称是"用户密码错误",但如果信息对象名称是“该用户不存在”,不用更改会自动识别,我想主要是录制第一遍时,“用户密码错误”只是让运行时能找到这个控制,而不管它是什么内容,因为在对象仓库中,text不是决定该对象的属性
    二是:如果对于提示信息比较长的,可以用mid(error_message,n,m)取一部份特征提示信息进行验证,这样我想可以节省处理时间,又可以避免长度以及空格等字符的处理

    5 datatable.value("num")只在global形式下的一种省略形式;完整形式是:

    CODE:

    datatable.value("num",dtlocalsheet)

    -----向某一列的单元格赋值:

    CODE:

    datatable.value("column_name",dtlocalsheet)="nanjing"

    -----取得某一行具体值:

    CODE:

    datatable.setcurrentrow(n)
    msgbox(datatable.getsheet("global").getparameter("column_name").Rawvalue)
    或者kk=datatable.Rawvalue("column_name","action1")

    ----在run-time时,动态添加表格与数据

    CODE:

    kk=datatable.addsheet("sheet_name").addparameter("column_name","value").name;

    6 简化代码,明晰结构的方式with--end with 结构:

    CODE:

    with Dialog("name")
    c1=.button("b_name").click'//等价于Dialog("name").button("b_name").click
    end with

    7 wintreeview一些操作

    CODE:

    选择一个条目:wintreeview.select(item)'根是0
    根的名称:wintreeview.getitem(0)

    8 数据库检查点模块:

    CODE:

    sub database_check
    set con=createobject("adodb.connection")
    con.open "Description=IBM_ODBC;DRIVER=SQL Server;SERVER=IBM;UID=sa;"&_
    "PWD=123456;APP=Quick Test Pro;WSID=IBM;DATABASE=IBM_table"
    'access方式:con.open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=d:test.mdb"
    'Orocle方式:con.open "DRIVER={Oracle in OraHome92};SERVER=CESHI;UID=CND_TEST;PWD=CND;DBQ=CESHI;DBA=W;APA=T;EXC=F;XSM=Default;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=Lo;BAM=IfAllSuccessful;MTS=F;MDI=Me;CSR=F;FWC=F;PFC=10;TLO=O;"
    set record=createobject("adodb.recordset")
    sql="select*from ibm_one_table"
    record.open sql,con
    DO
    if(record("ibm_table_column")="kai")then'//查找表格中有多少kai
    num=num+1;
    end if
    record.movenext
    loop until record.eof=true
    record.close
    set record=nothing
    con.close
    set con=nothing
    end sub

    9 换行符

    CODE:

    vbcr----chr(13)回车符
    vblf----chr(10)换行符
    vbcrlf----chr(13)+chr(10)结合

    10 Run from step有两种方式:

    CODE:

    在Keyword View模式会从本步骤运行到所有action结束
    在expert view模式仅会将本action运行结束

    11 对于属性是变化的,有时可以把该属性从识别对象里删除,来解决识别问题

    12 对系统文件的操作

    CODE:

    -------从系统的文件中获取信息及删除文件
    get_file_infor("c:she.mpg")
    function get_file_infor(url)
    dim fso,f
    set fso=createobject("scripting.filesystemobject")
    set f=fso.getfile(url)
    f.name:f.size:f.type:f.datacreated'///获取文件信息
    fso.deletefile(url)'/////删除文件
    end function
    --------获取文件夹里所有文件信息
    get_folder_infor("c:kai")
    function get_folder_infor(folder)
    dim fso,f,f1,n
    set fso=createobject("scripting,filesystemobject")
    set f=fso.getfolder(folder)
    set fc=f.files
    for each f1 in fc
    select case f1.name
    case"kai.mpg","she.mpg","dd.mp3"'//检查文件夹里是否含有这些文件
    end select
    next
    end function

    13 等待某个对象出现方法

    CODE:

    y=......waitproperty("visible",true,10000)

    14 防程序中断方法

    CODE:

    On error resume next
    On error goto handle

    15 数组的应用:

    CODE:

    name=array(1,2,"aa","bb")
    name(2)="aa"

    16 正则表达式应用模板

    CODE:

    进行日期YYYY-MM-DD的格式检查 :
    Function RegExpTest(patrn, strng)
    Dim regEx, Match, Matches ' Create variable.
    Set regEx = New RegExp ' Create a regular expression.
    regEx.Pattern = patrn ' Set pattern.
    regEx.IgnoreCase = True ' Set case insensitivity.
    regEx.Global = True ' Set global applicability.
    Set Matches = regEx.Execute(strng) ' Execute search.
    For Each Match in Matches ' Iterate Matches collection.
    RetStr = RetStr & "Match found at position "
    RetStr = RetStr & Match.FirstIndex & ". Match Value is '"
    RetStr = RetStr & Match.Value & "'." & vbCRLF
    Next
    RegExpTest = RetStr
    End Function
    date_pattern="^((((19|20)(([02468][048])|([13579][26]))-02-29))|((20[0-9][0-9])|(19[0-9][0-9]))-((((0[1-9])|(1[0-2]))-((0[1-9])|(1d)|(2[0-8])))|((((0[13578])|(1[02]))-31)|(((01,3-9])|(1[0-2]))-(29|30)))))$"
    result_message=RegExpTest(date_pattern, inputbox("请你输入要检查的时间:"))'用其它正则表达式更改此处
    Select case result_message
    Case ""
    msgbox("你输入的日期格式与标准不匹配")
    case else MsgBox(result_message)
    end select

    17 返回一个字符串在另一字符串中的位置

    CODE:

    instr(string1,string2)

    18 有时回放出现找不到对象时,可能不是由于你的代码问题,而是由于你的操作系统等设置问题;

    CODE:

    举例说明1:
    比如:你录制一个选择磁盘中的文件动作
    会录制为:
    .winlistview(" ").drap 46,99
    .winlistview(" ").draponitem "she.mp3"
    下次录制的时候,如果你的系统文件改为不显示扩展名,下次执行的时候,QTP就找不到she.mp3,只能找到she;
    举例说明2:
    有时由于不同操作系统以及不同的ie,导致有些窗口不能识别,比如在2000下弹出的网页对话框的标题是:
    “web对话框",而在2003上是”网页对话框"

    19 "is+*"类型function

    CODE:

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

    QTP提供全局错误处理模式,有Popup message box,Process next action iteration,Stop run,Process next step这四种。

    QTP也提供On Error Resumt Next/On Error goto 0的局部错误处理模式。可以在局部范围内实现Process next step的效果,忽略错误继续执行后续步骤。这个局部错误处理模式,象局部变量优先于全局变量并且只在本函数内有效一样,优先级高于全局错误处理模式,同时只在本函数局部范围(Action本身也可以看成是个函数)内生效。它不会影响外层函数的错误处理模式,但会改变局部范围内调用的子孙函数,将子孙函数的错误处理模式改为Stop Run!

    四种全局错误处理模式的区别在于:

    1、Process next step
    这种模式忽略错误继续往下执行,可以通过Err.Number来判断是否发生了错误。
    因为Case函数的每个步骤都是密切相关的,不可能忽略错误继续往下执行下一步骤
    也不可能在每个步骤每个语句后面都加错误检查,这样错误处理代码太多了
    在很多个步骤后再检查也是不严谨的,会错上加错,并因此失去第一个错误的信息
    所以,这种模式不可取

    2、Stop run
    这种模式发生错误后,就抛出异常(可用Err对象得到异常里的错误信息),中止本函数,并一层一层的返回到上一层函数,最后到达Action函数后(Action本身也可以看成是个函数),就停止整个Test的执行。
    在一层一层的返回上层函数的过程中,如果某个中间函数有On Error Resumt Next/On Error goto 0,就会把错误拦截下来,这个中间函数会继续往下执行,不会中止函数并返回上一层函数。

    3、Popup message box
    这种模式在发生错误时,弹出对话框让用户选择Stop、Retry、Skip、Debug。
    主控Test要全自动执行,不能要求人工干预,所以这种模式不可取

    4、Process next action iteration
    这种模式跟Stop run类似,但是它只是退出本次Action循环,还会继续下一个Action循环。
    主控Test没有继续下一个Action循环的需求,所以这种模式不可取。

    经过上述分析,我们可以得到结果,我们的主控Test,全局错误处理模式使用Stop run模式,同时在主控函数里使用On Error Resumt Next/On Error goto 0的局部错误处理模式来调用Case函数。这样使得Case函数和其子函数里发生错误时,会停止执行,并层层返回到主控函数这里,并由主控函数来拦截错误,记录错误。然后主控函数就可以正常的继续执行下一个Case函数了,不用担心会导致整个Test停止执行。

    主控函数调用Case函数的详细过程如下:

    Err.Clear
    On Error Resume Next
    call CaseFunctionName
    If Err.Number <> 0 Then
    WriteLog Err.Number '错误码
    WriteLog Err.Description '错误描述
    WriteLog Err.Source '错误来源对象,不过好像没啥用
    End
    Err.Clear
    On Error goto 0

  • 相关阅读:
    C#基本知识
    C#集合
    python学习DAY10(异常)
    python学习DAY10(属性方法)
    python学习DAY10(反射)
    python学习DAY10(类方法)
    python学习DAY10(模块)
    基于Servlet构建基础的后台服务器
    时间类型及格式化
    SpringCloud中服务消费者接受前台传参问题(报错415)
  • 原文地址:https://www.cnblogs.com/vanya/p/6742580.html
Copyright © 2011-2022 走看看