12306把订票助手封杀了,闲来无事用QTP写了个简单的刷票脚本。
登录以及设置始发、终点 、日期部分未做;一是简单,二是没有做的必要!(因为订票时,可能随时修改始、终站及购票日期,由QTP来控制不合理)
目前已实现的功能:
0、至少5秒自动查询一次(可设定查询间隔)
1、支持车次白名单,
2、支持席位选择,目前支持“仅卧铺”或“仅座票”或“全部”,一旦设定席位有票根据白名单自动预定车次
3、支持自动选择订票人员(暂未做验证码识别,不能自动提交订单)
使用方法:
1、先打开QTP,粘帖代码到IDE中,而后打开IE
2、登录帐号,设置好始发及终点站;出行日期。
3、修改NameList;WhiteList;FirstSelect三个变量
4、运行脚本即可
PS:
0 完全描述性编程,代码粘贴到QTP中即可使用。
1 仅个人娱乐之作,勿喷;欢迎指点。 测试交流群:288793120
2 在IE7 IE9,QTP9.2 QTP11 下测试通过
3 计划用JAVA+WebDriver重写
'**********************************
'Written by @以轩-之名
'Date : 2013年1月21日
'仅供娱乐和学习使用
'QQ:85645204
'请提前登录,设置好始发及终点站;出行日期。
'修改NameList;WhiteList;FirstSelect三个变量
'**********************************
Dim CheCi,i,j,WhiteList,NameList
'白名单;即想要预定的车次名单;车次之间以“,”隔开
WhiteList = "K110,T119,G315,D120,SB12306"
NameList="张三,李四" '订票人员名单
Dim hasTickt '标记是否已找到有票的车次
hasTickt = False
Dim FirstSelect '定义卧铺优先还是座票优先 值只能为 "卧铺"或"座票"或"全部"
FirstSelect = "卧铺"
Dim RowCountofTable '临时变量,保存当前车次及查询结果数
myArr = Split(WhiteList,",")
nameArr = Split(NameList,",")
Dim waitTime '查询间隔,至少为5秒;(12306规定每次间隔不低于5秒)
waitTime = 5
'检查是否是查到票,没有则循环刷新
While not hasTickt
Browser("micclass:=Browser").Page("micclass:=Page").WebButton("class:=search_u").Click
For i=0 To Ubound(myArr)
CheCi = myArr(i)
RowCountofTable = Browser("micclass:=Browser").Page("micclass:=Page").webTable("class:=obj row20px").RowCount
For j = 2 to RowCountofTable
'检查每一行车次名与白名单中车次是否一致,一致则检查对应车次的车票情况
If Browser("micclass:=Browser").Page("micclass:=Page").webTable("class:=obj row20px").ChildItem(j,1,"WebElement",0).GetROProperty("outertext")=CheCi Then
'检查该车次是否有卧铺或硬座或全部
If CheckTickt (j,FirstSelect) Then
hasTickt = true
Exit for
End If
End If
Next
'如果有票,则执行订票过程
If hasTickt Then
BookTickts(j)
Exit For
End If
Wait waitTime
Next
Wend
'根据名单列表选择相应的购票人员
For i = 0 to UBound(NameArr)
If Browser("micclass:=Browser").Page("micclass:=Page").WebCheckBox("html id:=" &NameArr(i) & ".*" ).Exist(1) Then
Browser("micclass:=Browser").Page("micclass:=Page").WebCheckBox("html id:=" &NameArr(i) & ".*" ).Set "on"
End If
Next
Function CheckTickt(i , XiWei)
With Browser("micclass:=Browser").Page("micclass:=Page").webTable("class:=obj row20px")
YingWo = .GetCellData(i,11)
RuanWo = .GetCellData(i,10)
GaoRuan = .GetCellData(i,9)
ShangWuZuo = .GetCellData(i,5)
TeDengZuo = .GetCellData(i,6)
YiDengZuo = .GetCellData(i,7)
ErDengZuo = .GetCellData(i,8)
RuanZuo = .GetCellData(i,12)
YingZuo = .GetCellData(i,13)
WuZuo = .GetCellData(i,14)
End with
If XiWei="卧铺" then
'检查所有卧铺票是否有票(包括软卧及高软)
If (NOT YingWo = "--" AND not YingWo = "无" AND not YingWo="*" ) OR _
( NOT RuanWo = "--" AND not RuanWo = "无" AND not RuanWo="*") OR _
(NOT GaoRuan = "--" AND not GaoRuan = "无" AND not GaoRuan="*") Then
CheckTickt = True
Exit Function
End If
ElseIF XiWei="座票" Then
'检查所有座票是否有座(包括站票)
If (NOT ShangWuZuo = "--" AND not ShangWuZuo = "无" AND not ShangWuZuo="*" ) OR _
( NOT TeDengZuo = "--" AND not TeDengZuo = "无" AND not TeDengZuo="*") OR _
(NOT YiDengZuo = "--" AND not YiDengZuo = "无" AND not YiDengZuo="*") _
OR (NOT ErDengZuo = "--" AND not ErDengZuo = "无" AND not ErDengZuo="*" ) OR _
(NOT RuanZuo = "--" AND not RuanZuo = "无" AND not RuanZuo="*" )OR _
(NOT YingZuo = "--" AND not YingZuo = "无" AND not YingZuo="*" )OR _
(NOT WuZuo = "--" AND not WuZuo = "无" AND not WuZuo="*" ) Then
CheckTickt = True
Exit Function
End If
ElseIF XiWei="全部" then
'检查按钮是否为灰色不可用,如果是,则无票;否则为有票。
If not Browser("micclass:=Browser").Page("micclass:=Page").webTable("class:=obj row20px").ChildItem(i,16,"WebElement",0).GetRoProperty("class")="btn130" then
'msgbox "有票:" &i
CheckTickt = True
End if
' class btn130
end if
End Function
Function BookTickts(j)
'点击对应车次后的“预定”按钮
Browser("micclass:=Browser").Page("micclass:=Page").webTable("class:=obj row20px").ChildItem(j,16,"WebElement",0).click
End Function
PS:转载注明出处