51Testing软件测试论坛

标题: QTP版"12306订票助手"--支持刷票及自动预定 [打印本页]

作者: mmsw450    时间: 2013-1-21 21:39
标题: QTP版"12306订票助手"--支持刷票及自动预定
本帖最后由 mmsw450 于 2013-1-23 23:13 编辑

12306把订票助手封杀了,闲来无事用QTP写了个简单的刷票脚本。   
  
  登录以及设置始发、终点 、日期部分未做;一是简单,二是没有做的必要!(因为订票时,可能随时修改始、终站及购票日期,由QTP来控制不合理)
  
目前已实现的功能:
  0、至少5秒自动查询一次(可设定查询间隔)
  1、支持车次白名单,
  2、支持席位选择,目前支持“仅卧铺”或“仅座票”或“全部”,一旦设定席位有票根据白名单自动预定车次
  3、支持自动选择订票人员(暂未做验证码识别,不能自动提交订单)

使用方法:
  1、先打开QTP,后打开IE
  2、登录帐号,设置好始发及终点站;出行日期。
  3、修改NameList;WhiteList;FirstSelect三个变量

  4、运行脚本即可


脚本下载地址:
    [attach]83302[/attach]

同几个朋友交流后,把登录部分也发布出来:
1、 登录部分需要手动输入验证码;脚本自动检测,如果验证码长度=4位时,自动点击登录;
2、如果验证码错误,则自动输入密码,重复步骤1

[attach]83335[/attach]



PS:0  完全描述性编程,代码粘贴到QTP中即可使用。
     1  仅个人娱乐之作,勿喷;欢迎指点。测试交流群:288793120
     2  在IE7 IE9 下测试通过
     3  计划用JAVA+WebDriver重写

     4  因为51论坛代码排版有点难看;删除代码部分。请下载后查看。
作者: mmsw450    时间: 2013-1-22 09:31
51这排版好淡疼啊

cnblogs地址
http://www.cnblogs.com/zhm450/archive/2013/01/21/2870423.html
作者: 赵佳乐SMILE    时间: 2013-1-22 09:35
厉害啊
作者: 黑羽祭    时间: 2013-1-22 09:39
支持一下~
作者: 测试ing2012    时间: 2013-1-22 11:36

作者: jhbaiyang    时间: 2013-1-22 14:12
听不错的,,用来学习qtp如何实现一个具体功能的很好的例子,
里面包含了数组的使用,引用function还有描述性编程,感谢楼主!!!
楼主用的uft11.5还是qtp11写的?
作者: mmsw450    时间: 2013-1-22 14:41
回复 6# jhbaiyang


    在QTP 9.2 下写的;在11下测试通过。

  本来登录以及选择始发、终点、日期等也作了自动化。但考虑到这几个值可能会不断变化,就把这些功能屏蔽掉了。
  登录功能之所以屏蔽掉,是因为如登录都不成功,也没有接下来的刷票过程了。

之所以用描述性编程来写,想直接把代码粘上就能用,脱离对象库。
作者: wjtest    时间: 2013-1-22 16:22
没用过QTP,支持下
作者: fengshijie    时间: 2013-1-23 09:15
貌似很强啊,充分的学以致用了,支持
作者: t_user    时间: 2013-1-23 09:18
呵呵 闲来没事居然就可以写个脚本耍,学习了
作者: Nexi    时间: 2013-1-23 09:47
楼主,我想请教你个问题,你那个登录时的验证码怎么处理的呢
作者: mmsw450    时间: 2013-1-23 10:08
回复 11# Nexi


    回复楼上:
登录部分我删除掉,没有上传。
验证码部分不好做,有人说用OCR,但OCR的识别率不敢恭维。

我的处理方式是,自动输入用户名及密码,然后循环检查验证码输入框,如果字符串长度=4时,则登录,登录成功后点击车票预定,然后自动输入始发及终点、日期等

后来考虑到某些因素,把这个给删除掉,没有上传。如果有需要的话,可以追加上去。
作者: louqqson008    时间: 2013-1-23 11:18
本帖最后由 louqqson008 于 2013-1-23 11:19 编辑

非常厉害。至于验证码,可以先登录了,再执行这段QTP。不知道这样行不行
作者: zb460989093    时间: 2013-1-23 11:47
膜拜
作者: mmsw450    时间: 2013-1-23 12:04
回复 13# louqqson008


    就是先登录,再执行这段,在运行设置里, 设置为“Record and run test on any open browser”就可以了
作者: junyjiang    时间: 2013-1-23 16:23
ocr识别的时候输入框=4时也不能确定他就是正确的验证码 啊?
作者: mmsw450    时间: 2013-1-23 18:53
本帖最后由 mmsw450 于 2013-1-26 14:16 编辑

回复 16# junyjiang

    我并没有用OCR,如果OCR识别率不高反而不如不用!
阁下可看一下登录部分的代码 ;我写了很多注释,很容易理解。

PS:51 的代码排版太乱,无奈下重新整理了一遍登录的代码。也可从一楼下载。
[attach]83360[/attach]
作者: zjuan2002    时间: 2013-1-26 14:48
顶一个
作者: icu200934    时间: 2013-1-27 15:58
嗯,,好厉害,,支持
作者: 四季草堂    时间: 2013-1-28 11:40
楼主用的什么编程工具
作者: mmsw450    时间: 2013-1-28 14:12
回复 20# 四季草堂


    QTP自带的IDE为主,辅之以VBSEdit、NotePad++等;

  推荐VBSEdit.蛮好用。

  Notepad++  用来格式化和阅读代码;很好使。
作者: xajhuang    时间: 2013-1-28 17:26
楼主说的“输入始发,终点 及 日期;然后点击查询按钮;因为12306作了一点小手段,
'导致QTP自动输入后查不出来车次!此步骤建议手动输入!!”其实是可以自动化实现的:输入值之前先使“WebEdit”获得焦点,然后输入值,再模拟键盘{Enter}一下,即可查询了,代码如下:

Set wshShell = CreateObject("Wscript.Shell")
With Browser("micclass:=Browser").Page("micclass:=Page")
'点击“车票预定”链接
.Link("name:=车票预订","class:=text_yellow").Click
'输入始发,终点 及 日期;然后点击查询按钮;加了几个Hidden的input,根据输入的车站值自动变化)

.WebEdit("name:=orderRequest.from_station_name").Click 1,1
.WebEdit("name:=orderRequest.from_station_name").Object.classname="input_20txt"
.WebEdit("name:=orderRequest.from_station_name").Object.value=  "杭州"
wshShell.SendKeys "{ENTER}"  

.WebEdit("name:=orderRequest.to_station_name").Click 1,1
.WebEdit("name:=orderRequest.to_station_name").Object.classname="input_20txt"
.WebEdit("name:=orderRequest.to_station_name").Object.value= "上海"
wshShell.SendKeys "{ENTER}"  

.WebEdit("name:=orderRequest.train_date").Object.value = "2013-2-13"
wshShell.SendKeys "{ENTER}"  
.WebButton("class:=search_u").Click

End With
作者: mmsw450    时间: 2013-1-28 21:19
回复 22# xajhuang
感谢 xajhuang兄 提供的方法;坛子里果然藏龙卧虎。

     我在之间曾试过,用QTP但无论输入值是什么,模拟回车时,都会变成“北京北”,如附图。
这让我略微郁闷了一把。所以才有附件代码中的注释。
不知道您那里为何能够正常,希望能加阁下QQ,交流一二。我Q:85645204

   手动输入的时候,是需要鼠标点一下悬浮提示站点,或者回车一下的。就会正常查询。
这时 ,它会把车站的站名和车站编号分别赋值给下面的FORM表单中。附图如下。
如果不执行回车过程,在FORM表单中,就没有这个编号值。查询的时候,结果也就为空。
[attach]83388[/attach]




[attach]83387[/attach]

作者: xajhuang    时间: 2013-1-29 09:52
我也是QTP的学习者之一,正好自己也在用QTP写小助手订票。看到贵兄的帖子,想学习一下,才有了上述不成熟的建议,“藏龙卧虎”实在不敢当。
   你说的那两种现象我都碰到了:1、直接赋值后查询,12306会提示“您选择的日期不在预售期内”;2、赋值后回车,出发地和目的地都是“北京北”。
   后来参考了一下手工操作,发现要在赋值之前使文本框获得焦点,然后赋值,再回车,这样就可以查询了。不过这样做有个问题:回车后会默认选择下拉框的第一个值。比如出发地,输入“北京”,回车后,会把下拉框第一个值“北京北”赋值给“出发地”,虽然不影响最后的查询结果。但是这也终归是个问题,呵呵。
作者: 想你的美    时间: 2013-1-29 12:22
支持哈
作者: xiaoshi_2011    时间: 2013-1-29 14:29
顶一个
作者: xiaoyouer    时间: 2013-1-29 15:26
回复 1# mmsw450


    我对qtp只到了录制回放和简单设置参数级别,而且浏览器装了多个,要命的是装了360急速,所以ie一直不好用,现在又录制不了了。
作者: 泰然    时间: 2013-1-29 15:58
呵呵,我也来做一个,对象名称有调整.另外脚本从完成登录,点开车票预订界面后开始执行.解决了输入的问题
  1. Dim strFrom, strTo, strDate
  2. strFrom = inputBox("出发地")
  3. strTo = inputBox("目的地")
  4. strDate = inputBox("出发日期,格式如2013-01-01")
  5. 'strFrom = "上海"
  6. 'strTo = "北京"
  7. 'strDate = "2013-02-02"
  8. Browser("12306").Page("NewOrder").Frame("main").WebEdit("FromCity").Set ""
  9. Browser("12306").Page("NewOrder").Frame("main").WebEdit("FromCity").Click 1,1
  10. Set oClp = CreateObject("Mercury.Clipboard")
  11. oClp.Clear
  12. oClp.SetText strFrom
  13. Set oWsh = CreateObject("Wscript.shell")
  14. oWsh.SendKeys "^v"
  15. Set oCityList = Browser("12306").Page("NewOrder").Frame("main").Object.getElementById("panel_cities").ChildNodes
  16. For i = 0 to oCityList.length -1
  17.         If oCityList(i).ChildNodes(0).innertext=strFrom then
  18.                 For j = 0 to i-1
  19.                         oWsh.SendKeys "{DOWN}"
  20.                 Next
  21.                 oWsh.SendKeys "{ENTER}"
  22.                 Exit for
  23.         end if
  24. Next
  25. Set oCityList = Nothing

  26. Browser("12306").Page("NewOrder").Frame("main").WebEdit("ToCity").Set ""
  27. Browser("12306").Page("NewOrder").Frame("main").WebEdit("ToCity").Click 1,1
  28. oClp.Clear
  29. oClp.SetText strTo
  30. oWsh.SendKeys "^v"
  31. wait 1
  32. Set oCityList = Browser("12306").Page("NewOrder").Frame("main").Object.getElementById("panel_cities").ChildNodes
  33. For i = 0 to oCityList.length -1
  34.         print oCityList(i).ChildNodes(0).innerhtml
  35.         If oCityList(i).ChildNodes(0).innertext=strTo then
  36.                 print i
  37.                 For j = 0 to i-1
  38.                         oWsh.SendKeys "{DOWN}"
  39.                 Next
  40.                 wait 1
  41.                 oWsh.SendKeys "{ENTER}"
  42.                 Exit for
  43.         end if
  44. Next
  45. Set oCityList = Nothing
  46. Set oWsh = Nothing
  47. Set oClp = Nothing

  48. Browser("12306").Page("NewOrder").Frame("main").WebEdit("TrainDate").Object.innerText = strDate
  49. Browser("12306").Page("NewOrder").Frame("main").WebButton("Select").Click
复制代码

作者: liurenhui    时间: 2013-1-29 17:19
学以致用,,哈哈哈
作者: 104509426    时间: 2013-1-29 21:09
楼上全是高手,能否请教如何提交订单呢,提交订单前必须要输入验证码?那些抢票软件是如何做到啊,求解啊
作者: mmsw450    时间: 2013-1-30 09:19
回复 28# 泰然


    泰然兄居然利用了剪贴版;呵呵;有想法。

   呆会试试你这部分代码。
作者: mmsw450    时间: 2013-1-30 10:16
回复 27# xiaoyouer


    QTP是利用BHOmanager插件驱动IE的、建议你把防火墙、杀软、助手啊,一些不常用IE插件都关闭或停用。
作者: coolwind09    时间: 2013-1-30 14:24

  1. 绝对是人才。百分之百的是人才啊···
复制代码

作者: hnhellen    时间: 2013-1-30 17:45
楼主学以致用,受教了
作者: hnhellen    时间: 2013-1-30 17:46
不过我用QTP 到入不了文件 我用的是QTP 9.2 不知道是不是版本问题?
作者: 黑羽祭    时间: 2013-2-1 09:32
有点意思啊~
作者: pl80601983    时间: 2013-2-1 09:38
学习与时俱进,真好.
作者: seven_1987    时间: 2013-2-1 09:55
牛逼人物!
作者: mmsw450    时间: 2013-2-1 10:26
回复 36# 黑羽祭


    谢  黑羽祭  彭Sir 两位版主捧场指导。  
作者: 咖啡猫来啦    时间: 2013-2-2 13:43
来学习一下
作者: netTong    时间: 2013-2-2 19:53
Mark
作者: helenhuoyy    时间: 2013-2-4 13:11
楼主学以致用,学习了。
作者: yxd2006    时间: 2013-2-4 15:27
谢谢楼主分享
作者: hm_51testing    时间: 2013-3-4 16:40
很强大啊,学习学习,非常感谢楼主。。。早知道看这个帖子,订火车票时就不用愁了。。。
作者: lijingprince5    时间: 2013-3-5 11:24
楼主是怎么绕过验证码的呢?
作者: o0o0123    时间: 2013-3-9 23:20
这个必须顶!!!!!
作者: o0o0123    时间: 2013-3-9 23:20
这个必须顶啊!!!
作者: o0o0123    时间: 2013-3-9 23:20
这个必须要定一个!!
作者: ykp_111    时间: 2014-5-14 16:12
QTP菜鸟,楼主的这个代码我执行不了,为什么,是不是需要配置什么哦。
作者: auto_tester    时间: 2014-5-15 09:24
学习了!
作者: 757563246    时间: 2015-11-29 22:18
支持下




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2