QTP使用技巧

上一篇 / 下一篇  2009-09-06 10:40:36

1.runaction后面能不能接变量(动态调用action,所以从数据库取数据做action名字了,但是调用总是找不到)?  
   A:
脚本中原有RunAction "testbase [case1]", oneIteration
把引号中的内容放到Global表中的第22行,然后将代码修改为:
datatable.getsheet("Global")
datatable.setcurrentrow(22)

strLogin=DataTable("ActionName","Global")
RunAction strLogin, oneIteration

help
中也有相关帮助
:
Syntax
RunAction ActionName, [IterationMode , IterationRange , Parameters]
ActionName : String : The name of the action

2.QTP8.2中调用VB函数的问题(VBscrīpt写了一些测试脚本需要的几个通用函数,有没有办法可以用类似include的方式进行调用,而不需要每次都把这些函数Copy到新的脚本中)?
   A:
程序开头加上ExecuteFile "..\..\..\project\DeVariable.vbs"

3.QTP如何做回归测试(300多个TestCaseTD是否可以管理)
   A:TD
可以实现,可以生成测试集,一个测试集可以包含若干个测试脚本
QTP8.2
本身提供一个工具Test Batch Runner但是运行完没有报告。
MI
有另一个工具叫MTMmultitestmanager

4.qtp自动节图功能

A:具体可参考此帖:http://www.51testing.com/cgi-bin ... d=17663&fpage=1

5.QTP中如何设置使用别的浏览器(XP系统,用IE访问程序时,每次总提示屏蔽安装ActiveX插件,需要手动安装.但把这个过程录制到QTP后,回放一次是成功的。当我给某个输入框参数化了好多数据后,回放过程中,某些就会失败.
可能有两个方面可以解决这问题1、每个动作设置延迟时间2、设置为用别的浏览器。)
(
失败的提示信息是   object not visible)
   A:1.
延迟可用WAIT XX单位是秒)
2.
可以安装插件添加新的浏览器
   SystemUtil.Run "file” "params" "dir" "op'' "mode"
   QTP
运行可执行文件的方法及其参数
    ps:
建议是用IE浏览器,或者IE内核浏览器做测试

6.checkpoint检查网页,是否能实现只要网页出现乱码就返回错误报告?
   A:Text not displayed
能解决问题
关于Text Checkpoint的总结。
1
Text Checkpoint的检查部分分为三个部分。Checked TextText BeforeText After。在默认的情况下,Checked Text执行的是精确检查,其余两个部分执行的是模糊检查。Text Before(After)检查的内容可以比实际的内容少。但是不能有和是实际内容不相符的地方,否则就失败。
2) Exact match
选项。如果选择了这个选项,三部分完全都进行精确检查。个人觉得和只检查checked Text部分没有区别。
3) Text not displayed
。这个选项本质上就是一个结果取反的过程。就是把检查的结果给反过来,pass变成FailFail变成pass。我觉得这样就很容易理解。

7.WSH的应用方法
   A:WSH
实际上是一个脚本语言的运行环境,它之所以具备强大的功能,是在于其充分挖掘了脚本语言的潜力。因此,如果抛开脚本语言而空谈WSH,那实际上就没有了意义。而如果再展开来讲述脚本语言,显然就离开了今天的主题。

在这种情况下,只好采取一种折衷的方法:给大家推荐几个脚本文件利用WSH执行任务的实例,希望大家能通过这些例子对WSH的使用有一个初步的认识。

  脚本文件的编写十分方便,你可以选用任意一个文字编辑软件进行编写,编写完成后,只需将它保存为WSH所支持的文件名就可以了(如.js文件和.vbs文件)。最常用的就是记事本编辑器,下面的实例都是以它作为工具编写的。

打开记事本编辑器,在上面编写如下内容:
  Wscrīpt.Echo("走近WSH")
  将它保存为以.vbs.js为后缀名(千万不要写成了.txt)的文件并退出记事本。双击执行这个文件。
  这一次,我们要利用WSH完成一次创建十个文件夹的工作。代码如下:
  dim objdir
  set ōbjdir=wscrīpt.createobject("scrīpting.filesystemobject")
  for k=1 to 10
  anewfolder="c:\chapter" & k
  objdir.createfolder(anewfolder)
  next

同样,将它存为.vbs文件并退出。运行后,我们会发现,C盘根目录下一次性多出了十个新文件夹。

最后,再举一个在服务器上的运用。下面的代码将帮助你重新启动指定的IIS服务:  ' define a constant for stopped services
  Const ADS_SERVICE_STOPPED = 1

' get an ADSI object for a computer
  Set ōbjComputer = GetObject("WinNT://MYCOMPUTER,computer")

' get an object for a service
  Set ōbjService = objComputer.GetObject("Service","MYSERVICE")

' check to see if the service is stopped
  If (objService.Status = ADS_SERVICE_STOPPED) Then

' if the service is stopped, then start it
  objService.Start

  End If

将它以startsvc.vbs为名保存在C:盘根目录。并通过如下命令执行:Cscrīpt C:\STARTSVC.VBS。运行后,经你指定的IIS服务项将被重新开启。

其实,在Windowssamples目录下,有个WSH文件夹,那里面有不少很具代表性的.vbs. js脚本文件。

此外,利用WSH还可以自己编写脚本文件来提高网络管理方面的效率。


8.
EXCEL中导出数据进行测试

datatable.AddSheet("51sheet")
datatable.ImportSheet "f:\test.xls","testsheet","51sheet"

Dim i,RowCount '
定义两个变量
i=0
RowCount=datatable.GetSheet("51sheet").GetRowCount '
设置RowCount等于51sheet中的行数。
msgbox RowCount
Do while i<rowcount
i=i+1 '
第一次进入循环,执行这句后,i=1
'datatable.getsheet("51sheet").setcurrentrow(i)  
这句话被我注释掉了,正确的写法应该是下面这样,分开写。

datatable.getsheet("51sheet")
datatable.setcurrentrow(i)

'
执行过上面两句后,CurrentRow是第一行。

tempData=DataTable.GetSheet("51sheet").GetParameter("Name").Value
              
'
现在,我们调用msgbox看看下面这种调用方法得到的是什么值?没错,是第一行的值,下一次循环呢?
'
得到的是第二行的值么?
msgbox "GetParameter-Name:"&tempData '
这里弹出我们要看的值。
'
下面我们用另外一种方法来得到。
msgbox "GetParameter-i:"&DataTable.GetSheet("51sheet").GetParameter(1).Value '
这里我用GetParameter(1)去得到sheet中第一列的值。
loop

9.关于dtGlobalsheetdtLocalsheet

1) dtGlobalsheet只有一个,它的index值比较特殊,它有两个index值,一个是1还有一个是内置的默认的1000
你可以用1或者1000去引用它都是正确的。当然了,如果你用dtGlobalsheet来引用它也是正确的。这个sheetName叫做"Global"。注意:SheetName是区分大小写的。
2) dtLocalsheet
可以用index:1001来引用,当然,也可以用2来引用。至于其它自定义的sheet嘛,你就只能用index:3来引用了。
它没有内置的默认的类似前两个那样的index值。
3) datatable
这个对象只有一个。就是所有sheet的集合。或许你把它理解为excel文件比较好。
dtsheet
呢?就是其中的每个sheet。所不同的就是MI为他们做了一些默认值。在我们的应用中,可能会有多个action,如:actiion1,actiion2,actiion3
这些action也分别对应有各自默认的LoaclSheet.即:actiion1actiion2actiion3

如果每个action中,我们都只用到一个sheet,那就好办了,在每个action中都可以用localsheet来引用,但是如果我们有两个及两个以上的sheet.那么就比较容易乱套了。

10.移动当前位置的行

For i=1   to 3
datatable.getsheet("Global")
datatable.setcurrentrow(i)
DataTable("C","Global") = DataTable("nodename","Global")
‘把表Global中的nodename字段中的内容取出来。
Next

11.如何能记录到页面的校验码?(Output value能不能得到web页面的校验码,一般的校验码是由图片随即生成的 ,用QTP怎么录脚本在登陆前得到校验码并输入到校验码一栏)
A:1)
一个很简单的方法:测试时叫开发屏蔽掉检验码的功能后,再录制脚本。检验码的功能可以手工很简单测试出来。
    2)
想得到图片的校验码,唯一的方法就是跟程序员拿程序,然后自己在脚本里面写FUCNTION!
      
其它就要手动输入了!

12.QTP正则表达式的帮助
  

13.自动测试实施计划
1)
分析实施自动化测试可能存在的风险:就是决定是否实施,用成本 时间 效果 。。
2)
制定实施的时机:也就是在什么阶段
3)
研究所要测试的功能 性能
4)
分析在测试中可能遇到的问题 和困难
5)
预估所需要的人时和相应的硬件
7)
确定负责人员和相关测试人员
6)
制定详细的测试计划 方案
7)
最后是执行计划

14.一个Action里如何调用在另一个Action中定义的函数、过程(或变量、常量)
例如:
-----------------------------------
'Action_A
   Public strURL
       ...... ......
Function QueryList()
       ...... ......
       ...... ......  
End Function
------------------------------------
'Action_B
'
如何调用QueryList函数和strURL
A
1)可以把这些变量和Function放在vbs文件作为resource文件共享,在每个Action中添加该文件.      

如果function中出现控件调用,那么必须确保该控件在相应的Actionobject repository中是存在的.
  2)定义一个可被调用的ACTION里面唯一的放一个FUNCTION

15.如何管理QTP的源代码?(QTP生成的源代码比较多,而且和环境控件都有关,假如需要多人同时开发,请问如何管理源代码?)
A:
一个是代码你可以通过vss,cvs等来进行管理
   
一个是通过td或者qc的基于用例的代码管理   

其实第一种方法是基于版本控制来进行的,第二种方法是基于用例管理进行的
   
角度不同,管理方法也不同,不过团队协作需要的大家分工明确,进度控制。代码管理可以借鉴开发的方法。

16:脚本不能回放,IE中的AtiveX设置有问题??
A: TOOL---OPTIONS----Ative screen
   
然后点开advanced..,LOAD   ACTIVEX CONTROLS打勾
    TOOL---OPTIONS----Ative screen
   
然后点开advanced..,run scrīpts-->disabled!

17如何参数化link

Browser("Browser").Page("Page").Sync
Browser("Browser").Navigate "http://www.51testing.com/cgi-bin/index.php"
Browser("Browser").Page("51Testing
软件测试论坛---软件测试,软件质量工程师").Sync

Set tags=Browser("Browser").Page("51Testing
软件测试论坛---软件测试,软件质量工程师").Object.links
Dim i,j, arr()
i=0
For Each element in tags
If Ucase(element.tagname)="A" and left(element.InnerText,1)="[" Then
ReDim Preserve arr(i+1)
       arr(i)=element.InnerText
i=i+1
end if
Next



For j=0 to i
Browser("Browser").Page("51Testing
软件测试论坛---软件测试,软件质量工程师").Link("[版主讨论区]").SetTOProperty "Text",arr(j)
         Browser("Browser").Page("51Testing
软件测试论坛---软件测试,软件质量工程师").Link("[版主讨论区]").Click
Browser("Browser").Back
Next

这段代码先是打开一个空的页面,然后输入url.
到达论坛首页。

然后得到所有版面的名称,也就是link的名称。
存到数组里面。
然后使用SetTOProperty更换录制时候录下的link的属性。
这时候再click

18.QTPDebug状态,Export View 区域不能写入任何东西

A:如果你的目的是在debug过程中修改已执行过的命令,可以在Debug viewCommand中执行命令,如重新执行已经执行过的命令,修改变量的值等等。

如:Window("Flight Reservation").WinEdit("Name:").Set "51testing"
已经执行,如果现在想修改“51testing”testing,可以在command中执行
Window("Flight Reservation").WinEdit("Name:").Set "testing"

19动态变化值如何获取

A:VAL=Browser("欢迎使用我的工作台").Page("欢迎使用我的工作台").Frame("managePlace_7").WebRadioGroup("userAccountId_0").GetROProperty("Value")
Browser("
欢迎使用我的工作台").Page("欢迎使用我的工作台").Frame("managePlace_7").WebRadioGroup("userAccountId_0").select val

20如何一一获得Table中 某栏linktext?

A:通过上面link学习.我终于融会贯通,完成了我的问题:与大家共享:


//////////////////////////////////////////////////////////////////////////////////////
Browser("Login").Page("Page").Frame("contents").ViewLink("treeview").Image("Tplus").Click
Browser("Login").Page("Page").Frame("contents").ViewLink("treeview").Image("Tplus_2").Click
Browser("Login").Page("Page").Frame("contents").ViewLink("treeview").Link("
开课设置").Click
Browser("Login").Page("Page").Frame("main").WebList("drpStatus").Select "
任意"
Browser("Login").Page("Page").Frame("main").WebButton("
查找").Click
Browser("Login").Page("Page").Sync

Dim finded,findCode,Nowout
'define a constrat for find
findCode = 110901
finded = false

Function MaxPage(pageString)
'msgbox pageString
Dim ilen,i,j
ilen = len(pageString)
i=ilen
While i>0
       j = mid(pageString,i,1)
   'msgbox j
   If instr("123456789",j)>0 Then
          MaxPage = j
   'msgbox MaxPage
   Exit function
   End If
   i=i-1
Wend
End Function

  
Dim trowcount,maxp
trowcount = Browser("Login").Page("Page").Frame("main_8").WebTable("
开课代码").RowCount
msgbox "Rowcount: "&trowcount
Nowout = Browser("Login").Page("Page").Frame("main_8").WebTable("
开课代码").GetCellData(trowcount,1)
Nowout = trim(Nowout)
maxp = MaxPage(Nowout)
msgbox "max page: "& maxp

Dim nowPage,checkid
For nowPage = 1 to maxp
If   finded Then
   Exit for
End If
   ' link to the
当前所需page
   If nowpage>1 Then
Browser("Login").Page("Page").Frame("main_8").Link("[2]").SetTOProperty "Text","["&nowpage&"]"
Browser("Login").Page("Page").Frame("main_8").Link("[2]").Click
Browser("Login").Page("Page").Sync
end if

   ' Get the rowcount of table in now page
trowcount = Browser("Login").Page("Page").Frame("main_8").WebTable("
开课代码").RowCount
msgbox "Rowcount: "&trowcount

   'link every record in the table of the page
for i = 2 to trowcount   - 2
Nowout = Browser("Login").Page("Page").Frame("main_8").WebTable("
开课代码").GetCellData(i,2)
'msgbox i&": "&Nowout

checkid = "dgCourse:_ctl" &(i+1)& ":_ctl0"
Browser("Login").Page("Page").Frame("main_8").WebCheckBox("dgCourse:_ctl3:_ctl0").SetTOProperty "name",checkid
Browser("Login").Page("Page").Frame("main_8").WebCheckBox("dgCourse:_ctl3:_ctl0").Set "ON"

Browser("Login").Page("Page").Frame("main_8").Link("0901").SetTOProperty "Text",Nowout
Browser("Login").Page("Page").Frame("main_8").Link("0901").Click
Browser("
开课设置详细信息").Page("开课设置详细信息").Sync
'wait(1)
msgbox "begun"
msgbox findCode
msgbox Nowout
msgbox "finished"
If   trim(findCode) = trim(Nowout) Then
       finded = true
msgbox "find is ok!"
wait(2)
Exit for
End If
Browser("
开课设置详细信息").Close
Browser("Login").Page("Page").Sync
   next

Next

21.网页下拉框的选择

A:For i =1 to 10
Randomize
IndexNum=Int((10 - 5 + 1) * Rnd + 5)
Browser("Mercury Tours").Page("Find Flights_2").WebList("arrive").Select "#"&IndexNum
wait(3)
Next

Sub ChildObjects_Example()
'The following example uses the ChildObjects method to find all the
'list objects on a Web page, and then to select an item in each list.

Set ōDesc = Descrīption.Create()
oDesc("micclass").Value = "WebList"
Set Lists = Browser("Mercury Interactive").Page("Mercury Interactive").ChildObjects(oDesc)
NumberOfLists = Lists.Count()
For i = 0 To NumberOfLists - 1
Lists(i).Select i + 1
Next


End Sub

22将测试数据单独拿出来

A:取得一个
Browser("Browser").Page("").WebList("fid").GetItem (1)
取得全部
Browser("Browser").Page("").WebList("fid").GetROProperty("all items")

以下可以在自带的例子中实现
Window("Flight Reservation").WinComboBox("Fly From:").Select "Frankfurt"
a=window("Flight Reservation").wincombobox("Fly From:").GetItem(1)
reporter.ReportEvent 2,"
下拉列表的值",a

23.和TD连接

A:在QTP中不是有个Quality Center Connection,选择服务器连接,服务器处输入类似http://computer_name/tdbin,其中computer_name为服务器的名字,连接后在测试结果中添加defect就可以与TD相连了。

24处理Windows弹出窗口

A:IF Not Window("Flight Reservation").Exist(1) Then
'Calling   open flight
            If not Dialog("Login").Exist(1)   Then
       Browser("
管理系统").Dialog("Microsoft Internet Explorer").WinButton("确定").Click

    End If

25.查询结果的比较

这是查询一个字段的,对查询结果多页的情况也涉及了,其实应该把所有查询字段联合起来的,也就是改改sql语句和判断条件。

[i]Set Conn = CreateObject("ADODB.Connection")
Set Rs = CreateObject("ADODB.Recordset")
Conn.Open "Descrīption=kml-it;DRIVER=SQL Server;SERVER=KML-IT;UID=sa;PWD=password;APP=QuickTest Professional;WSID=KML-MICHELLE;DATABASE=kml_db"
sql="select distinct grn_no from grn_dtl where grn_no like '%"&grnNo&"%' order by grn_no DESC"
Rs.open sql,Conn,1,3
Dim i,j,cell
i=1
j=2 'j=2
的原因是因为页面上table是的数据是隔一行一条,不知道怎么回事,开发人员弄的怪把
Do while not rs.eof
If i=13 Then   '13
是每页显示出的最大行数,是个常数
i=1
j=2
    Browser("::").Page("::").Frame("mainFrm_5").Link("
下一页").Click
end if
cell=Browser("::").Page("::").Frame("mainFrm_5").WebTable("
收货单号").GetCellData(j,2)
If cell<>rs("grn_no") Then
            Reporter.ReportEvent 1, "
查询功能"&cell, "查询结果错误."
Exit do
else
Reporter.ReportEvent 0, "
查询功能"&cell, "查询结果正确."
End If
rs.movenext
j=j+2
i=i+1
Loop
rs.close
conn.close
set conn=nothing[/i]


TAG:

 

评分:0

我来说两句

Open Toolbar