1. 生产随机数列
第一种方法:
randomize'更新反回的数据
funcation rand(k,n)
n=int((k-1)*rnd+1)
rand=n
end funcation
第二种方法:
n=randomnumber.value(1,255)
2. 当运行到表中的某一行,自动导出表中的所有数据
row=datatable.getcurrentrow
if row="5" then
datatable.export("d:\data.xml")
end if
3. webedit("txtpass").setsecure"sdsdf...."
如果参数化密码,可以直接在数据表中写入未加密的密码,它会自动识别,即不用把setsecure改为set
4. 如果弹出对话框就获取上面提示信息并与表中的信息对比,不统一证明弹出的提示出错,主要用来验证
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("kai",dtlocalsheet)="nanjing"
datatable.value("num")只在global形式下的一种省略形式;完整形式是datatable.value("num",dtlocalsheet)
——取得某一具体行的值:
datatable.setcurrentrow(n);
msgbox(datatable.getsheet("global").getparameter("kai").Rawvalue)
或者
kk=datatable.Rawvalue("kai","action1")
-------------
for i=1 to 3
DataTable.SetCurrentRow(i)
DataTable.Value("A","Global")=I //DataTable.SetNextRow
next
-------------
——在run-time期间,添加一个action和参数
kk=datatable.addsheet("name").addparameter("kai","ddd"). name'/value
6.
with dialog("name") //可以省好多代码,看着也简洁
content=.wintreeview
end with
7.
wintreeview.select(item) (根是0,列表第一个也是0)
wintreeview.getcontent
wintreeview.getitem(整行)+";"+
winlistview.getitem(行中的第一个字符段)
wincheckbox("").set"off"'/on
8. 数据库检查点:
sub getdata
set con=createobject("adodb.connection")
con.open("descrīption=mod;driver=sqlserver;server=hp\sqlserver;uid=sa;"&_
"pwd=11111;APP=qtp;WSID=hp;database=MOD31"
//用sqlserver方式
Con.open "DRIVER = {Microsoft Access Driver (*.mdb)};DBQ=D:\Testdb.mdb"
//用access方式
set record=createobject("adodb.recordset")
sql="select * from m3_program"
//选择具体满足一条件的:sql="select* from m3_program where "
record.open sql,con
if(record("p_name")="kai") then
num=num+1;
end if
if(not record.eof) then
record.movenext
msgbox("p_name")
end if
record.close
set record=nothing
con.close
set con=nothing
end sub //如果没有查到内容,在结果中不会报错,也不会弹出窗口
9.
vbcr----chr(13)回车符
vblf----chr(10)换行符
vbcrlf----chr(13)+chr(10)结合
10. 从stel run has two ways
11. 对于时间,日期等的格式检查(一种是正则表达式,另一种是输出对比,如果不好对比,用mid截取一部分对比)
12.
查看(697)
评论(0)
收藏
分享
管理
2007-05-22 16:57:12
1、简介
(译)作为AQtest的后续产品,TestComplete是一个项目开发中的自动化测试工具。它能测试任何window应用程序,可以完全对项目代码中对象类进行存取,这些对象可用不同语言写成,包括VC++,VB,Delphi,C++ Builder,Java或.Net及web应用。用TestComplete,你的项目可以通过额外的脚本测试或项目本身的代码测试,或二者混合兼之。TestComplete完全支持单元测试,功能测试以及每日的回归测试。
2、原理分析
TestComplete分析操作系统中启动的进程,并将每个进程中的窗口或线程之类的东西称之为Window。一个应用进程可能有很多个Window,这可以通过TestComplete提供的Object Browser看的很清楚。之所以能够重复执行脚本,首先是能够在每次都找到相同的线程名称和window名称,如果不同的环境下无法保证他们的相同,TestComplete就没办法找到脚本执行的入口点。
在如下脚本:
var p, w
p = Sys.Process("java", 2)
w = p.Window("SunAwtFrame", "InterTrade Settlement System")
操作系统可以认为是Sys, 具体线程为p,而操作的窗口为w, 如果录制脚本和测试时的环境不同,即p和w不同,那么无法进行下一步,必须手工改为与测试环境相同。
保证了上述内容,然后,录制操作者的动作并生成脚本。其原理就是记录下操作者的IO操作,如鼠标和键盘的动作,并译成脚本。
测试过程,挨个解释执行记录的脚本动作而已,如果是全键盘操作,比较好控制,如果有鼠标操作,因为无法保证测试和录制的鼠标有相同的控件定位,所以可能会失败。要全部用键盘操作才行。
3、安装
现有版本: V2.04 和 V3.04(Trial Demo)
注册码: User Name: CLUSTER
Company Name: BLiZZARD
Code: CLU!-BLZ!-61898056
(V2.04 和V3.04均可用此注册码)
工具厂商网址: http://www.automatedqa.com/
4、安Settlement中键盘模拟鼠标操作
在TestComplet录制脚本过程中,如果有用鼠标的操作,将使脚本的的重复执行具有大大的不可靠性(比如由于每次操作的界面定位不同,或不同机器的大小,或分辨率不同),因此必须用键盘完成所有的动作,这样的脚本才具有完全的可重复性。
用键盘操作所有的动作,具体到Settlement系统中一些焦点移动的按键如下:
TAB |
向下一个控件移动焦点,(控件的级别是相等的, 如在同一个grid的一行中,来回循环,不能跳到上一层) |
Shift+TAB |
向上一个控件移动焦点(控件的级别是相等的,同上) |
Ctrl +TAB |
向下一个控件移动焦点,(控件的级别不必相等的, 如在同一个grid的一行中,到最后一个可以跳出这一行) |
Shift+Ctrl+Tab |
向上一个控件移动焦点(控件的级别不必相等的,同上) |
Enter |
向下一个控件移动焦点或将触发事件,如打开搜索页面的图标,或触发事件并移动焦点到下一个控件 |
ALT+↑(ALT+↓) |
用于选择展开下拉框的内容。下拉框中按Enter选择 |
PageUp/PageDown |
对于较长的页面,显示焦点控件所在的位置,如果已经显示了当前焦点,按此键可能无效 |
space |
当焦点为checkbox,按空格控件打勾或去掉勾 |
对于特殊的几个控件,原则上可以直接输入,以免引起不必要的操作上的麻烦,如日期弹出页面、instrument和ClientAcc弹出搜索页面。
查看(2780)
评论(9)
收藏
分享
管理
2007-05-22 16:51:54
'*******************************************************************
Dim ExcellApp '<--As Excel.Application
Dim excelSheet '<--As Excel.worksheet
Dim workbook '<--As Excel.workbook
Dim excelbook
Dim a
a=now
a=Cstr(a)
s = Utilities.StringReplace(a, ":", "-",3)
s=mid(s,1,len(s)-3)
Set ExcelApp = CreateObject("Excel.Application")
Set ExcellApp = CreateExcel(result,myvar)
ExcellApp.Activeworkbook.saveAs "C:\"+"????测试"+s+".xls"
ExcellApp.Quit
Set ExcellApp = nothing
end sub
'*******************************************************************
Function CreateExcel(result,myvar) '<--As Excel.Application
Dim excelSheet '<--As Excel.worksheet
Set ExcelApp = CreateObject("Excel.Application") '<--Create a new excel Object
ExcelApp.Workbooks.Add '<--创建表头
ExcelApp.Visible = True
Set CreateExcel = ExcelApp
Set NewSheet = ExcelApp.Sheets.Item(1)
row=1
NewSheet.Name = "NetTestTools测试结果"
NewSheet.Rows(1).Font.Bold = True
NewSheet.Columns("A:A").ColumnWidth = 40
NewSheet.Columns("B:B").ColumnWidth = 50
NewSheet.Columns("B:B").HorizontalAlignment = -4108
NewSheet.Columns("C:C").ColumnWidth = 10
NewSheet.Columns("C:C").HorizontalAlignment = -4108
NewSheet.Columns("D:D").ColumnWidth = 20
NewSheet.Columns("D:D").HorizontalAlignment = -4108
NewSheet.Cells(row,1)="测试项目ID序号"
NewSheet.Cells(row,2)="错误信息"
NewSheet.Cells(row,3)="测试结果"
NewSheet.Cells(row,4)="测试时间"
NewSheet.Cells(row,5)="备 注"
'''''''''''''''''''''
for i=2 to 72
if result(i-1)="" then '<--写正确信息
ExcelApp.Application.Visible = True
ExcelApp.Windows(1).Visible = True
' add a new Workbooks and a new Sheet
'Set NewSheet = ExcelObj.Sheets.Item(1)
Set NewSheet = ExcelApp.Sheets.Item(1)
'row=1
NewSheet.Name = "NetTestTools测试结果"
NewSheet.Rows(1).Font.Bold = True
NewSheet.rows(i).font.colorindex=5
'NewSheet.rows(i).font.colorindex=5
'NewSheet.Cells(i,1)="ID"+cstr(j)
NewSheet.Cells(i,1)="ID"+cstr(i-1)+myvar(i-1)
NewSheet.Cells(i,2)="测试已完成"
NewSheet.Cells(i,3)="Pass"
NewSheet.Cells(i,4)=Now
'ExcelObj.Save
'ExcelObj.close
else
ExcelApp.Application.Visible = True '<--写错误信息
ExcelApp.Windows(1).Visible = True
'add a new Workbooks and a new Sheet
'Set NewSheet = ExcelObj.Sheets.Item(1)
Set NewSheet = ExcelApp.Sheets.Item(1)
'row=1
NewSheet.Name = "NetTestTools测试结果"
NewSheet.Rows(i).Font.Bold = True
NewSheet.rows(i).font.colorindex=3
NewSheet.Cells(i,1)="ID"+cstr(i-1)+myvar(i-1)
NewSheet.Cells(i,2)=result(i-1)
NewSheet.Cells(i,3)="Fail"
NewSheet.Cells(i,4)=Now
'ExcelObj.Save
'ExcelObj.close
end if
next
End Function
查看(555)
评论(0)
收藏
分享
管理
2007-05-22 16:49:11
NewSheet.Columns("B:C").WrapText = 1
NewSheet.Columns("B:C").Orientation = 0
NewSheet.Columns("B:C").AddIndent = 0
NewSheet.Columns("B:C").ShrinkToFit = 0
NewSheet.Columns("B:C").MergeCells = 0
查看(482)
评论(0)
收藏
分享
管理
2007-05-22 16:48:35
Dim xl
打开excel文件
Function OpenExcelFile(strFilePath)
Set xl = CreateObject("Excel.Application")
xl.Workbooks.Open strFilePath
End Function
获得指定单元格数据
Function GetCellData(strSheet,rwIndex,colIndex)
GetCellData = xl.WorkSheets(strSheet).Cells(rwIndex,colIndex)
End Function
填充单元格数据
Function PutCellData(strSheet,rwIndex,colIndex,varData)
xl.WorkSheets(strSheet).Cells(rwIndex,colIndex) = varData
End Function
保存并推出
Function SaveAndQuit()
xl.Activeworkbook.save
xl.Quit
Set xl = nothing
End Function
查看(523)
评论(0)
收藏
分享
管理
2007-05-22 16:47:27
这两周我开始学习QTP测试我们的web服务了;大体的软件使用操作流程是懂了,但具体实施起来特别是代码的组织及函数应用还有一些困难,因为自己只会vb没学习vbscrīpt,所以想和大家交流一下代码等一些基础知识;呵呵,一起学习,加强记忆与应用
1 生产随机数列
第一种方法
randomize'更新反回的数据
funcation rand(k)
n=int((k-1)*rnd+1)
rand=n
end funcation
第二种方法
n=randomnumber.value(1,255)
2 当运行到表中的某一行,自动导出表中的所有数据
row=datatable.getcurrentrow
if row="5" then
datatable.export("d:\data.xml")
end if
3
webedit("txtpass").setsecure"sdsdf...."
如果参数化密码,可以直接在数据表中写入未加密的密码,它会自动识别,即不用把setsecure改为set
4 如果弹出对话框就获取上面提示信息并与表中的信息对比,不统一证明弹出的提示出错,主要用来验证
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形式下的一种省略形式;完整形式是:
datatable.value("num",dtlocalsheet)
-----向某一列的单元格赋值:
datatable.value("column_name",dtlocalsheet)="nanjing"
-----取得某一行具体值:
datatable.setcurrentrow(n)
msgbox(datatable.getsheet("global").getparameter("column_name").Rawvalue)
或者kk=datatable.Rawvalue("column_name","action1")
----在run-time时,动态添加表格与数据
kk=datatable.addsheet("sheet_name").addparameter("column_name","value").name;
7 wintreeview一些操作
选择一个条目:wintreeview.select(item)'根是0
根的名称:wintreeview.getitem(0)
8 数据库检查点模块:
sub database_check
set con=createobject("adodb.connection")
con.open "Descrīption=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 换行符
vbcr----chr(13)回车符// vblf----chr(10)换行符
vbcrlf----chr(13)+chr(10)结合//type(chr(13)就相当于按了一上键盘上的enter
10 Run from step有两种方式:
在Keyword View模式会从本步骤运行到所有action结束
在expert view模式仅会将本action运行结束
11 由于对象属性原因,无法识别对象
-----对于对象属性是变化的,可以参数化/或者用正则表达式
-----报匹配多个对象错误,可以spy查看对象,添加一个该对象另一个唯一标识属性
-----有时可以删除对象的变化的属性来解决识别问题
------对于多个完全相同的对象,可以采用添加index,location,createtime等特殊属性来识别
(index:按照程序源码,绘制对象的先后标识对象,所以与其它相同对象是相互依赖,当其它对象发生
变化后,原先的所有对象index属性要发生变化,开始是0;如index:=0;
location:根据对象的位置进行确定,从上到下,从左到右;
CreateTime:按照对象被浏览器打开的先后标识对象)
------另外换一种思维方式,采取等效的方法;比如用键盘代替鼠标或用操作系统本身特性去解决问题
12 对系统文件的操作
-------从系统的文件中获取信息及删除文件
get_file_infor("c:\she.mpg")
function get_file_infor(url)
dim fso,f
set fso=createobject("scrīpting.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("scrīpting,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 等待某个对象出现方法
y=......waitproperty("visible",true,10000)
14 防程序中断方法
On error resume next
On error goto handle
15 数组的应用:
name=array(1,2,"aa","bb")
name(2)="aa"
16 正则表达式应用模板
进行日期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])|(1\d)|(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 返回一个字符串在另一字符串中的位置
instr(string1,string2)
18 有时回放出现找不到对象时,可能不是由于你的代码问题,而是由于你的操作系统等设置问题;
举例说明1:
比如:你录制一个选择磁盘中的文件动作
会录制为:
.winlistview(" ").drap 46,99
.winlistview(" ").draponitem "she.mp3"
下次录制的时候,如果你的系统文件改为不显示扩展名,下次执行的时候,QTP就找不到she.mp3,只能找到she;
举例说明2:
有时由于不同操作系统以及不同的ie,导致有些窗口不能识别,比如在2000下弹出的网页对话框的标题是:
“web对话框",而在2003上是”网页对话框"
19 "is+*"类型function
isarray'是否是数组
isconnected'判断QTP是否连接到TD
isdate'是否是合法的日期类型
isempty'判断是否初始化
isNull'判断是否为空值
isNumeric'判断是否是数字型
isobject'判断是否一个功能对象
isready'判断设备是否准备就绪
isRootFolder'是否是根目录
20 Action之间的参数传递
例如:在Action1中,有如下代码:
out_str="This is out_string"
RunAction "Action2",oneIteration,out_str
在Acton2中,在其step->Action Properties中的,input参数栏,加入out_str后,
msgbox(parameter("out_str")),就能正确显示参数了
21 Wscrīpt.Shell的一些应用
set WshShell =CreateObject("Wscrīpt.Shell")
WshShell.SendKeys "{ENTER}" '模拟键盘进行操作
WshShell.AppActivate "Calculator" '启动应用程序
22 获取对象属性名称用法:
GetRoProperty----从应用程序界面上获取对象属性(即,是脚本运行时,获取的对象动态属性值)
例如:获取对象库中index属性值,似乎只能用GetToProperty,因为应用程序界面上对象没有该属性,只是QTP为识别该对象创立的描述属性;
GetToproperty----从对象库中描述对象的属性,静态值
GetToProperties----获取用于标识对象的属性集;对于这个集合,有count等属性方法
23 FireEvent的使用-
可以对一个对象进行更复杂的操作
如:FireEvent("onfocus") '使一个控件获取焦点
FireEvent("ondblclick") '实现双击/也可以在事件设定中针对该对象事件响应
24 模板的应用
-----新建一个文本,输入一些新建Action时常包含的信息,然后保存为ActionTemplate.MST文件,
并复制到QTP/dat目录下;这样每次新建action都会包含固定的信息了;
例如:
'-------------------脚本说明---------------
'产品版本: __Build( )
'测试员:
'编写日期:
'测试功能:
'脚本类型:
'被测试对象初始状态:
'进展程度:
'基本思路:
'主要功能函数:
'历史修改:
'没解决的问题:
'--------------------脚本内容-------------
25 在对象库中,两个对象有时不能通过更改属性或命名来达到两个对象完全一致的替换;
在web-mod项目中,我在对象库里添加了一个自动含有index标识属性的对象,然后每次通过SetToproperty来改变
index值,对对象进行数据驱动,使其操作另一个对象,但脚本始终操作原先index属性值的对象;后来,把该对象
删除掉,重新添加一个不自动含有index标识属性的该类对象,然后,手工添加,index标识属性,后来脚本能正常 工作了,可见两次的对象属性完全一致,但形成方式不一样,导致的结果往往也不一样;
26 childobject的应用
childobject可以返回界面上满足条件的对象集合,而且与对象库里是否有这些对象无关,这就可以简化对象库;
返回的对象集合的count方法可以返回对象个数,这就可以通过下标对单个对象进行操作;在出现index标识对象时
可以进行运用
如:Set m_WinCheck=Descrīption.Create()
m_WinCheck("nativeclass").Value="Button"
set All_WinCheck=Window("").Dialog("").Childobject(m_WinCheck)
n=All_WinCheck.Count()
for i=0 to n-1
All_WinCheck(i).Set "ON"
next
再加三个
27 Create Log File:
Dim LOGFile, fso, MyFile
LOGFile="C:\Log.txt"
Set fso = CreateObject("scrīpting.FileSystemObject")
If fso.FileExists(LOGFile) = False Then
Set MyFile = fso.CreateTextFile(LOGFile, True)
MyFile.Close
end if
Set MyFile = fso.OpenTextFile(LOGFile, 8, True)
MyFile.WriteLine("")
MyFile.WriteLine(" " & Cstr(Now) & " ---------------------------------------------------------")
MyFile.WriteLine("LOG Information!")
MyFile.Close
28 数据输入输出方法
数据输入输出的方法:
1 ExecuteFile"e:\kk.vbs"
2 Environment.LoadFromFile("e:\k.xml")
3 Datatable.ImportSheet/Import
4 GetData from DataBase
5 Datatable autofill
6 Action input/output
7 Use GetxxProperty to get data from Object
8 Use Some Function to Product data
查看(928)
评论(0)
收藏
分享
管理
2007-05-22 16:45:07
本例还是以QTP安装后自带的Flight Reservation为例来录制脚本.首先我们把登录程序系统,然后新建定单,再打开定单,最后关闭系统.分别录制成5个action,设置一个主的action为main来分别先后调用login(登录),new order(新建定单),open order(打开定单),logout(退出).
注明:设置拆分action,选择菜单功能split Action .选择independent of each other为并列的两个action.选择Nested为主次的两个action.
全部录制完所有action后,在main action中代码如下:
RunAction "login", oneIteration
RunAction "new order", oneIteration
RunAction "open order", oneIteration
RunAction "logout", oneIteration
其中RunAction是一个调用action的函数,后面跟action名和要传递的参数.
说明:
RunAction ActionName, [Iteration , Parameters]
在这里我再引入action之间参数传递.在login action中选择菜单选项,在action properties中设置两input参数分别先后为username 和 passwd.
这样我们就通过RunAction "login", oneIteration,"mercury","mercury" 把这两个变量分别传给username 和passwd.这边的变量先后关系分别依次对应了action properties里input参数的先后关系.
这样我们就可以在login action中调用这两个变量了.
Dialog("Login").WinEdit("Agent Name:").Set Parameter("username")
Dialog("Login").WinEdit("Password:").Set Parameter("passwd")
Dialog("Login").WinButton("OK").Click
下面再来实现从一个action中传出一个变量给另一个action.
那么我们在new order 中选择菜单选项,在action properties中设置一个output参数为orderno
Window("Flight Reservation").WinEdit("Order No:").Output CheckPoint("Order No:")
通过上面这句话把生成的定单号的值存放到这个ouput参数中
RunAction "new order", oneIteration,order
RunAction "open order", oneIteration,order
再靠main action中这个order变量来传递,这个变量正好对应着new order里的output参数.从new order中传出来,再把这个变量传给open order.当然在open order中还要同样设置input参数.和这个order变量对应起来.
这样就可以在open order中使用这个变量了.
Window("Flight Reservation").Dialog("Open Order").WinEdit("Edit").Set Parameter("orderno")
当然其实两个action之间传递参数还可以更简单点.比如一个脚本中 datatable和环境变量都是全局的,在一个脚本中的任何action都能使用.所以可以借用这两个来传递.
通过这个例子最主要讲的是两点,拆分action和action之间的参数传递
查看(641)
评论(0)
收藏
分享
管理