关于QTP中的参数化51Testing软件测试网A F N-Y@9l.uf|s
方法一、DataTable方法51Testing软件测试网^o^+d'MQ
这是QTP提供的一种方法,也是最容易实现参数化的一种方式。QTP针对DataTable对象提供了很多方法,可以对DataTable进行灵活的操作。DataTable分为Global和Local两种,Global所有的Action都可以用,而Local就是只能Action自己用。
zm,B.]&o-a!t138711
通过DataTable做参数化最直接的方法就是在Keyword View视图下通过选项进行,这样即方便又减少出错的几率。单击要参数化项目的value列,选择出现的箭头弹出Value Configuration Option对话框,在这里可以很方便的进行参数化。
6q.?|0s#Q4a138711
51Testing软件测试网 Q6Ha@s]fWcE
Zf;nzAz uc#G138711
Parameters选择数据来源类型。DataTable是从数据表中取值,Environment是从环境变量中取值,Random Number是选择随机值。下拉列表选择DataTable后,选择所要使用的数据表Global还是local,最后选择name,参数取自哪列,点击确定后即可完成参数化过程。51Testing软件测试网.Av f|cw.u
Dialog("Login").WinEdit("Agent Name:").Set DataTable("UserName", dtGlobalSheet)51Testing软件测试网Ja:|Mf-FU ^6b(G
这是最简单最直接的方式。用这种方式需要注意,在File---Seting---Run需要做相应设置,否则运行结果很容易出错,使实际取到的参数值和预期的不一样或是循环不正确的错误。最好的方式是通过写语句来控制迭代过程中的取值。在脚本开发过程中,这种方式是最常用的。类似如下代码:51Testing软件测试网4J6} ~'Z:x/i4f
For i=0 to DataTable.GetCurrentRow
}IBvF*J5a:Fx138711
Dialog("Login").WinEdit("Agent Name:").Set DataTable("UserName", dtGlobalSheet)51Testing软件测试网1oo@ Z/PU0J:b'[
DataTable.SetNextRow51Testing软件测试网 X*q*^ h"cU+Rw0{i!e
Next51Testing软件测试网/Pw*h{M
51Testing软件测试网G_1J5eW"X1K rz$u
Vv%RXQ`4IoY138711
DataTable提供了很多相关的方法和属性,具体参考帮助文档。帮助目录下的Utility.chm文档中有关于DataTable对象的详细介绍。
)^ d w`U E+if;^138711
方法二、环境变量实现参数化
^1Ys m(~Z(z138711
Environment对象提供对环境变量的访问。环境变量的来源有两种方式:内部环境变量和用户定义的环境变量,其中后者支持从外部导入,格式为XML文件。用环境变量做参数化有一定的局限性,因为环境变量对数据的操作没有方法一灵活,所以环境变量用的最多还是数据的共享。在此暂作为一种方式来学习,灵活运用就好。
vi~|F3vMl!O138711
首先说内部环境变量。它是QTP默认定义的一组变量,包括一些系统信息、项目信息等。目前用到最多的是TestDir,利用这个可以实现一个相对目录的目的。具体应用,在做一个数据驱动的脚本时,将数据文件放到脚本文件夹中,然后利用Environment("TestDir")+DataName导入数据文件。这样可以很方便的移植,而不需要考虑将数据文件放到具体目录下。
2S:f9rn SR7[Q138711
用户定义的环境变量,需要自己定义变量名和值。定义好后就可以用这些变量去参数化脚本中的常量。51Testing软件测试网+u{)yOH]_1i
Dialog("Login").WinEdit("Agent Name:").Set Environment("test1")
;}E8s"x#\138711
51Testing软件测试网D4pBXlx
y"U"C0A C"p.v138711
这样做参数时,每个参数值都需要指定,而且不能批量的生成。所以它有一定的应用场景:当一个Test中的不同Action需要同样一个参数,用环境变量去参数化常量是很好的一种方式;其次就是不同的Test需要用到同样的参数时,用环境变量可以很好的解决这个问题。
9^1m\2B/stb.i138711
方法三、外部数据源实现参数化51Testing软件测试网 }Tl K z
利用外部数据驱动脚本的运行,这是经常用到的方法,这样可以很方便的组织测试数据。相对前两种方法,这种方式数据的读取、控制稍有些麻烦。下面以常见的几种方式进行说明。(以下代码并不复杂,没做注释)
II B0}K/h.?[138711
1. 数据文件以Excel组织
c:c#X l]%m'W138711
用Excel组织测试数据是最常用的了。此种驱动可以采用两种方式,将数据Import到DataTab中或是利用com来操纵Excel文件。下面给出这两种方式的示例代码。(输入flight用户名和密码)51Testing软件测试网:{,x_ qwYI.FIt V;a
方式一、导入到DataTable中
.C;p"LKI*?138711
'获得数据文件路径,并将数据文件导入到DataTable运行表中51Testing软件测试网d4L+i.e`:A*c Ss7Cw+nE
DataStr= Environment("TestDir")&"\data.xls"51Testing软件测试网L_.@/bbh R
DataTable.AddSheet("TestData")
-WT q tY138711
DataTable.ImportSheet DataStr,"Sheet1","TestData"
JQi pj&[&E'o138711
'输入用户名和密码
|#k}n*hF138711
For i=1 to DataTable.GetSheet("TestData").GetRowCount
5Y!B ?t*hPA'mV!K*P138711
DataTable.SetCurrentRow i
+[ u-l+_0w(G$G-O138711
UserName=DataTable.Value("UserName","TestData")51Testing软件测试网 [|z&` ]G{ ^5I
PassWord=DataTable.Value("PassWord","TestData")
nM|)S3qaba138711
Dialog("Login").WinEdit("Agent Name:").Set UserName51Testing软件测试网 C5LmIN)s r1D
Dialog("Login").WinEdit("Password:").SetSecure PassWord51Testing软件测试网'S;v!C2N5ZiQ
Next
;u/}arn+e138711
Wv-n[_(B~"V138711
QrS{.ktXh0E138711
方式二、利用com操纵Excel51Testing软件测试网1z S.X(b }-? J:]
DataStr= Environment("TestDir")&"\data.xls"51Testing软件测试网!cb8lN"ZH@"o;n
Set ExlObj=CreateObject("Excel.Application")51Testing软件测试网7U8D?$~:e:@
ExlObj.Visible = True
RB`&_~6d ZZX.cP138711
ExlObj.DisplayAlerts = FALSE
(vC'u T%F7b#{138711
Set book=ExlObj.Workbooks.Open(DataStr)
Gjz,it-n)T:c8r138711
Set sheet=book.Worksheets("Sheet1")51Testing软件测试网 Z\.G3Ii#c:X5?$S[s
For i=2 to sheet.usedrange.rows.count
$Uf:m,e[4J138711
UserName=ExlObj.WorkSheets("Sheet1").Cells(i,1)51Testing软件测试网9v ^w@/I t^'E\
PassWord=ExlObj.WorkSheets("Sheet1").Cells(i,2)
R1k/o;tzfL138711
Dialog("Login").WinEdit("Agent Name:").Set UserName51Testing软件测试网n UBS6c5B ? a
Dialog("Login").WinEdit("Password:").SetSecure PassWord
7An\ w)nn6s'Au138711
Next
lM0M/d7{0b4b138711
ExlObj.Quit51Testing软件测试网Z9x3nc A1["wF {
Set ExlObj = nothing
e:|^G}V X\0Kj!`138711
51Testing软件测试网1B5[2oj&|
2. 数据文件以txt组织51Testing软件测试网%?m.R}{ VgU{
不多说,直接附上代码。
3WVuQ+P9|138711
Const ForReading=1
I f Z}d138711
TFilePath= Environment("TestDir")&"\data.txt"
Ds9?S+Q ?R9KNj138711
Set Fso3 = CreateObject("Scripting.FileSystemObject")51Testing软件测试网 \$f(b qI,bw8L
Set DataFile= Fso3.OpenTextFile(TFilePath,ForReading,False)
7TbwS~7T138711
DataFile.SkipLine51Testing软件测试网3J4\jtT
Do while DataFile.AtEndOfLine<>true51Testing软件测试网*KhM9e%haG$S"x
ReadString = DataFile.ReadLine51Testing软件测试网lr'ml6J%s;{"b_
DataStr=split(ReadString,",")
5N`7Da{138711
Dialog("Login").WinEdit("Agent Name:").Set DataStr(0)51Testing软件测试网:i(PW| E"R
Dialog("Login").WinEdit("Password:").SetSecure DataStr(1)51Testing软件测试网q;xB5^ CZ d
loop51Testing软件测试网:Z"}d VCt
DataFile.close
9D}rF-FV138711
Set Fso3=Nothing51Testing软件测试网] o7dv)c
+TC0q,N4RqH1l138711
}Z5|KL1d;X138711
3. 数据文件以数据库组织
@,zv l"rMz|138711
下面代码是用Access做的,其他类型数据库类似。不多说继续贴出代码。
bkF~EN0[4g138711
strDB="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\zilingold\桌面\Testdata.mdb;Persist Security Info=False"51Testing软件测试网!q/ik7u3t"V]y^:R
strTableName="data"
@~+R-_ Rjh138711
SetConn=createobject("adodb.connection")
#zu3CfI`4\ N8p138711
Set Rst=createobject("adodb.recordset")
d}E}7g!T138711
Conn.open strDB51Testing软件测试网4S6a4ph)p
Rst.open "select * from "+strTableName,Conn,2,251Testing软件测试网3[$gTct/S:JN
Dim strTest(1)51Testing软件测试网4VTddi'\*UD0Lp
Rst.MoveFirst51Testing软件测试网E,R(r&B8o%X$Jd?(F
Do while not Rst.eof51Testing软件测试网EJH6ks'g
strTest(0)=trim(cstr(Rst.fields(0)))51Testing软件测试网!g's,PU-yFf h
strTest(1)=trim(cstr(Rst.fields(1)))
x&XN1E-l(As138711
Dialog("Login").WinEdit("Agent Name:").Set strTest(0)51Testing软件测试网(w1`4_{fe:L
Dialog("Login").WinEdit("Password:").SetSecure strTest(1)51Testing软件测试网2clBd#|1{7?,b
Rst.MoveNext
H,f;t VQV3{t138711
Loop
?A x,d Fp?138711
Rst.close
yxy.zdw138711
SetConn=nothing51Testing软件测试网],t Hy p/c,y
$I,IJ!mb`y138711
51Testing软件测试网-J0cb9i^T
4. 数据文件以XML组织
r-{$vL oeN&W9{138711
XML也是会经常用到的一种方式。继续贴代码。51Testing软件测试网-Z{ X!qYL z {`G
Dim xmlDoc 'As DOMDocument需要引用xml对象51Testing软件测试网A7ROp:J'bs
set xmldoc=CreateObject("microsoft.xmldom")
,w5q j;a$@138711
xmldoc.load(Environment("TestDir")&"\testdata.xml")51Testing软件测试网?O2j9G@9w%d9X
Set Root=xmldoc.documentElement
kCp|Rm"m138711
For i = 0 To Root.childNodes.Length-151Testing软件测试网-UC!g9P8hTCEY
Set TestCases = Root.childNodes.Item(i)51Testing软件测试网WJ2TUod mK
For j = 0 To TestCases.childNodes.Length-1
|G#Sk0Ecl138711
Set TestCase = TestCases.childNodes.Item(j)51Testing软件测试网8D,Hb9J7[-p E
If cstr(TestCase.nodeName)="UserName" Then51Testing软件测试网_!p-@_*N9jNy
Dialog("Login").WinEdit("Agent Name:").Set TestCase.text 51Testing软件测试网 G*C%X4F{
end if
Df%ws8GI:oDV-T.A138711
If cstr(TestCase.nodeName)="PassWord" Then51Testing软件测试网R^*zb(N
Dialog("Login").WinEdit("Password:").SetSecure TestCase.text End If 51Testing软件测试网2[HQ xT
&nbs
Next51Testing软件测试网.tp ~\/Zx.[
Next51Testing软件测试网Q/F"\:y\9@A
Set root=nothing
B tV!^ du3_;i#^7u138711
Set xml=nothing51Testing软件测试网[|'WI^b2_
查看(454)
评论(0)
收藏
分享
管理
2009-03-29 11:41:34
上一部分说了QTP识别对象的原理,运行机制问题。接下来自然就是正确识别对象以后,如何操作这些对象。换句话说就是我们用QTP对界面上的元素都能干些什么。在测试过程中,我们要尽量模拟出用户的操作场景,验证系统在这些场景下的响应。QTP的脚本,就是让程序去实现这些操作,如单击、选择数据、输入数据等操作。
8]4SLCXvkr+o.FH138711
51Testing软件测试网#{)kEK J`%c-N]mq G
QTP正对每一种对象,均提供了一套方法。写脚本时,在对象后输入英文“.”则会自动感知,列出该对象所有支持的方法。如图51Testing软件测试网%]M~ U)X"yq/]
51Testing软件测试网!_mv7lgWi ma
W1q y$~"Ip J3w-\[138711
51Testing软件测试网&H(A(k%vBOV
6}Eh0G[CP$?S138711 学习、掌握这些方法的用法是很重的一环。这也是QTP很基础的一些应用。学习这些方法最好的方法就是挨个的自己去验证,并结合帮助文档把每个用法的要点、应用场景、作用搞明白。有些方法网上的朋友也做过详细的分析、比较,可以参考加深理解。所以在这个阶段就尽情的按“F1”吧。
N-K2v1E;B-m }u13871151Testing软件测试网&g2O4J5X]#Q.Eo
附中文帮助地址:http://bbs.ltesting.net/thread-57752-1-1.html51Testing软件测试网3j~"^ B&r)c
2\#} }$UT No$?138711 经常有朋友问我这么多对象,这么多方法,怎么能记的住呢。其实只要安下心,慢慢钻研1到2个小时,就会发现其中的规律。很多方法对很多对象都是通用的,而且方法都是相通的,所以只要把一个对象下边的方法掌握了,其他对象的方法掌握起来也就很简单了。有一些方法一点要牢记,做到就像吃饭前要拿筷子一样得心应手。如Click,Select,WaitProperty,Set,ColumnCount,GetCellData,RowCount等这种常用的方法。还有一些很相似的用法的区别要搞清楚,如:GetROProperty,GetTOProperties,GetTOProperty,GetTOProperty。这几个很相近,但从名字上很容易区分开,他们的介绍网络上已经介绍的很清楚,这里不再累述。51Testing软件测试网MH1n1T-Pf jL
"` \h*@)UEDH{{138711 Browser对象一个很有用的表示符creationTime,这个属性在写web系统的脚本时可以发挥很大作用。它是根据Browser的打开顺去去识别对象,而不会根据具体的属性。这样可以避免由于属性改变造成对象不识别的麻烦。Browser("creationTime:=1")识别得失第二个打开的浏览器。creationTime是Browser对象特有,其他对象类似属性时index和Location。
!O4x Gf#c |138711
d`+?S8Ak138711 WebTable对象,有时系统里存在多个表,但表面看是一个表而且这些表的属性都一样。但只有一个表里有数据,其他都是空表。我曾经遇到脚本不报错,但取的值一直为空就是因为这个原因。解决办法就是在属性里加上index去识别表。51Testing软件测试网M"^b;? \6p
51Testing软件测试网R"e*O$LE;@|"K[
通过对象的Object属性可以访问对象的内部方法和属性,这样可以使脚本更灵活,有时可以解决大问题。通过spy可以知道对象都有哪些内部属性和方法。如图,在Run-time列出了内部方法。
51Testing软件测试网N9z(o5s3oNl
51Testing软件测试网 g0fbc'U2w l
51Testing软件测试网~ `%|\ xSi}
51Testing软件测试网|;g1N+uC7w]Z6TtM}
代码1:
|m{J~5jX^138711
SerchText("新闻")51Testing软件测试网antah(S
Sub SerchText(testStr)51Testing软件测试网.m?u;dz
set a=Browser("name:=百度一下,你就知道").Page("title:=百度一下,你就知道").Object.body.createTextRange()51Testing软件测试网)c)O^zMS:F
b=a.text51Testing软件测试网%jfV5f?
Set regEx=new RegExp
Bv&R\-S5r4x138711
regEx.Pattern=testStr51Testing软件测试网h)hC#dgp1^
regEx.IgnoreCase=true
FL"g3rL$C5KX138711
regEx.Global=true
,n,yd4`#Y:q138711
Set Matches=regEx.Execute(b)
f[g;M*d138711
For Each Match in Matches '对Matches集合进行迭代。
$D;KU9E ~DV|c138711
RetStr = Match.Value
C3T+ARL'~*g;r WN"k138711
msgbox RetStr51Testing软件测试网j ^7VdH/e
Next51Testing软件测试网Rb&rv,fMx?4[
End Sub51Testing软件测试网ySXh`iy.WZ)L)l9T^
以上代码实现通过Object和正则表达式在页面上查找字符串功能。51Testing软件测试网/[P ~"gP
Z7i'\h'MB138711
代码2:51Testing软件测试网D,pT i N+}1{
Browser("百度一下,你就知道").Page("百度一下,你就知道").WebButton("百度一下").Object.setAttribute "value","我的搜索"51Testing软件测试网8i @+@)H0?1s\g9X
这句代码通过Object的setAttribute修改运行时按钮的value值。运行一下看看效果。运用场景:输入框需要单击激活输入状态,通过QTP脚本不能激活,此时可以通过修改运行对象的属性将其激活。
查看(452)
评论(0)
收藏
分享
管理
2009-03-20 16:22:33
本篇主要讲述Flight打开订单的正确性
测试,通过
数据库进行数据驱动测试,主要步骤和考虑思路如下:
1.从数据库中随机读取一条存在的记录
2.在Flight中打开本条记录
3.比较数据库中的数据和软件界面上的显示是否一致
- 其中数据库中读出的记录数据保存在局部变量中
- 界面显示的实际数据通过Output Value保存到QTP自带的DataTable中.
Option Explicit
Dim conn, rst, maxnumber, rndNumber, sql
Dim dbFlightNumber, dbTicketNumber, dbPlaneType, dbCustomerName
Dim oPlaneType
'------------------------------------------------------------------------------------------------------------------------------------------------------
'获取数据库中的记录数据(期望结果)
Const strConn = "Provider=MSDASQL.1;Persist Security Info=False;Data Source=QT_Flight32"
Set conn=CreateObject("Adodb.Connection")
Set rst=CreateObject("Adodb.RecordSet")
conn.open strConn
'获取最大Order_Number
sql = "select max(order_number) from orders "
rst.Open sql, conn
maxNumber = rst.Fields(0).Value
rst.Close
'随即获取一条记录
rndNumber = RandomNumber(1, maxNumber)
sql = "Select Flight_Number, Tickets_Ordered, Class, Customer_Name from orders where order_number =" & CStr(rndNumber)
rst.Open sql, conn
While rst.EOF
rndNumber = RandomNumber(1, maxNumber)
sql = "Select Flight_Number, Tickets_Ordered, Class, Customer_Name from orders where order_number =" & CStr(rndNumber)
rst.Open sql, conn
Wend
rst.MoveFirst
While not rst.EOF
dbFlightNumber = rst.Fields(0).value
dbTicketNumber =rst.Fields(1).value
dbPlaneType = rst.Fields(2).value
dbCustomerName = rst.Fields(3).value
rst.MoveNext
Wend
conn.close
Set rst=nothing
Set conn=nothing
'------------------------------------------------------------------------------------------------------------------------------------------------------
'录制脚本程序
SystemUtil.CloseProcessByName "Flight4a.exe"
SystemUtil.Run Environment.Value("ProductDir") & "\samples\flight\app\flight4a.exe"
Dialog("Login").WinEdit("Agent Name:").Set "Admin"
Dialog("Login").WinEdit("Password:").Set "Mercury"
Dialog("Login").WinButton("OK").Click
Window("Flight Reservation").WinButton("Button").Click
Window("Flight Reservation").Dialog("Open Order").WinCheckBox("Order No.").Set "ON"
Window("Flight Reservation").Dialog("Open Order").WinEdit("Edit").Set rndNumber '在这里Set 随机打开的订单
Window("Flight Reservation").Dialog("Open Order").WinButton("OK").Click
Window("Flight Reservation").Activate
'获取 界面显示的实际数据(实际结果)
Window("Flight Reservation").WinEdit("Flight No:").Output CheckPoint("Flight No:")
Window("Flight Reservation").WinEdit("Tickets:").Output CheckPoint("Tickets:")
Window("Flight Reservation").WinEdit("Name:").Output CheckPoint("CustomerName")
'将界面上的仓位转换为1,2,3
If Window("Flight Reservation").WinRadioButton("First").GetROProperty("Text") = "ON" Then
oPlaneType = 1
ElseIf Window("Flight Reservation").WinRadioButton("Business").GetROProperty("Text") = "ON" Then
oPlaneType = 2
ElseIf Window("Flight Reservation").WinRadioButton("Economy").GetROProperty("Text") = "ON" Then
oPlaneType = 3
End If
'检查Flight Number
If CStr(dbFlightNumber) = CStr(DataTable("oFlightNumber", dtLocalSheet)) Then
Reporter.ReportEvent micPass, "打开订单- Flight Number", "期望结果是:" & dbFlightNumber & ", 界面显示实际结果是:" & DataTable("oFlightNumber", dtLocalSheet)
Else
Reporter.ReportEvent micPass, "打开订单- Flight Number", "期望结果是:" & dbFlightNumber & ", 界面显示实际结果是:" & DataTable("oFlightNumber", dtLocalSheet)
End If
'检查Ticket Number
If CStr(dbTicketNumber) = CStr(DataTable("oTicketNumber", dtLocalSheet)) Then
Reporter.ReportEvent micPass, "打开订单- TicketNumber", "期望结果是:" & dbTicketNumber & ", 界面显示实际结果是:" & DataTable("oTicketNumber", dtLocalSheet)
Else
Reporter.ReportEvent micPass, "打开订单- TicketNumber", "期望结果是:" & dbTicketNumber & ", 界面显示实际结果是:" & DataTable("oTicketNumber", dtLocalSheet)
End If
'检查Customer Name
If CStr(dbCustomerName) = CStr(DataTable("oCustomerName", dtLocalSheet)) Then
Reporter.ReportEvent micPass, "打开订单- CustomerName", "期望结果是:" & dbCustomerName & ", 界面显示实际结果是:" & DataTable("oCustomerName", dtLocalSheet)
Else
Reporter.ReportEvent micPass, "打开订单- CustomerName", "期望结果是:" & dbCustomerName & ", 界面显示实际结果是:" & DataTable("oCustomerName", dtLocalSheet)
End If
'检查Plane Type
If CStr(dbPlaneType) = CStr(oPlaneType) Then
Reporter.ReportEvent micPass, "打开订单- Plane Type", "期望结果是:" & dbPlaneType & ", 界面显示实际结果是:" & oPlaneType
Else
Reporter.ReportEvent micPass, "打开订单- Plane Type", "期望结果是:" & dbPlaneType & ", 界面显示实际结果是:" & oPlaneType
End If
'Close Prog
Window("Flight Reservation").Close
查看(283)
评论(0)
收藏
分享
管理
2009-03-20 16:21:56
前面介绍的是直接使用EXCEL导入数据文件,在这里介绍使用ADODB导入EXCEL数据文件的方法。操作思想基本上是一致的,就是链接数据文件的方法不同。
Option Explicit
Dim conn, rst, fileName, strConn
Dim var, i
fileName = Environment.Value("TestDir") & "\test.xls"
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info = False;"
strConn = strConn & "Data Source = " & filename & ";Extended Properties='Excel 8.0'"
Set conn = CreateObject("ADODB.Connection")
conn.Open strConn
Set rst = CreateObject("ADODB.RecordSet")
rst.Open "select * from [Sheet1$]", conn, 1, 1
Print rst.RecordCount
i = 0
'读取Excel表格时,自动从第二行开始读起,将第一行作为Title
While Not rst.EOF
i = i + 1
Print "LINE " & CStr(i) & " : " & rst.Fields(0).Value & " " & rst.Fields(1).Value
rst.MoveNext
Wend
rst.Close
Set rst = Nothing
查看(310)
评论(0)
收藏
分享
管理
2009-03-20 16:21:10
本节共有两个实例,第一个是把
测试用例的数据写到EXCEL文件中,第二个是通过读取EXCEL文件中的数据,并把执行结果写入到EXCEL文件中。
1.对EXCEL文件进行写操作
Option Explicit
Dim fso, ddFilePath, i
Dim ExcelBook, ExcelSheet
ddFilePath = Environment.Value("TestDir") & "\ddFile.xls"
Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FileExists(ddFilePath) Then
fso.DeleteFile(ddFilePath)
End If
wait 3
Set ExcelBook = CreateObject("Excel.Application")
Set ExcelSheet = CreateObject("Excel.Sheet")
ExcelSheet.Application.visible = False
ExcelSheet.ActiveSheet.Cells(1,1).Value = "Agent Name"
ExcelSheet.ActiveSheet.Cells(1,2).Value = "Password"
ExcelSheet.ActiveSheet.Cells(1,3).Value = "Expire Value"
ExcelSheet.ActiveSheet.Cells(1,4).Value = "Fact Value"
ExcelSheet.ActiveSheet.Cells(1,5).Value = "Execute Result"
ExcelSheet.ActiveSheet.Cells(2,1).Value = "ad"
ExcelSheet.ActiveSheet.Cells(2,2).Value = "Mercury"
ExcelSheet.ActiveSheet.Cells(2,3).Value = "Agent name must be at least 4 characters long."
ExcelSheet.ActiveSheet.Cells(3,1).Value = "Admin"
ExcelSheet.ActiveSheet.Cells(3,2).Value = "Merc"
ExcelSheet.ActiveSheet.Cells(3,3).Value = "Incorrect password. Please try again"
ExcelSheet.ActiveSheet.Cells(4,1).Value = "Admin"
ExcelSheet.ActiveSheet.Cells(4,2).Value = "Mercury"
ExcelSheet.ActiveSheet.Cells(4,3).Value = "Flight Reservation"
ExcelSheet.SaveAs ddFilePath
ExcelBook.Quit
Set ExcelBook = Nothing
2.对EXCEL文件进行读写操作
Option Explicit
Dim fso, filePath, i
Dim ExcelBook, ExcelSheet, myExcelBook, myExcelSheet
filePath = Environment.Value("TestDir") & "\ddFile.xls"
Set fso = CreateObject("Scripting.FileSystemObject")
Set ExcelBook = CreateObject("Excel.Application")
Set ExcelSheet = CreateObject("Excel.Sheet")
Set myExcelBook = ExcelBook.WorkBooks.Open(filePath)
Set myExcelSheet = myExcelBook.WorkSheets("Sheet1")
For i = 2 To 4
SystemUtil.CloseProcessByName "Flight4a.exe"
SystemUtil.Run Environment.Value("ProductDir") & "\samples\flight\app\flight4a.exe"
Dialog("Login").WinEdit("Agent Name:").Set myExcelSheet.Cells(i,1)
Dialog("Login").WinEdit("Password:").Set myExcelSheet.Cells(i,2)
Dialog("Login").WinButton("OK").Click
If Dialog("Login").Dialog("Flight Reservations").Exist Then
myExcelSheet.Cells(i,4).Value = Dialog("Login").Dialog("Flight Reservations").Static("errInfo").GetROProperty("text")
If Dialog("Login").Dialog("Flight Reservations").Static("errInfo").GetROProperty("text") = myExcelSheet.Cells(i,3) Then
myExcelSheet.Cells(i,5).Font.Color = vbBlue
myExcelSheet.Cells(i,5).Value = "测试成功"
Else
myExcelSheet.Cells(i,5).Font.Color = vbRed
myExcelSheet.Cells(i,5).Value = "测试失败"
End If
Dialog("Login").Dialog("Flight Reservations").WinButton("确定").Click
Dialog("Login").WinButton("Cancel").Click
Elseif Window("Flight Reservation").Exist Then
myExcelSheet.Cells(i,4).Value = Window("Flight Reservation").GetROProperty("text")
myExcelSheet.Cells(i,5).Font.Color = vbBlue
myExcelSheet.Cells(i,5).Value = "测试成功"
Window("Flight Reservation").Close
Else
logFile.WriteLine "没有窗口弹出,测试失败!"
ExitAction
End If
Next
myExcelBook.Save
ExcelBook.Quit
Set ExcelBook = Nothing
查看(468)
评论(0)
收藏
分享
管理
2009-03-20 16:19:55
以下是对
Mercury Interactive公司的Flight飞机订票系统的Login模块进行数据驱动
测试的VBScript脚本实例,
通过对自定义TXT文件进行读写操作。
Option Explicit
Dim fso
‘数据驱动文件路径,数据文件,当前行
Dim ddFilePath, ddFile, ddCurrLine
Dim logFilePath, logFile
ddFilePath = Environment.Value("TestDir") & "\ddFile.txt"
logFilePath = Environment.Value("TestDir") & "\logFile.txt"
'====写入
测试用例数据到数据驱动文件中===='
Set fso = CreateObject("Scripting.FileSystemObject")
'OpenTextFile第三个参数如果是False表示如果文件一定要存在.
Set ddFile = fso.OpenTextFile(ddFilePath, 2, True)
ddFile.WriteLine "ad,Mercury,Agent name must be at least 4 characters long."
ddFile.WriteLine "admin,merc,Incorrect password. Please try again"
ddFile.WriteLine "admin,Mercury,Flight Reservations"
ddFile.Close
'====写入测试结果到数据日志文件中===='
Set logFile = fso.OpenTextFile(logFilePath, 2, True)
logFile.WriteLine "************************************************************"
logFile.WriteLine "************************************************************"
logFile.WriteLine "*************************测试日志***************************"
logFile.WriteLine "******************用例名称:用户登陆**************************"
logFile.WriteLine "**********************作者:Holly zhao*************************"
logFile.WriteLine "********************执行时间:" & Date & "*********************"
logFile.WriteLine "************************测试开始:**************************"
'从ddFile中读取测试数据
Set ddFile = fso.OpenTextFile(ddFilePath, 1, True)
While NOT ddFile.AtEndOfLine
ddCurrLine = Split(ddFile.ReadLine, ",")
SystemUtil.CloseProcessByName "Flight4a.exe"
SystemUtil.Run Environment.Value("ProductDir") & "\samples\flight\app\flight4a.exe"
Dialog("Login").WinEdit("Agent Name:").Set ddCurrLine(0)
Dialog("Login").WinEdit("Password:").Set ddCurrLine (1)
Dialog("Login").WinButton("OK").Click
If Dialog("Login").Dialog("Flight Reservations").Exist Then
If Dialog("Login").Dialog("Flight Reservations").Static("errInfo").GetROProperty("text") = ddCurrLine(2) Then
logFile.WriteLine "测试成功!"
Else
logFile.WriteLine "测试失败!"
End If
Dialog("Login").Dialog("Flight Reservations").WinButton("确定").Click
Dialog("Login").WinButton("Cancel").Click
Else
If Window("Flight Reservation").Exist Then
logFile.WriteLine "测试成功!"
End If
Window("Flight Reservation").Close
End If
Wend
logFile.WriteLine "==========================测试结束==================================="
logFile.WriteLine "*********************************************************************"
查看(355)
评论(0)
收藏
分享
管理
2009-03-20 14:20:15
以下讲述一个关于QTP的Test参数和Top-Level Action参数的使用例子,
有些人不知道这个参数做什么用的,尤其是Test的output不知道怎么取。
其实它是外部对象传给它的(这个外部对象可以是Quality Center,也可以是vbs这样的驱动程序)。
以下给大家讲解一个关于QuickTest的Flight的例子。
首先,在QTP里录制一段脚本,代码如下:
SystemUtil.CloseProcessByName "Flight4a.exe"
SystemUtil.Run Environment.Value("ProductDir") & "\samples\flight\app\flight4a.exe"
Dialog("Login").WinEdit("Agent Name:").Set Parameter("InAction1")
Dialog("Login").WinEdit("Password:").SetSecure "46f1f4259cf01348f5a4c630bcee96084f3d1619"
Dialog("Login").WinButton("OK").Click
Window("Flight Reservation").Close
Parameter("OutAction1") = true |
然后在QTP中进行参数设置,
1)设置Action的参数
鼠标选中Keyword View中的Action1,
点右键---Action Property,
在Parameters的Tab标签下,分别加入:
输入参数 InAction1 ,类型String;
输出参数 OutAction1,类型 Boolean。
2)设置Test的参数
在QTP的菜单File--->>Settings的Parameters的Tab标签下,分别加入:
输入参数 InTest1 ,类型String;
输出参数 OutTest1,类型 Boolean。
3)将Test和Action间参数进行关联传递
鼠标还是选中Keyword View中的Action1,点右键,
这次点“Action Call Properties”,
在Parameter Values里进行参数化传递设置,
把InTest1的值传递给InAction1,
把OutAction1的值传递给OutTest1。
以上设置完毕后,点“保存”,保存到C:\下,存为Test1好了。
最后,在你的硬盘上新建一个vbs文件,文件内容如下:
Dim qtApp ,pDefColl,pDef ,rtParams,rtParam
Set qtApp = CreateObject("QuickTest.Application")
qtApp.Launch
qtApp.Visible = True
qtApp.Open "C:\Test1"
Set pDefColl = qtApp.Test.ParameterDefinitions
cnt = pDefColl.Count
Indx = 1
While Indx <= cnt
Set pDef = pDefColl.Item(Indx)
Indx = Indx + 1
Wend
Set rtParams = pDefColl.GetParameters()
Set rtParam = rtParams.Item("InParam1")
rtParam.Value = "songfun"
qtApp.Test.Run , True, rtParams
MsgBox rtParams.Item("OutParam1").Value |
做完这步之后,保存这个vbs文件,双击执行这个vbs文件,你会发现它自动启动了QTP,而且进行了自动测试,最后还取到了运行成功与否的布尔值。
这就是关于Test、Top-Level Action参数使用的例子,它的参数的整个传递过程是:
外部vbs文件 传参数给QuickTest的Test的输入参数InTest1,然后InTest1传参数到InAction1去驱动了Action1的测试,
然后通过这个Action1得出了OutAction1的值,然后通过OutAction1传给OutTest1,最后再传回到vbs文件中。
示例用MsgBox来打出重新传回到vbs文件中的字符串。
查看(431)
评论(0)
收藏
分享
管理
2009-03-19 19:48:34
一 对同步点的理解
1)QTP的脚本语言是VBScript,脚本在执行的时候,执行语句之间的时间间隔是固定的,也就是说脚本在执行完当前的语句之后,等待固定的时间间隔后开始执行下一条语句
2)问题:假设后一条语句的输入是前一条语句的输出,如果前一条语句还没有执行完,这时候将要导致错误的发生!
3)措施:加入同步点、加入Wait语句
4)同步点Synchronization Point
QTP脚本在执行过程中如果遇到同步点,则会暂停脚本的执行,直到对象的属性获取到了预先设定的值,才开始执行下一条脚本。
如果在规定的时间内没有获取到预先设定的值,则会抛出错误信息。
例如:
Window("Flight Reservation").ActiveX("Threed Panel Control").WaitProperty "text", "Insert Done...", 10000
执行到上面这条语句时,QTP会暂停执行,直到显示”Insert Done…”,
如果在规定的时间10,000ms后text的值没有等于”Insert Done…”,则会抛出错误信息
5)如何获取Synchronization Point
A.在Recording状态下,通过Insert è Synchronization Point实现
B.非Recording状态下,在Expert View下,通过Insert è Step Generator è Category(Test Objects)è Object(The Object you’re Testing) è Operation(WaitProperty)è PropertyName、PropertyValue、TimeOut分别填写"text", "Insert Done...", 10000
6)Wait
总的来说就是死等,比如说wait 10,当运行到这条语句时,等待10秒钟后,才开始再读下面的语句。所以说写脚本的时候一定要估计好时间,否则的话会浪费运行的时间,或者出现等待时间不足的现象。
二 并列Action间的参数传递
思路:将Action1的输出参数,传递给Action2作为输入参数。
1)创建两个Action,关系是并列关系,不是嵌套的.
2)右键Action1,选Action Properties,在Output Parameters中添加参数OutAction1,点OK
3)右键Action2,选Action Properties,在Input Parameters中添加参数InAction2,点OK
4)将Action1的输出OutAction1,传递给Action2的输入InAction2
右键Action2,选Action Call Properties,弹出Action Call Properties窗口;
选中InAction2的Value,弹出Value Configuration Options窗口;
在Parameter中共有四项可供选择,选择Test/Action parameter,
在Output from previous call(s)中的Action选择Action1,Parameter中选择OutAction1;
表示Action2中的参数InAction2,是由Action1中的参数OutAction1传递而来。
以上就完成了两个并列Action间参数的传递,Action2只能调用Action1的输出参数,而不能调用Action的输入参数。
三 嵌套Action间的参数传递
参数传递思路:
将Action1的输入参数InAction1传递给Action2的输入参数InAction2,
将Action2的输出参数OutAction2传递给Action1的输出参数OutAction1。
1)创建两个Action,嵌套关系,在关键字视图,拖动Action2到Action1下面有缩进的地方
2)右键Action1,选Action Properties,
在Input Parameters中添加参数InAction1,
在Output Parameters中添加参数OutAction1,点OK
3)右键Action2,选Action Properties,
在Input Parameters中添加参数InAction2,
在Output Parameters中添加参数OutAction2,点OK
4)在Action1和Action2间建立关联
右键Action2,选Action Call Properties,弹出Action Call Properties窗口;
选中InAction2的Value,弹出Value Configuration Options窗口;
在Parameter中共有四项可供选择,选择Test/Action parameter,
在Parent action parameters的parameter中选择Action1
同理,OutAction2的Store In值为OutAction1
以上的操作就是把输入值 通过Action1的输入参数,传递给Action2的输入参数进行使用,
然后Action2运行后,将输出参数通过Action1的输出参数传递出去。
这里只是对嵌套Action进行最基本的讲解,在实际使用当中还要灵活运用。
查看(619)
评论(0)
收藏
分享
管理
2009-03-19 19:45:32
一 对象识别及存储技术基本常识
1)测试对象模型(Test Object Model)
测试对象模型是QTP用来描述应用程序中对象的一组对象类。每个测试对象类拥有一系列用于唯一确定对象属性和一组QTP能够录制的方法
2)测试对象(Test Object)
用于描述应用程序实际对象的对象,QTP存储这些信息用来在运行时识别和检查对象
3)运行时对象(Run-Time Object)
是应用程序中的实际对象,对象的方法将在运行中被执行
4)QTP的录制过程
A.确定用于描述当前操作对象的测试对象类,并创建测试对象
B.读取当前操作对象属性的当前值,并存储一组属性和属性值到测试对象中
C.为测试对象创建一个独特的有别于其他对象的名称,通常使用一个突出属性的值
D.记录在对象上执行的操作
5)QTP的回放过程
A.根据对象的名称到对象存储库(Object Repository)中查找相应的对象
B.读取对象的描述,即对象的属性和属性值
C.基于对象的描述,QTP在应用程序中查找相应的对象
D.执行相关的操作
二 对Check Point的较为深入理解
1. 定义:
将特定属性的当前数据与期望数据进行比较的检查点,用于判定被测试程序功能是否正确
Check Point可以分两类:QTP内置验证点和自定义验证点
2. QTP内置验证点实现原理及优缺点
A.录制时,根据用户设置的验证内容,记录数据作为基线数据
B.回放时,QTP捕获对象运行时的数据,与脚本中的基线数据进行比较
C.如果基线数据和运行数据相同,结果为PASS,反之为Failed.
D.优点是 操作简单方便
E.缺点是 QTP默认的检查的属性有时不符合自己的要求,如希望得到检查的属性没有在里面, 而默认的属性不需要检查等。
3. QTP内置验证点结果的应用
A.录制的验证点在没有进行调整前,仅仅是给出了检查结果是通过还是错误的
B.实际的测试过程中,可以根据验证点的结果进行不同的操作
If Window("Flight Reservation").WinEdit("Name:").Check(CheckPoint("Name:")) = True then
msgbox "oh, success!"
Else
msgbox "oh, failure!"
End If
4. 自定义验证点的应用及优缺点
A.使用条件语句对实际值和期望值进行对比,然后用Reporter对象报告结果
'检查Ticket Number
If CStr(dbTicketNumber) = CStr(DataTable("oTicketNumber", dtLocalSheet)) Then
Reporter.ReportEvent micPass, "打开订单- TicketNumber", "期望结果是:" & dbTicketNumber & ", 界面显示实际结果是:" & DataTable("oTicketNumber", dtLocalSheet)
Else
Reporter.ReportEvent micPass, "打开订单- TicketNumber", "期望结果是:" & dbTicketNumber & ", 界面显示实际结果是:" & DataTable("oTicketNumber", dtLocalSheet)
End If
B.优点是 非常灵活,前者实现的所有检查都可以用此方法来实现;
C.缺点是 代码量大,对测试人员的要求高。
5. 对Check Point的深入理解
A.个人认为在比较简单的和有Active Screen的情况下可以使用QTP内置的Check Point,在比较复杂的情况下可以通过编程和使用Reporter来完成.
B.在使用check方法时,必须先在Keyword View或者Active Screen中新建CheckPoint。否则无法对该对象进行check,系统报错说无法在对象仓库中找到此对象。如果插入检查点,系统会自动把相关的对象添加到对象库中。
我认为检查点并不是一个实实在在的对象。因为你可以对同一个对象设置不同的检查点,可以把它的某个属性既设定成True,也可以设定为False。而对象库中的对象的属性值是必须依赖于对象的实际属性值的。如果随意更改有可能无法识别。还有就是可以针对同一个对象设定多个检查点。在测试窗口中可以看到这两个检查点的名称是区分开来的。所以我认为检查点并不是实际存在的对象,而是一些类似映射的东西。
尽管检查点并不是对象库中的实在的对象,但是它必须对应到对象库中的某个实实在在的对象,好像它的一个映像一样,而且在实际的操作过程中,QTP还是把它作为一个对象来处理的。
因为我们无法像其他对象一样把“检查点对象”添加到对象库中,而QTP又认为它是个对象,所以我们无法在专家视图中直接添加检查点脚本。但是我们可以采用编成描述的方式来实现检查点的功能。
CheckPoint 是一个依赖于Object Repository(对象库)中的某个对象的“虚拟对象”。其具体含义是:如果它所依赖的QTP 对象库中的对象没有了,那么此CheckPoint 也就不存在了;这个“虚拟对象”的属性是从它所依赖的对象的属性中“抽取”出来的,它具有它所依赖的对象的一个或几个属性,但不能增加它所依赖的对象没有的任何属性。
CheckPoint 是一个“虚拟对象”的重要原因是:每个Object都能在Object Repository找到它的Name、Class Properties,而CheckPoint 在Object Repository中就根本不存在。选择脚本中的某个对象后,在Object Property 的对话框里面有个Respository按钮,点击它后,你会看到此对象在Object Respository 的Name、Class 和 Properties。
选择一个CheckPoint后,在CheckPoint Properties 的对话框里没有 Respository 按钮,在Object Respository中也找不到此CheckPoint的Name、Class 和 Properties(因为它在对象库中根本就不存在!)。
查看(479)
评论(0)
收藏
分享
管理
2009-03-19 18:06:28
前两天遇到一个
QTP脚本编写的问题。脚本需要填写一个WEB表单然后提交,表单里面有两个WebEdit“商品单价”和“购买数量”,只要在“购买数量”中填写数据,页面会立即自动计算出商品的总价。结果发现,脚本回放的时候,无法计算出总价。
经过分析发现原因是这样的。即时计算总价这个功能,是由客户端的js函数实现的,触发这个函数的事件是“购买数量”这个控件的“onkeyup”事件。在手工操作时候,我们敲击键盘会触发这个事件,但是在QTP脚本里面是这样写的:
Browser("购买").Page("订单").WebEdit("购买数量").Set "8"
这行代码是直接修改了控件的值,因此并没有触发“onkeyup”这个事件
解决这个问题也很简单,只要再增加一句代码即可:
Browser("购买").Page("订单").WebEdit("购买数量").FireEvent "onkeyup"
需要注意的是,由于开发人员的编程习惯不同,有的可能是“onkeydown”或者
其他事件,所以我们需要先弄清楚,是什么事件触发了js函数。
查看(374)
评论(0)
收藏
分享
管理
2009-03-19 18:04:41
关于
QTP动作的参数,我做了四个动作,各自进行值传递。
关键字视图如下:
以Action2为例,设置属性如下:
其代码为:
Action2获得的值就是其它动作的输出值,此时获得Action1的输出值:
直接修改Action2的动作调用参数,在Value选择值的来源。当你已经给Action1定义了输出值后,它将会在Value的列表中显示出来。
这样,我就可以从Action1到Action4各定义输入值,然后输出给下一个动作。
运行出来结果就是:
查看(307)
评论(0)
收藏
分享
管理
2009-03-19 17:57:43
在
QTP测试中,比较本地的两个文件是不是相同,需要使用VBScript的FileSystemObject对象,在此作简要的概述
一.基础FileSystemObject
1. 创建 FileSystemObject 对象
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
Scripting 是类型库的名字,而 FileSystemObject 则是想要创建的对象的名字。
要用 FileSystemObject (FSO) 对象模式来编程,则:使用 CreateObject 方法来创建 FileSystemObject 对象。
FSO 对象模式包含在 Scripting 类型库中,该库位于 Scrrun.dll 文件中。因而,要使用 FSO 对象模式,必须把 Scrrun.dll 放在 Web 服务器的适当系统目录中。
2. 使用方法:
访问现有驱动器、文件和文件夹
GetDrive()、GetFolder()、GetFile()、CreateFolder()、CreateFile()、CreateTextFile ()、OpenTextFile()、FolderExists(url)、DeleteFolder(url)、MoveFolder(src,to)、FileExists(url)、CopyFile()、MoveFile()、DeleteFile()、
例如:
Dim fso, f1
Set fso = CreateObject("Scripting.FileSystemObject")
Set f1 = fso.GetFile("c:\test.txt")
3. 访问属性:
Name、Path、Size、Type、DateLastModified(上一次修改的文件时间)
二.FSO的一些特殊功能
1. GetSpecialFolder Method 返回特定的
Windows文件夹的路径:
Windows安装目录;Windows系统目录;Windows临时目录
FSO.GetSpecialFolder([0, 1, or 2])
2. GetTempName Method 返回一个随机产生的文件或者目录名字,用于存储临数据
3. GetAbsolutePathName Method 返回文件夹的绝对路径(类似于Server.MapPath)。
比如,FSO.GetAbsolutePathName("region") 将返回类似于下面的结果:"c:mydocsmyfolder egion"
4. GetExtensionName Method 返回路径中最后部分的扩展名 (比如:FSO.GetExtensionName("c:docs est.txt") 将返回txt)
5. GetBaseName and GetParentFolder Methods 返回路径中最后部分的父文件夹 (比如:FSO.GetParentFolder ("c:docsmydocs") 将返回'docs')
6. Drives Property 返回所有本地可用驱动器的集合,用于建立资源浏览器样的用户接口。
查看(330)
评论(0)
收藏
分享
管理
2009-03-19 17:52:23
1、拆分语句split
例:取得当前日期后拆分
riqi=date()
my=split(riqi,"-")
riqi=my(1)&"月"&my(2)&"日"
datatable("riqi",DtGlobalSheet)=riqi
本地表:DataTable("a", dtLocalSheet)
riqi= year(date)& "-" & Right("0"& month(date),2) & "-"&Right("0"& Day(Date),2)
2、取得表格中某行某列的值GetCellData
例:飞机票取票价
shuA=Browser("Welcome: Mercury Tours").Page("Book a Flight: Mercury").WebTable("New York to Zurich").GetCellData(3,3)
3、取距某年某月某日的天数datediff
例:计算距2008-08-08奥运天数
datediff("d",now,"2008-8-8")
4、描述性编程text:=
例:取得某页面上某文字的链接
Browser("").Page("").Link("text:=娱乐").Click
或
neirong="娱乐"
Browser("").Page("").Link("text:="&neirong).Click
5、网页中HTML编辑器的录制
功能:验证126邮箱的发信功能正确
操作步骤:
a.录制脚本,动作包括整个发信的过程。
b.修改脚本,在输入信件主题代码后加wait 10语句
c.回放脚本,观察在邮件正文中输入的内容,回放时QTP是否写入
d.重新修改脚本,保证回放时QTP在邮件正文中写入内容
英文解决方案:
Browser("网易126免费邮--你的专业电子邮局").Page("网易电子邮箱 - xueqinzhaoqing@126.co").Frame("indexFrame").WebEdit("subject").Click
wait 1
Setting.WebPackage( "ReplayType")=2 '配置使用浏览器事件或鼠标运行鼠标操作的'方式.1 - 使用浏览器事件运行鼠标操作,2 - 使用鼠标运行鼠标操作。
Set ōbj=createobject("wscrīpt.shell")
obj.sendkeys "{TAB}"
wait 2
obj.sendkeys "abc1111"
wait 1
Setting.WebPackage( "ReplayType")=1
中文解决方案
strCopy = "软件测试."
Set ōbjIE = CreateObject("InternetExplorer.Application")
objIE.Navigate("about:blank")
objIE.document.parentwindow.clipboardData.SetData "text", strCopy
objIE.Quit
wait 1
Setting.WebPackage( "ReplayType")=2
Set ōbj=createobject("wscrīpt.shell")
obj.sendkeys "{TAB}"
wait 2
obj.sendkeys "^v"
wait 1
Setting.WebPackage( "ReplayType")=1
6.使用Multi Test Manager添加文件时可以直接往里拖的哦。
7.函数:新建记事本,改名为public.vbs例:
function ZHIRSS
ZHIRSS="RSS行业资讯分类维护"
end function
使用语句executefile "d:\zhaopin\case\denglu.vbs"或设置QTP test/settings/resources/+函数目录
8.设置动作循环:右击/actiong call properties/run on all rows
9.设置动作允许被调用:右击/action properties/general/reusable action打勾
10.QTP与MTM连接:Tools/option/run/allow other mercury products to run...
11.插入已存在的动作1)insert/call to copy of action...复制可修改
2)insert/call to existing of action...复制不可修改
12.QTP报告自动跳出设置:Options>Run>View results when run session ends
13.判断表格是否存在:
If Browser("数商3.0后台管理系统").Page("Page").Frame("main_5").WebTable("标题").Exist then
reporter.ReportEvent 0,"pass","系统显示了所有的资讯列表!"
else
reporter.ReportEvent 1,"fail","系统没有显示资讯列表!"
end if
14.获取表格行数:Browser("数商3.0后台管理系统").Page("Page").Frame("main_5").WebTable("标题").RowCount
15.注释脚本存在位置:qtp/dat/ActionTemplate.mst
16取本地文件名称Function ShowFileList(folderspec)
Dim fso, f, f1, fc, s
Set fso = CreateObject("scrīpting.FileSystemObject")
Set f = fso.GetFolder(folderspec)
Set fc = f.Files
For Each f1 in fc
s = s & f1.name
s = s & " "
Next
ShowFileList = s
End Function
wenjian=ShowFileList("D:\下载\本地下载1\")
17.取本地文件删除:del= DeleFile("D:\下载\本地下载1\")
Function DeleFile(folderspec)
Dim fso, f, f1, fc, s
Set fso = CreateObject("scrīpting.FileSystemObject")
Set f = fso.GetFolder(folderspec)
Set fc = f.Files
For Each f1 in fc
f1.delete
Next
End Function
18.sousuo2=Browser("Browser").Page("Page_4").Check (CheckPoint("2007-11-08 14:21"))
If (sousuo2)eqv(true) Then
reporter.ReportEvent 0,"",""
else
reporter.ReportEvent 1,"",""
End If
19.取参数化数据的行数,只在某几行进执行某些语句
row=datatable.GetSheet(3).getcurrentrow
If row = 3 Or row = 4 Then
20.单选框置灰zhihui=Browser("下载中心--新增下载文件").Page("下载中心--新增下载文件_4").WebRadioGroup("downloadType").GetROProperty("disabled")
If zhihui=1 Then
End If
29.取树结构
Set Desc=descrīption.create
Desc("micclass").value="WebTable"
Set List=Browser("Browser").Page("Page").Frame("main").ChildObjects(Desc)
yuqi=List(0).GetROProperty("innertext")
msgbox yuqi
yuqi=split(yuqi," ")
msgbox yuqi(1)
30.关闭所有IE
SystemUtil.CloseProcessByName("iexplore.exe")
31.创建action template.
当希望在每一个新建action时都增加一些头部说明,比如作者、创建日期、说明等,用action template
来实现最简单快捷。
方法:用记事本等文本编辑器,输入如下类似的内容:
'Company: xxxx
'Author: xxx
'Product: xxx
'Date: xx
然后将文件保存为ActionTemplate.mst,并存放到QTP安装目录下的dat目录。
32.启动IE的语句:SystemUtil.Run "iexplore.exe", "http://www.***.com"
关闭IE或其他程序的语句:SystemUtil.CloseProcessByName "app.exe"
or SystemUtil.CloseProcessByWndTitle "Some Title"
33.获取图片的名称
ObjectName = Browser(…).Page(…).Image("Find").GetProperty("Name")
34.检查某个对象是否存在,如果存在弹出对话框说明对象存在。
If Browser("Browser").Page("Page").Applet("login.html").JavaEdit("username").Exist Then
MsgBox("The object exists.")
End if
35.同步点
Browser("数商3.0制作平台").Dialog("Microsoft Internet Explorer").WaitProperty "visible", True, 120000
设置test/test settings/object synchronizationg timeout 一致
36.视图框显示为乱码时:调整原页面编码,在QTP/tools/change active screen
37.添加附件:
Browser("**").Page("**").WebFile("filePath").Click
Browser("**").Dialog("**").WinEdit("文件名(N):").Set "D:\**.jpg"
Browser("下载中心--新增下载文件").Dialog("选择文件").WinButton("打开(O)").Click
添加相应的对象
38.在图片上右击添加:tools/web event recording configuration/custom settings
webedit/event/add/onblur,onchange,onfocus,onpropertychan,onsubmit
webdlement/event/add/onclick,onmousedown,onmouseup/listen always
39.数据执行保护
方法一、右击我的电脑/高级/性能/设置/数据执行保护/为除下列选定程序之外的所有程序和服务启用DEP/添加被保护的程序。
方法二、C:/BOOT.INT修改noexecute=alwaysoff
40.在图片上右击添加:tools/web event recording configuration/custom settings
webedit/event/add/onblur,onchange,onfocus,onpropertychan,onsubmit
webdlement/event/add/onclick,onmousedown,onmouseup/listen always
41.去掉前后空格
If trim(mingcheng)=trim(yuqi) Then
42.分类树问题解决
Set Desc=descrīption.create
Desc("micclass").value="WebTable"
Set List=Browser("Browser").Page("Page").Frame("main").ChildObjects(Desc)
yuqi=List(0).GetROProperty("innertext")
msgbox yuqi
yuqi=split(yuqi," ")
msgbox yuqi(1)
43.引用自定义环境变量
Environment.LoadFromFile "D:\询价\case\环境\huiyuan.xml"
44.环境变量有2种,一种是QTP的内置变量,一种是用户自定义的变量。内置变量是可以直接就可以用,自定义环境变量需要在菜单中选择“文件”——>“设置”——>“环境”,在变量类型中选择“用户自定义”,然后进行添加,可以对添加的变量全部导出,导出的文件为.xml格式的文档。既然可以导出,那么必然可以导入.xml文件,你可以在该对话框中的选中“从外部文件导入”,然后添加其文件路径即可。(当然这些操作都可以直接使用脚本来实现,如:Environment.LoadFromFile(“FileName”))
例如:在桌面建立一个Var.xml,如下
-<Environment> //以这个开始的内部都是定义环境变量,直到以</Environment>结束
- <Variable> // 变量定义起始标识
<Name>aa</Name> // 变量名称
<Value>11</Value> // 变量值
</Variable> // 变量定义结束标识
- <Variable>
<Name>bb</Name>
<Value>22</Value>
</Variable>
- <Variable>
<Name>cc</Name>
<Value>33</Value>
</Variable>
</Environment>
然后导入本测试的环境变量文件中,在专家视图里编写下面的脚本代码:
Dim aParam3
aParam3=Environment.Value(“aa”) // 调用环境变量
msgbox aParam3
运行测试,会输出”11”
45.在HTML编辑器中写入数据
用低水平录制写入编辑器过程,增加编辑部器前的对象,加入click事件,再用TAB
例如:
Browser("广告管理").Page("广告管理").WebEdit("descrīption").Click
Window("Microsoft Internet Explorer").WinObject("Internet Explorer_Server").Type mictab
Window("Microsoft Internet Explorer").WinObject("Internet Explorer_Server").Type "aaa"
46.Browser("creationtime:=1").close
两个页面title相同无法识别时使用描述必编辑
Browser("creationtime:=1").page(title:=****).WebEdit("name:=***").Set "***"
或Browser("creationtime:=1").page(index:=1).WebEdit("index:=0").Set "***"
47.场景恢复:
当某些提示框会在不定期时有提示时,如果自动点击确定或某些按钮
1、tools/recovery scenaril manager,制作相应的提示框和要点击的按钮,并保存
2、test/settings/recovery,添加刚保存的.qrs
48.输入验证码,先提示一个输入框,在输入框内输入验证码,点击[确定],把输入的验证码框
Dim a
a = InputBox("输入名字")
49.对象库中对象名称不分为_2,_3...设置:tool/options/web/page/fram options/
crate a new page test object for为different test object descrīptons
crest a new frame. test object for为different test object descrīptions
50.验证测试输入框输入的最大允许字数功能的正确
QTP脚本代码中编写
Set aa=Browser("Browser").Page("Page").Frame("main").WebEdit("PayTypeName")
if konglen(aa,20) eqv true then
reporter.ReportEvent 0,"添加支付方式,支付方式输入框允许输入的最大字符功能正确",""
else
reporter.ReportEvent 1,"添加支付方式,支付方式输入框允许输入的最大字符功能错误",""
end if
此函数的功能为:验证测试输入框输入的最大允许字数功能的正确,函数可写在public.vbs中
Function konglen(duixiang,guifanshu)
duixiang.Click
wait 1
Setting.WebPackage( "ReplayType")=2
Set ōbj=createobject("wscrīpt.shell")
i=0
ōld="a"
xin="b"
while old<>xin
ōld=duixiang.GetROProperty("value")
i=i+1
wait 0,20
obj.sendkeys "1"
wait 0,20
xin=duixiang.GetROProperty("value")
wend
'msgbox i
If i-1=guifanshu Then
konglen=true
else
konglen=false
End If
Setting.WebPackage( "ReplayType")=1
End Function
51.超时设置:Setting("DefaultTimeout") =1000000
52.共享对象库:Set App = CreateObject("QuickTest.Application")
App.Test.Settings.Resources.ObjectRepositoryPath = "path"
53.取颜色 browser("b").page("p").Object.currentStyle“:.color
54.显示行号设置:Tools- --> Editor Options...-->General-->Show line number,
55.不同数据库检查点手动SQL写法
QTP插入数据库检查点,手动指定SQL语句的写法。
一、SQL Server格式(本地无需安装SQL Server)
connectionstring(连接字符串):
1.本地没有创建数据源的方式
DRIVER=SQL Server;SERVER=数据库IP地址;UID=用户名;PWD=密码;APP=Microsoft Office 2003;WSID=本地主机名;DATABASE=数据库名
实例:
DRIVER=SQL Server;SERVER=10.160.11.10;UID=sa;PWD=sa;APP=Microsoft Office 2003;WSID=RJHLJUN;DATABASE=dcwork
2.本地已创建数据源的方式
DSN=数据源名称;UID=用户名;PWD=密码;APP=Microsoft Office 2003;WSID=数据库的主机名;DATABASE=数据库名
实例:
DSN=LocalServer;UID=sa;PWD=sa;APP=Microsoft Office 2003;WSID=RJDCWORKTEST;DATABASE=dcwork
3.SQL语句实例(从数据库表HR_LANGUAGE_TYPE中,查询字段语言名称LANGUAGE_NAME,条件语言名称=中文,按语言名称升序排序结果)
source(SQL语句):
SELECT HR_LANGUAGE_TYPE.LANGUAGE_NAME FROM dcwork.dbo.HR_LANGUAGE_TYPE HR_LANGUAGE_TYPE WHERE (HR_LANGUAGE_TYPE.LANGUAGE_NAME='中文') ORDER BY HR_LANGUAGE_TYPE.LANGUAGE_NAME
二、DB2格式:(本地至少安装DB2 Run-Time Client Lite)
connectionstring(连接字符串):
1.本地没有创建数据源的方式
DRIVER={IBM DB2 ODBC DRIVER};UID=用户名;PWD=密码;MODE=SHARE;DBALIAS=数据库名;
实例:
DRIVER={IBM DB2 ODBC DRIVER};UID=db2admin;PWD=db2admin;MODE=SHARE;DBALIAS=DCWORK;
2.本地已创建数据源的方式
DSN=数据源名称;UID=用户名;PWD=密码;MODE=SHARE;DBALIAS=DCWORK;
实例:
DSN=DWCORKDB2;UID=db2admin;PWD=db2admin;MODE=SHARE;DBALIAS=DCWORK;
3.SQL语句实例
source:SQL语句
SELECT HR_LANGUAGE_TYPE.LANGUAGE_NAME FROM DB2ADMIN.HR_LANGUAGE_TYPE HR_LANGUAGE_TYPE WHERE (HR_LANGUAGE_TYPE.LANGUAGE_NAME='中文') ORDER BY HR_LANGUAGE_TYPE.LANGUAGE_NAME
三、Oracle格式:(本地需要安装Oracle ODBC DRIVER)
connectionstring(连接字符串):
1.本地没有创建数据源的方式
DRIVER={Oracle in OraHome92};SERVER=数据库服务名;UID=用户名;PWD=密码;DBQ=数据库名;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;
实例:
DRIVER={Oracle in OraHome92};SERVER=DCWORK;UID=DCWORK;PWD=DCWORK;DBQ=DCWORK;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;
2.本地已创建数据源的方式
DSN=数据源名称;UID=用户名;PWD=密码;DBQ=数据库名;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=F;BAM=IfAllSuccessful;MTS=F;MDI=F;CSR=F;FWC=F;PFC=10;TLO=0;
实例:
DSN=dcworkoracle;UID=DCWORK;DBQ=DCWORK;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=F;BAM=IfAllSuccessful;MTS=F;MDI=F;CSR=F;FWC=F;PFC=10;TLO=0;
3.SQL语句实例
source:SQL语句
SELECT HR_LANGUAGE_TYPE.LANGUAGE_NAME FROM DCWORK.HR_LANGUAGE_TYPE HR_LANGUAGE_TYPE WHERE (HR_LANGUAGE_TYPE.LANGUAGE_NAME='中文') ORDER BY HR_LANGUAGE_TYPE.LANGUAGE_NAME
四, mysql
Set Conn = CreateObject("ADODB.Connection" )
str="DRIVER={MySQL ODBC 3.51 Driver};SERVER=192.168.1.100;DATABASE=wp_blog;user id=zzz ; password=123456"
Conn.open str
Set Rs = CreateObject ("ADODB.Recordset" )
sql = "select * from `wp_blog`.`blg_webcategory` limit 0, 5000;"
Rs.open sql,conn,1,3
If (not Rs.eof) then
Rs.MoveFirst
MsgBox Rs(0)
MsgBox Rs(1)
MsgBox Rs(2)
MsgBox Rs(3)
end if
Rs.close
Set Rs = Nothing
Conn.close
Set Conn = Nothing
(转载于 http://bbs.51testing.com/thread-42921-1-1.html )
五. access
Set Conn = CreateObject("ADODB.Connection" )
str="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:/db1.mdb"
Conn.open str
Set Rs = CreateObject ("ADODB.Recordset" )
56.*.xml
Environment.LoadFromFile "D:\新建文件夹\a.xml"
Browser("百度一下,你就知道").Page("百度一下,你就知道").WebEdit("wd").Set Environment("HuiYuanB")
57、类似时间控件,不能手到输入的文本档
1)手工添加对象,
2).object.value="2008-4-12"
查看(446)
评论(0)
收藏
分享
管理
2009-03-19 17:39:26
使用QTP对报表中的webtable内容进行正确性验证。
基本思路是:
一:使用getcelldata(i,j)的方法遍历webtable把表格内容存入一个数组中,一般为二维数组
二:使用数据库连接组件ADODB连接后台数据库,使用数据结果集对象保存select查询结果,也是一个二维数组
三:此时区分是否需要验证排列顺序,如果需要,直接对两个二维数组进行一对一遍历比较
四:不需要验证排列顺序,或者顺序无法控制的情况下,我们需要对显示内容和查询预期内容进行比较,这时候牵涉到两个结果集的数据顺序问题,如果采用单对多遍历的情况,效率会十分低。
这时候我们换一种思路考虑,既然是验证内容,那我们就可以把二维数组的验证转换成排序一维数组比较,实现方式是,采用join方法将二维数组的每一行转换成一个字符串(内容没有变化,只加入拼接符),两个二维数组进行相同转换,成为两个一维的字符串数组。
然后使用快速排序法对两个一维数组进行一次排序,同样的机制下,如果原本内容相同,那么排序出的内容也应该相同。然后直接进行一维数组一对一比较。
下面是vbs的快速排序代码,合适数字和字符串数组:
Public Function QSort(ByRef ReArr, ByVal head, ByVal tail)
'ReArr 是待排序数组, head和tail是该数组的最小下标和最大下标
Dim lef, rig
Dim pivot
If head < tail Then
lef=head
rig=tail
pivot=ReArr(lef)
While (lef <> rig)
While (lef < rig and ReArr(rig) >= pivot)
rig = rig-1
Wend
If lef <rig Then
ReArr(lef) = ReArr(rig)
lef = lef+1
End If
While (lef < rig and ReArr(lef) <= pivot)
lef = lef+1
Wend
If lef <rig Then
ReArr(rig) = ReArr(lef)
rig = rig-1
End If
Wend
ReArr(lef) = pivot
call QSort(ReArr, head, lef-1)
call QSort(ReArr, lef+1, tail)
End If
End Function
查看(412)
评论(0)
收藏
分享
管理
2009-03-19 17:14:00
使用
QTP录制一些脚本再回放,这不难,难的是一个
测试团队共同开发脚本,并能不断的完善脚本,创建一个结构化的自动测试脚本体系。这篇文章重点讨论的是,如何管理QTP的对象仓库,以便能让对象仓库易于维护、管理。
51Testing软件测试网} Y1m3Y3[NtB 如果只是简单的录制、回放脚本,可能感觉不到对象仓库的存在。但是要做到QTP脚本的结构化管理,就必须对QTP的对象仓库进行严格的管理。
51Testing软件测试网+F[ Q!t:A#[Y51Testing软件测试网:?F!s!nV-CN 在实际
工作中我们发现,QTP脚本做好后绝不是一成不变的,而是随着需求和页面的变化,需要不断修改的。如果每次修改脚本的时候,都重新录制脚本,成本极高,所以最有效的方法是,先修改对象仓库,然后修改脚本,以适应新的系统。
51Testing软件测试网 jQU.zvf51Testing软件测试网 UW2}*t%ts 如果对象仓库里的管理比较混乱的话,修改脚本时就会遭受地狱般的痛苦,比如n多对象全堆在一起根本理不出头绪,对象的命名不知所云,找不到自己需要的对象等等。下面我们讲一下如何管理对象仓库,避免这些问题。
51Testing软件测试网"I1{|!Q^;Y6]yHL*c YT-]g$Z&X138711先介绍一下对象仓库中的对象层次,主要分为3个层次
51Testing软件测试网b~`0K!b5f"r1、Browser浏览器
51Testing软件测试网n`7T0Jnn Np*f2、Page页面
51Testing软件测试网9cHE%nO.oe3、页面中的各种对象,比如Link、Button
_k i jq3jf m13871151Testing软件测试网 _di L}$@ Browser对应的是已经打开的IE窗口对象,Page对应的是不同的网页,比如登录首页是一个Page,登录成功后跳转到我的淘宝页面,这就是另一个Page。而页面中的各种对象就比较好理解了,图片、按钮、链接都是对象。
[#xB {3Ha;n7t13871151Testing软件测试网r$jr _4|g 了解了对象层次,我们再讲一下命名。如果QTP在录制过程中自动记录对象,命名是非常乱的,缺乏逻辑性,经常看到一个Browser下面有n多“淘宝网_1”、“淘宝网_2”这样的Page,这对我们以后的管理非常不利。与其修改这些命名,我们不如用一种思路更清晰的方式,手动添加对象。
51Testing软件测试网(`$z H'n+C_KM!Q S.]i+|.{e)m3^ P138711 QTP中有一个工具实现了对象仓库的管理,Object Repository Manager,我们用它来添加对象。操作很简单,直接点击toolbar中的Add Object按钮,然后在
web上点击你需要添加的对象即可,添加过后再修改名称。更新对象也比较简单,先选中需要更新的对象,然后点击Update from Application即可。
6r [9a[C]+z%H,q138711.[(~/aAf138711 这项工作其实可以在系统页面出来以后就开始做,我们一边进行手工测试,一边把对象添加起来,为后面的脚本开发做准备。这时暂时不制作脚本。
51Testing软件测试网B*a([)JA6l51Testing软件测试网)`:L atd&BuO|XH 总结一下,对象仓库的管理要满足以下几个原则:
51Testing软件测试网 g^3\)iA!kq1、每个Browser下的Page不要太多,最好不要超过5个,即使我们的系统都在同一个IE窗口下(没有弹出新IE),我们也可以分几个Browser管理,把业务上关联较强的几个Page放在一个Browser下;
51Testing软件测试网5n7FD \ E m'w^2、每个对象都按照所代表的业务属性命名,最好用中文,不要出现一些难理解的字符,比如abc这样的。
,][a1Hs;SD1387113、尽量避免在一个tsr文件中堆放过多的对象,最好根据业务,把对象分为几个tsr文件保存。这里没有统一标准,以每个tsr文件结构清晰为宜。
51Testing软件测试网"L;A-pJm3\.X}!V(N%m1Z(V.h.u138711 现在我们完成了对象仓库的整理,好,可以开始制作脚本了。可是问题来了,录制脚本的时候,QTP能不能自动和这些对象对应上呢?QTP会不会又自动添加一堆对象进来呢?别担心,不会出现这个问题,因为我们将进行一场脚本编写的革命:放弃“录制脚本”这种传统的脚本编写方法,完全手工编写脚本
Gj'}%v-\6gF*P_+w138711
? D;kc~ces138711我们有了一套结构清楚的对象仓库以后,我们就可以轻松的手工编写QTP脚本了。
E?S6@$rRepZd138711
+~ _.TGv3e'IO$\j138711 这里可能有人会问,QTP的录制功能不是很强大么,为什么还要自己手写脚本,这样是不是更麻烦。我先说一下我对手写测试脚本的感受,供大家参考。首先,如果我们整理好对象仓库,再录制脚本,QTP就会又自动生成一批新的对象,命名很乱,再修改替换太费事;其次,录制脚本的过程如果出现问题,再重来,很麻烦;最后,也是最重要的,手写脚本时思路非常清楚,而且写完再运行,感觉非常好,呵呵。
A0nDT2t X(dzS13871151Testing软件测试网a+uB0oOm@ T#r
与编写脚本相比,脚本的维护工作同样很重要,而且维护脚本一般都是直接修改脚本,并不会去重新录制,所以开始的时候就用手写的方式,维护起来就会更轻松。
*z"{vN5L*c-S138711
U$~$M!XF5XoU138711 编写QTP脚本其实是比较简单、快速的。我们首先创建一个Test,然后把所有相关对象仓库的tsr文件和vbs文件添加到这个Test里面,下面就可以开始写了。写脚本大致会遇到这么几种情况:
IP1X9a {yc.i1387111、调用vbs函数
~ `3TiwR1387112、调用其他Test51Testing软件测试网A&^#l_e
3、打开指定的URL
s"HnWU1387114、操作页面Page上的控件51Testing软件测试网z M m fi%Y
5、添加CheckPoint51Testing软件测试网a&RaE um4kCkW
6、其他逻辑运算51Testing软件测试网`1~O:LG*iEF
51Testing软件测试网 o1G/?M1}hA @
我们分别讲一下。调用vbs函数比较简单,直接Call [函数名]。如果要调用其他的Test,那么首先点击Call to Existing Test,然后在QC中选择一个可以复用的Test,例如登录。如果登录的Test有参数,那么可以这样写:51Testing软件测试网']1To4E2Z
RunAction "Action1 [login]", oneIteration , "张三"
2` c5Lf q`138711
,C7{*{ m/x*u1r6?138711 下面的脚本要操作对象仓库了。我们先写出“Browser(”,这时就会发现,对象仓库里面的Browser对象都列了出来,然后我们选择需要的那个B对象就好。我们先从打开指定URL的脚本开始讲,打开指定的URL使用的机会比较多,特别是在Test的开始。一般我们这样写51Testing软件测试网;RI2o`!O6ELR
Browser("登录").Navigate "指定的URL"
)if6`I#JJ138711
J0Z,Fz+s138711 这里的“登录”是一个Browser对象,一般我们要选业务上符合的B对象。写完这句以后要再写:51Testing软件测试网0\"^ X4Z9z.W%d[2C
Browser("登录").Page("登录首页").Sync
}X*B?,?2@138711
Kg(`d)UW? V138711 这句的意思是等待“登录首页”这个Page加载完毕,注意不要用Wait几秒这种方式来等待页面加载结束。51Testing软件测试网ww,LED/} i
51Testing软件测试网;g5S5f{/U Tq:th
操作Page的对象是比较简单的,由于控件的类型太多,比如下拉菜单WebList、文本输入框WebEdit、按钮WebButton,这里就不一一说明了,大家看下面的一些例子吧:
a$m|0Wl U138711Browser("购买直充").Page("购买直充").WebList("游戏区").Select 151Testing软件测试网7\.re0O(B8d6h:Q
Browser("购买直充").Page("购买直充").WebEdit("PlayerName").Set "abc"
1J4d:`QC T ~138711Browser("购买直充").Page("购买直充").WebEdit("PlayerNameAgain").Set "abc"51Testing软件测试网'J1XHv"? T C5VR
Browser("购买直充").Page("购买直充").WebEdit("CheckCode").Set "8888"
)?sWFx1N!@138711Browser("购买直充").Page("购买直充").Image("Submit").Click
L(D1v7J ]s/r13871151Testing软件测试网ia9m ]F!Y$H"q
如果遇到问题,不知道怎么写,可以先用录制的方式,生成一些脚本,然后仿照脚本写就可以了。另外在Page下面有可能会有Frame对象,这个没关系,就像这样写即可:
X c1L0D3Z/OKv1H$RfU138711Browser("我的直充").Page("我的直充").Frame("直充入口").Image("立即直充").Click
dk)B[d[/^;^,ks I138711
.Il Y`u r/p.H!O/~.O138711 添加CheckPoint要稍微复杂一些,比如说我们要检查Page上的一个WebElement的显示字符是否正确,那么首选要把这个WebElement完整的写在Test里面,这一句后面需要删除:51Testing软件测试网 qs3vq0k;k1v
Browser("购买直充").Page("购买直充").WebElement("购买结果").Click51Testing软件测试网D/X&B5n]_B$x
b9V}&{0C138711 然后右击这一行脚本,选择Insert Standard CheckPoint,在弹出的CP属性窗口,设置CP的细节。确认后脚本就会自动生成一行:51Testing软件测试网a*^2WeP8L#Z l
Browser("购买直充").Page("购买直充").WebElement("购买结果").Check CheckPoint("购买结果")
P4[ ID${7Q J!vO(o2S13871151Testing软件测试网9C_3H%O6S~#qc%S3\S
最后再把上面那一行删除就可以了。51Testing软件测试网}4k;P;c(T v6LdV
U?f| Wj+U138711 其他的逻辑运算,例如循环、判断,请参考vbs脚本语法,这里不说了。51Testing软件测试网$k"x:_'BZr*u
p!k.A/Xh%Y$L5_138711 总之,手动编写QTP脚本有很多好处,我在尝试了录制和手写两种方式之后,最终选择了手写的方式,大家不妨也试试,特别是对编码有兴趣的朋友
查看(400)
评论(2)
收藏
分享
管理
2009-03-19 16:40:17
QTP调用外部api
'例1:运行一个exe文件
Extern.WinExec "d:\1.exe ", 1 |
'例2:Beep
'它让我的机器在办公室里狂响不止!
Extern.Declare micLong, "Beep", "kernel32.dll", "Beep", micLong
Extern.Beep 500 |
QTP 获取对话框中的信息
如果弹出对话框就获取上面提示信息并与表中的信息对比,不统一证明弹出的提示出错,主要用来验证
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)取一部份特征提示信息进行验证,这样我想可以节省处理时间,又可以避免长度以及空格等字符的处理
QTP获取对象属性名称用法:
GetRoProperty----从应用程序界面上获取对象属性(即,是脚本运行时,获取的对象动态属性值)
例如:获取对象库中index属性值,似乎只能用GetToProperty,因为应用程序界面上对象没有该属性,只是QTP为识别该对象创立的描述属性;
GetToproperty----从对象库中描述对象的属性,静态值
GetToProperties----获取用于标识对象的属性集;对于这个集合,有count等属性方法
QTP在执行过程中往excel中写入值
DataTable.GlobalSheet.AddParameter "Name", "liuxuedong" |
取datatable特定行的数据可以这样使用
DataTable.GetSheet("Action1").GetParameter("test\").ValueByRow(1) |
查看(568)
评论(0)
收藏
分享
管理
2009-03-19 16:01:56
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多个TestCase,TD是否可以管理)?
A:TD可以实现,可以生成测试集,一个测试集可以包含若干个测试脚本
QTP8.2本身提供一个工具Test Batch Runner但是运行完没有报告。
MI有另一个工具叫MTM(multitestmanager)
5.在QTP中如何设置使用别的浏览器(XP系统,用IE访问程序时,每次总提示屏蔽安装ActiveX插件,需要手动安装.但把这个过程录制到QTP后,回放一次是成功的。当我给某个输入框参数化了好多数据后,回放过程中,某些就会失败.
可能有两个方面可以解决这问题1、每个动作设置延迟时间2、设置为用别的浏览器。)
(失败的提示信息是 object not visible)
A:1.延迟可用WAIT X(X单位是秒)
2.可以安装插件添加新的浏览器
SystemUtil.Run "file” "params" "dir" "op'' "mode"
QTP运行可执行文件的方法及其参数
ps:建议是用IE浏览器,或者IE内核浏览器做测试
6.checkpoint检查网页,是否能实现只要网页出现乱码就返回错误报告?
A:Text not displayed能解决问题
关于Text Checkpoint的总结。
1)Text Checkpoint的检查部分分为三个部分。Checked Text、Text Before、Text After。在默认的情况下,Checked Text执行的是精确检查,其余两个部分执行的是模糊检查。Text Before(After)检查的内容可以比实际的内容少。但是不能有和是实际内容不相符的地方,否则就失败。
2) Exact match选项。如果选择了这个选项,三部分完全都进行精确检查。个人觉得和只检查checked Text部分没有区别。
3) Text not displayed。这个选项本质上就是一个结果取反的过程。就是把检查的结果给反过来,把pass变成Fail,Fail变成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服务项将被重新开启。
其实,在Windows的samples目录下,有个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.关于dtGlobalsheet与dtLocalsheet
1) dtGlobalsheet只有一个,它的index值比较特殊,它有两个index值,一个是1还有一个是内置的默认的1000。
你可以用1或者1000去引用它都是正确的。当然了,如果你用dtGlobalsheet来引用它也是正确的。这个sheet的Name叫做"Global"。注意:SheetName是区分大小写的。
2) dtLocalsheet可以用index:1001来引用,当然,也可以用2来引用。至于其它自定义的sheet嘛,你就只能用index:3来引用了。
它没有内置的默认的类似前两个那样的index值。
3) datatable这个对象只有一个。就是所有sheet的集合。或许你把它理解为excel文件比较好。
dtsheet呢?就是其中的每个sheet。所不同的就是MI为他们做了一些默认值。在我们的应用中,可能会有多个action,如:actiion1,actiion2,actiion3
这些action也分别对应有各自默认的LoaclSheet.即:actiion1,actiion2,actiion3。
如果每个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!
其它就要手动输入了!
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中出现控件调用,那么必须确保该控件在相应的Action的object 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. QTP在Debug状态,在Export View区域不能写入任何东西
A:如果你的目的是在debug过程中修改已执行过的命令,可以在Debug view的Command中执行命令,如重新执行已经执行过的命令,修改变量的值等等。
如: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中某栏link的text?
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
查看(448)
评论(0)
收藏
分享
管理
2009-03-19 15:57:37
1、鼠标事件 1.1 使用自带的Click方法 看
QTP的帮助,每个对象都有自带的Click方法,通过其中第三个参数指定具体的鼠标事件
例如:
Browser("New Page").page("New Page").WebElement("html tag:=Form").Click
0,0,micRightBtn
注意Click方法的前两个参数是相对坐标,即相对于对象控件左上角的坐标。
然而执行脚本时常常发现右键功能无法回放。这需要通过设置回放级别解决。例如:
Setting.WebPackage("ReplayType") = 2
Browser("New Page").page("New Page").WebElement("html tag:=Form").Click
0,0,micRightBtn
Setting.WebPackage("ReplayType") = 1
1.2 使用自带的FireEvent方法 具体使用参考QTP的帮助吧,需要提醒一下,右键菜单的弹出对应的是"oncontextmenu"事件,这个帮助里没有提到,当然依赖于开发的代码实现。
1.3 使用mercury.devicereplay Set devReplay = CreateObject("mercury.devicereplay")
devReplay.MouseClick absx+4,absy+4,2
1.4 使用Windows底层的mouse_event 如果上面的方法仍然不管用,就要采用更底层的方法了。不过这种方式不推荐,因为mouse_event识别的是绝对坐标,你还需要在调用 mouse_event前获取对象的绝对坐标。需要说明的是,如果没有使用MOUSEEVENTF_ABSOLUTE,函数默认的是相对于鼠标当前位置的点,用0,0表示,会被认为是当前鼠标所在的点。
Extern.Declare micVoid, "mouse_event", "user32.dll", "mouse_event", micByte,micByte,micDWord,micULong
Extern.mouse_event MOUSEEVENTF_RIGHTDOWN,0,0,0
2、键盘事件 2.1 SendKeys 最常用的模拟键盘操作的事件就是SendKeys了,具体说明一样参考QTP的帮助。
需要说明的是QTP帮助中的例子,需要做一些调整,QTP中执行不需要显示指定Wscrīpt执行
shell命令,否则会报错。正确的例子如下:
Set WshShell = CreateObject("Wscrīpt.Shell")
WshShell.sendKeys "{DOWN}"
2.2 Mercury.DeviceReplay Set devReplay = CreateObject("mercury.devicereplay")
devReplay.SendString("a")
下面这篇文章介绍的比较清楚。
http://www.51testing.com/?161787/action_viewspace_itemid_84200.html 2.3 使用Windows底层的keybd_event Extern.Declare micVoid, "keybd_event", "user32.dll", "keybd_event", micByte,micByte,micDWord,micULong
Extern.keybd_event 42,0,0,0
注意一下这里的第一个参数是10进制的。
SendKeys的使用要方便一点,但是稳定性不如后者,
Function RtClick( Obj )
absx = Obj.GetROProperty("abs_x")
absy = Obj.GetROProperty("abs_y")
Set devReplay = CreateObject("mercury.devicereplay")
devReplay.MouseClick absx+4,absy+4,2
set devReplay = nothing
End Function
查看(487)
评论(1)
收藏
分享
管理
2009-03-19 15:49:54
在使用
QTP测试WEB页面时,经常需要利用
测试对象中的Object属性来访问和操作DOM,因此,QTP自动化测试工程师非常有必要掌握一些常用的DOM知识。 下面就列举了一些常用的DOM属性、方法和集合:
常用DOM 属性
● className.同一样式规则的元素用相同的类名。可以通过className快速过滤出一组类似的元素。
● document.用于指向包含当前元素的文档对象。
● id.当前元素的标识。如果文档中包含多个相同id的元素,则返回一个数组。
● innerHTML.用于指向当前元素的开始标记和结束标记之间的所有文本和HTML标签。
● innerText.用于指向当前元素的开始标记和结束标记之间的所有文本和HTML标签。
● offsetHeight, offsetWidth.元素的高度和宽度。
● offsetLeft, offsetTop.当前元素相同对于父亲元素的左边位置和顶部位置。
● outerHTML.当前元素的开始标记和结束标记之间的所有文本和HTML标签。
● outerText.当前元素的开始标记和结束标记之间的所有文本,但不包括HTML标签。
● parentElement.当前元素的父亲元素。
● sourceIndex.元素在document.all集合中的索引(index)。
● style.元素的样式表单属性。
● tagName.当前元素的标签名。
● title.在IE中,代表元素的tool tip文本。
常用DOM 方法
● click().模拟用户对当前元素的鼠标点击。
● contains(element).用于判断当前元素是否包含指定的元素。
● getAttribute(attributeName, caseSensitive).返回当前元素所包含的某个属性,参数attributeName为属性名、caseSensitive表示是否大小写敏感。
● setAttribute(attributeName, value, caseSenstive). 设置当前元素的属性。
常用DOM 集合
● All[].当前元素中包含的所有HTML元素的数组。
● children[].当前元素包含的孩子元素。
查看(485)
评论(0)
收藏
分享
管理
2009-03-16 17:24:38
调用带有参数的操作
如果所调用的操作已定义了输入和/或输出参数,您还可以提供输入参数的值以及输出参数的存储位置,作为 RunAction 语句的参数。输入参数列在输出参数之前。
对于输入参数,可以指定一个固定值,也可以指定另一个已定义的参数(数据表参数、环境参数或调用操作的操作输入参数)的名称,输入参数将采用该已定义参数的值。
对于输出参数,可以指定一个用于存储值的变量,或者是一个已定义参数(数据表参数、环境参数或调用操作的操作输出参数)的名称。
带有参数的操作调用使用以下语法:
RunAction ActionName,IterationQuantity,Parameters
例如,假设从 Action1 调用 Action2,并且 Action2 有一个已定义的输入参数和一个已定义的输出参数。
RunAction "Action2", oneIteration, "MyValue", MyVariable
为输入参数提供 MyValue 的字符串值,并将输出参数生成的值存储在名为 MyVariable 的变量中。
RunAction "Action2", oneIteration, Parameter(ìAxn1_In), DataTable("Column1_out", dtLocalSheet)
使用为 Action1 的 Axn1_In 输入操作参数定义的值作为该输入参数的值,并将输出参数生成的值存储在 Action1 的数据表工作表中名为 Column1_out 的一列中。
查看(429)
评论(0)
收藏
分享
管理