QTP许可证密钥的破解步骤:
以前使用QTP9.2 使用此方法成功破解,现在本人使用的HP QuickTest Professional 11 英文版,也成功适用。
一、准备工作:
1. 由于注册码文件自动生成到C:Program FilesCommon FilesMercury InteractiveLicense Manager目录下,所以如果缺少这个路径文件,请先创建;
2. 关闭杀毒软件。
二、运行注册码应用程序
1. 下载QTP注册机-见附件,应用程序mgn-mqt82.exe,双击运行,来创建注册码,见页面提示:
-- e!l console v1.01 ---
Geting MachineID...
MachineID: 8-45036
Generating License...
License Generated Successfuly.
License Saved: 'C:Program FilesCommon FilesMercury InteractiveLicense Managerlservrc'.
All Done!
注:如果提示框没有出现:'C:Program FilesCommon FilesMercury InteractiveLicense Managerlservrc',请先确保Mercury Interactive、License Manager文件夹是否创建,lservrc不用手工创建,当运行注册码运用程序时会自动生成。
2. 进入‘C:Program FilesCommon FilesMercury InteractiveLicense Manager’目录下,打开lservrc文件,Copy文件第一行或者第三行以#结尾的的字符串,此字符串就是注册码;
3. 打开QTP应用程序,选择License Type: Seat License, 在注册码输入框paste注册码。
当出现提示信息:License Type installed successfully
恭喜你!注册成功
四则运算生成脚本的方法:
在Automation的record and Run Settings中加入计算器程序URL
首先录制一个5+3的运算生成脚本,然后我们来逐步完善加强。
Window("计算器").WinButton("5").Click
Window("计算器").WinButton("+").Click
Window("计算器").WinButton("3").Click
Window("计算器").WinButton("=").Click
Window("计算器").WinButton("CE").Click
Window("计算器").Close
1.首先,我们因为我们打开计算器的地址不同,如果想把脚本下来以后用,打开的地址需要每次设置,所以我们把录制设置里的地址去掉,改成手动在脚本里添加打开方式,当然这一步也可以不做。在脚本最前面加上打开计算器
If Window("计算器").Exist(2)<> true Then
SystemUtil.Run "C:WINDOWSsystem32calc.exe"
End If
2.输入第一个数字,我们希望的是1-5位数字,比如一个三位数,是不是我们需要在计算器上点击三个数字,所以click操作得点击三次,
所以我们需要给他一个数字的位数,数字的位数我们给他一个变量first_length,这个变量取值是一个1-5位的随机 数RandomNumber(1,5).
然后开始在计算机上点次数,所以用for语句 For i=1 to first_length(从1到first_length随机生成几个数字就点几次
然后给一个0-9的随机数字num=RandomNumber(0,9),就是计算器当前点的数字是几。
把Window("计算器").WinButton("5")中的5换成num,得是字符型的Winbutton(Cstr(num)),运行一下报错,说没找到按钮,在对象库中不存在,所以我们需要把计算器的所有东西都加到对象库中用object repository。
然后在运行一次。那么计算中的第一位数字设置完成了
计算中的第二位数字跟第一位是一样的,所以脚本直接复制过去,把变量换成second_length
3.下面开始增强运算符号,我们录制的是加法运算,但我们要做的是四则运算,所以这个运算符是随意的,让它自己随机在加减乘除中选择,给一个变量oper_num=RandomNumber(1,4),如果随机生成1,那么就点击加号,生成2时减。。。
我们用select case语句。oper_num=RandomNumber(1,4)
Select Case oper_num
Case 1
Window("计算器").WinButton("+").Click
Case 2
Window("计算器").WinButton("-").Click
Case 3
Window("计算器").WinButton("*").Click
Case 4
Window("计算器").WinButton("/").Click
End Select
4.前面的值都设置完了,下一步我们想是不是要把计算结果看下是否正确,那我们把点击=后的结果输出来。这时我们打开active screen预览窗口,找到点击等号那个屏,在计算结果处右击选择insert output value,选择text那个值输出,然后弹出界面选择输出到哪里,我们输出到data table中的一列,写一个名字actual_result。选择放到当前步骤后面after current step.也就是按完等号之后把结果输出来的操作。这时我们看到点击等号后的脚本后面生成一句代码Window("计算器").WinEdit("Edit").Output CheckPoint("Edit")
运行一下
这就是一个最简单的1-5位的四则运算。
6.但是我们在实际中并不是只跑一次,我们得跑很多次,所我们需要在整个脚本的前面加一个for...next循环,让他多跑几次。我们可以设置10次。for times=1 to 10 。
7.我们还有一个问题,刚刚我们让点击等号后的结束输出了,现在我们跑十次,那我们最后十次的结果都输出,最后显示的只能是最后一次的运算结果。因为我们是在这个action给他for的,所以只写到第一行里。
这时我们可以把计算结果的文本值手工拿出来赋值到actual_result列的下面几行。
Data Table.value("actual_result,",dtGlobalSheet)=Window("计算器").WinEdit("Edit").GetROProperty("text"),
这是赋值的,这样还是会赋值到第一行,所以还得在这段脚本前面加上行号,Data Table.SetCurrentRow(times)(当前运行到哪一行,就执行下面语句给他赋值)(times是for循环的那个times)
8.运行一下,这时有可能出现总跑不完的问题,这时把file-》setting中的run改成只迭代一次,因为我们设置的for循环语句跑十次,是这个action里面跑十次,但是这个action还得按照setting中设置的迭代次数跑,这样就是相当多遍,所以我们改成一次迭代,就相当于只跑十次了
当然也可以设置一个预期结果except_result用来比对实际与预期结果,并且给个状态status,相同就pass,不相同就fail。
脚本里,第一个数字点击完成next后加入代码:first_num=Window("计算器").WinEdit("Edit").GetROProperty("text"),这就是计算机运算的第一位数字,然后第二位second_num=Window("计算器").WinEdit("Edit").GetROProperty("text")
这两位经过运算让他显示在data table的expect_result中
在等号后,Select Case oper_num
Case 1
Data Table.Value("expect_result",dtGlobalSheet)=CDbl(first_num)+CDbl(second_num)
Case 2
Data Table.Value("expect_result",dtGlobalSheet)=CDbl(first_num)-CDbl(second_num)
Case 3
Data Table.Value("expect_result",dtGlobalSheet)=CDbl(first_num)*CDbl(second_num)
Case 4
Data Table.Value("expect_result",dtGlobalSheet)=CDbl(first_num)/CDbl(second_num)
End Select
至于结果的比对,自己去写下。
当然我们的脚本还是有些漏洞,比方说除时除数不能为零等,这个自己去研究完善下。
四则运算具体的脚本语言:
For times=1 to 2
SystemUtil.Run "C:WINDOWSsystem32calc.exe","","C:WINDOWSsystem32","open"
first_length=RandomNumber(1,5)
For i=1 to first_length
num1=RandomNumber(0,9)
Window("计算器").WinButton(Cstr(num1)).Click
Next
first_num=Window("计算器").WinEdit("Edit").GetROProperty("text") 做判断时取的第一个数的值
oper_num=RandomNumber(1,4)
Select Case oper_num
Case 1
Window("计算器").WinButton("+").Click
Case 2
Window("计算器").WinButton("-").Click
Case 3
Window("计算器").WinButton("*").Click
Case 4
Window("计算器").WinButton("/").Click
End Select
sencond_length=RandomNumber(1,5)
For i=1 to sencond_length
num2=RandomNumber(0,9)
Window("计算器").WinButton(Cstr(num2)).Click
Next
second_num=Window("计算器").WinEdit("Edit").GetROProperty("text") 做判断时做的第二个数的值
Window("计算器").WinButton("=").Click
DataTable.SetCurrentRow(times) 当前行数
DataTable.value("actual_result",dtGlobalSheet)=CDbl(Window("计算器").WinEdit("Edit").GetROProperty("text")) 把实际结果赋值
Select Case oper_num
Case 1
DataTable.Value("expect_result",dtGlobalSheet)=CDbl(first_num)+CDbl(second_num)
Case 2
DataTable.Value("expect_result",dtGlobalSheet)=CDbl(first_num)-CDbl(second_num)
Case 3
DataTable.Value("expect_result",dtGlobalSheet)=CDbl(first_num)*CDbl(second_num)
Case 4
DataTable.Value("expect_result",dtGlobalSheet)=CDbl(first_num)/CDbl(second_num)
End Select
If DataTable.value("actual_result",dtGlobalSheet)=DataTable.Value("expect_result",dtGlobalSheet) Then 实际结果和理论将结果的判断
DataTable("status",dtGlobalSheet)="PASS"
else
DataTable("status",dtGlobalSheet)="FAIL"
End If
Window("计算器").Close
Next
小飞机所有页面的录制和脚本加强
1.首先把小飞机的登录,订飞机票,还有传真页面的对象分别存入对象库中保存。
有一点需要注意订单页面设计的到对象比较多,但我们最好是用到哪个存哪个,不用的就不存,因为多了系统也会运行比 较慢。就像人的大脑记得东西多了,就会累。影响性能。
2.可以用associate repository把对象和action关联起来。
3.录制小飞机的登录,订飞机票,传真。
4.分别拆分到不同的action中。那怎么分呢?可以把鼠标放到要拆分的地方,点击菜单edit->action->aplit action,或者点击快捷菜单。分成login,insert,fax。拆分时拆分的两部分可以是兄弟关系,也可以是父子关系。而且可以分别起名字。
5.拆分完后我们可以分别给每一部分关联它的对象,不需要的删除。(因为有些事关联着的所以删除不了,这时把关联的地方去掉关联即可)
注意:首先flight页面中有个menu对象,这个menu是fax中的,可以去掉。共享对象库是只能读的。
fax中我们发现fax中有两个order号,其实我们只需要11那个,先把下面的删除,等会运行可能会有问题,到时我们会 解决。而且我们发现menu虽然是需要的在fax中,但menu没有在fax中,所以我们需要完善下对象库。点击resource-》object repository,把menu导出。为fax2.然后点击object repository中的tool-》object repository merge tool,把fax和fax2关联下。保存为fax3.然后把action fax与fax3关联。
6.首先我们还是把飞机启动的改成手动的
If Dialog("Login").Exist(2)=false Then
SystemUtil.Run"C:Program FilesHPQuickTest Professionalsamplesflightappflight4a.exe"
End If
把设置密码那改为跟上面输入用户名一样的形式set "mercury"
7.运行一下,发现到传真页面出问题了,说找不到传真页面,其实传真页面有,只是叫传真18了,比对象库中加1了,那我们怎么匹配到这个加1 的窗口呢?我们打开对象库的fax3,我们的传真号那写的是11,那我们编辑下,把传真号11改为Num,这样还是不行,因为下面text中是11,所以text中的11也要改,我们要改为一个自动匹配的数字,那怎么匹配呢?点击点击下面的单选框regular expression,然后选择一个字符让它代表里面的东西是数字,我们去帮助文档中找regular expression(reg exp)object下有一个pattern property,找到d代表的是数字,所以我们把11改成d,d出现次数用{n,},所以text文本内容改为fax order No.d{1,}至少匹配一次。
同时脚本中相应传真编号那也把名字改一下fax order No.Num
在接着运行一下,跑通后可以继续完善脚本
8.那我们登录页面,第一节课讲的那些登录的用例可以放进去了。但有一点要注意:最后一条记录一定要保证他能正常进行。才能进入到insert订单页面,这样流程就能跑起来了,也就是程序只要从头走一遍就都能验证了,这个过程一直重复进行。这就是自动化的好处
大家可以自己设计下,这里就不写了
这里我们只加一点,我们只验证它流程的正确定。
在点击了login点击ok后,或者在insert之前,验证定飞机票的那个页面是否出现。即验证登录是否成功,我们在insert页面之前加吧。加一个检查点,看那个页面是否跳出来
9.订单中输入日期,我们知道是随机的,所以我们设置一个变量randomDate=Date+XXX,date是当前时间,我们让他去加一个时间(1-30天中的任意一天),所以,定义变量iDay=RandomNumber(1,30),让randomDate=Date+iDay,当然如果我们不知道写的对不对可以新开一个窗口编写完,写个msgbox让他输出来看下,正确了在贴到这边来。这样我们得到输入随机日期的脚本:
iDay=RandomNumber(1,30)
randomDate=Date +iDay
下面是构造mmddyy格式的,并且当日期或者天是一个数字时需要前面加0,
mm=month(randomDate)
If Len(month)(randomDate)=1 Then
mm="0"&mm
End If
dd=day(randomDate)
If Len(day(randomDate))=1 Then
dd="0"&dd
End If
fmtDate=mm&dd&right(year(randomDate),2)
把fmtDate贴到
Window("Flight Reservation").WinObject("Date of Flight").Type "fmtDate"
当然这个也可以用函数写
这就是我们的随机时间
10.下面是我们的fly from随机。那这个地方怎么随机呢?
fromIndex=RandomNumber(),因为我们的ComboBox从哪出发是一个下拉列表形式,从里面选择,它的个数就是下拉列表有多少项,所以我们可以通过Window("Flight Reservation").WinComboBox("Fly From:")里面的个数减一,我们用一个函数GetltemsCount,
按照我们的理解也就是可以写成:
fromIndex=RandomNumber(0,Window("Flight Reservation").WinComboBox("Fly From:").GetItemsCount-1)
但是因为RandomNumber里面不支持表达式,所以我们写成
fromCount=Window("Flight Reservation").WinComboBox("Fly From:").GetItemsCount-1
fromIndex=RandomNumber(0,fromCount)
Window("Flight Reservation").WinComboBox("Fly From:").Select fromIndex
同样fly to也是一样的。所以目的地随机是:
toCount=Window("Flight Reservation").WinComboBox("Fly To:").GetItemsCount-1
toIndex=RandomNumber(0,toCount)
Window("Flight Reservation").WinComboBox("Fly to:").Select toIndex
11.下面的选择航线winlist也是一个列表,我们要选择当前航线中的某一条航线。
所以
listCount=Window("Flight Reservation").Dialog("Flights Table").WinList("From").GetltemsCount-1
listIndex=RandomNumber(0,listCount)
Window("Flight Reservation").Dialog("Flights Table").WinList("From").Select listIndex
12.下面订单的设置用户名是我们的登录用户,即登录用户名,所以我们可以从login action里面的输出到data table表里。然后到insert action设置用户名这从data table表取。
所以我们在login action中登录名那行的脚本右键选择insert output value,有可能报错。那我们换另一种方式
在输入用户名那行脚本后面空出一行,鼠标放空出的一行,打开小飞机的登录页面,然后点击record,选择菜单中insert-》output value-》text output value,然后选中login页面的agent name输入框,然后点击ok弹出text output value properties对话框,选择modify,然后选中global sheet,name输入框自己取名字agent_name,就可以了。
然后insert action中的Window("Flight Reservation").WinEdit("Name:").Set "mercury"改为Window("Flight Reservation").WinEdit("Name:").Set Data Table("agent_name",dtGlobalSheet)
这样我们取得值就是登录人的信息了。
13.Window("Flight Reservation").WinEdit("Tickets:").SetSelection 0,1这行信息不需要的。
14.下面是设置集票数,因为我们经过实践知道集票数只能是最高10张,所以写成:
tickets=RandomNumber(1,10)
Window("Flight Reservation").WinEdit("Tickets:").Set Cstr(tickets)
这样就是我们的随机机票数。
15.最后就是机舱随机,跟加减乘除随机一样的,1-3中情况
num=RandomNumber(1,3)
Select Case nun
Case 1
Window("Flight Reservation").WinRadioButton("First").Set
Case 2
Window("Flight Reservation").WinRadioButton("Business").Set
Case 3
Window("Flight Reservation").WinRadioButton("Economy").Set
End Select
16.fax里不需要修改。然后运行一下试试。这就是我们做的让整个流程能够跑通的操作。这个没有人工控制,都是机器自动运行的。
小飞机脚本加强语言:
login:暂未做加强
If Dialog("Login").Exist(2)=false Then
SystemUtil.Run"D:HPQuickTest Professionalsamplesflightappflight4a.exe"
End If
Dialog("Login").WinEdit("Agent Name:").Set "mercury"
Dialog("Login").WinEdit("Password:").Set "mercury"
Dialog("Login").WinButton("OK").Click
flight:
iday=RandomNumber(1,30)
randomdate=date+iday
mm=month(randomdate)
If Len(mm )=1 Then
mm=0&month(randomdate)
End If
dd=day(randomdate)
If Len(dd)=1 Then
dd=0&day(randomdate)
End If
fmtdate=mm&dd&right(year(randomdate),2)
Window("Flight Reservation").WinObject("Date of Flight:").Type fmtdate
fromindex=RandomNumber(0,Window("Flight Reservation").WinComboBox("Fly From:").GetItemsCount-1)
Window("Flight Reservation").WinComboBox("Fly From:").Select fromindex
toindex=RandomNumber(0,Window("Flight Reservation").WinComboBox("Fly To:").GetItemsCount-1)
Window("Flight Reservation").WinComboBox("Fly To:").Select toindex
Window("Flight Reservation").WinButton("FLIGHT").Click
flight=RandomNumber(0,Window("Flight Reservation").Dialog("Flights Table").WinList("From").GetItemsCount-1)
Window("Flight Reservation").Dialog("Flights Table").WinList("From").Select flight
Window("Flight Reservation").Dialog("Flights Table").WinButton("OK").Click
Window("Flight Reservation").WinEdit("Name:").Set "mercury" 此处未做增强,可参照四则运算第四步
tickets=RandomNumber(1,10)
Window("Flight Reservation").WinEdit("Tickets:").Set Cstr(tickets)
num=RandomNumber(1,3)
Select Case nun
Case 1
Window("Flight Reservation").WinRadioButton("First").Set
Case 2
Window("Flight Reservation").WinRadioButton("Business").Set
Case 3
Window("Flight Reservation").WinRadioButton("Economy").Set
End Select
Window("Flight Reservation").WinButton("Insert Order").Click
Window("Flight Reservation").WinMenu("Menu").Select "File;Fax Order..."
fax: 未做增强
SystemUtil.Run "C:Program FilesSogouInputSogouExeSogouExe.exe","/check","","open",0
Window("Flight Reservation").Dialog("Fax Order No. d{1,}").WinObject("Fax Number:").Type "1111111111"
Window("Flight Reservation").Dialog("Fax Order No. d{1,}").Drag 264,211
Window("Flight Reservation").Dialog("Fax Order No. d{1,}").WinObject("Fax").Drop 338,248
Window("Flight Reservation").Dialog("Fax Order No. d{1,}").WinCheckBox("Send Signature with order").Set "ON"
Window("Flight Reservation").Dialog("Fax Order No. d{1,}").WinButton("Send").Click
Window("Flight Reservation").Close