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:转载注明出处