selenium+python实现12306自动化抢火车票(一)
第一版写的比较粗糙,简单实现了12306自动化购票流程有想法和疑问,可在留言区留言一起探讨!!!第二版想解决的问题:1、选择乘车人,根据姓名去匹配选择2、选择靠窗座位/过道座位,不同车次座位是不同的处理、售卖完的座位无法选择的处理
📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)
📝 职场经验干货:
第一版写的比较粗糙,简单实现了12306自动化购票流程
有想法和疑问,可在留言区留言一起探讨!!!
第二版想解决的问题:
1、选择乘车人,根据姓名去匹配选择
2、选择靠窗座位/过道座位,不同车次座位是不同的处理、售卖完的座位无法选择的处理
3、循环持续抢票,直至抢到票位置
4、多车次切换抢票,A票抢不到,再抢B,B车次抢不到,再抢C,持续抢票
1、访问12306网站,进入登录页
登录选用的是12306扫码登录,比较方便,如果账号登录还要输验证码比较麻烦,默认进入是账号登录页,需要先切换至扫码登
driver.find_element(By.XPATH, "//*[contains(text(), '扫码登录')]").click()
2、登录进来进入个人中心页
如果选择顶部的定位稍微麻烦点,所以就采用点下面车票预定到购票首页,发现这个元素有id,直接id定位即可
driver.find_element(By.ID, "link_for_ticket").click()
3、购票页面出发地、目的地、日期,会有默认值,进来后先清除默认值,再输入自己的出发地、目的地、日期,避免直接输入导致错误,清空直接输入不生效,要点输入区域输入,再点下拉联想的值选中,然后查询列表
fromStation=driver.find_element(By.ID, "fromStationText")fromStation.clear()fromStation.click()fromStation.send_keys("上海")time.sleep(2)driver.find_element(By.ID, "citem_0").click()
4、列表车次数据出来后,不能固定去定位车次的元素,如果每次车次变了,元素还要变,不是想要效果,所以这里先把所有车次元素集合定位出来,然后用要买的车次去循环匹配,匹配上了就预定下单,匹配不上就提示没有这个车次,程序不再继续执行
ele=driver.find_elements(By.XPATH, "//div[@class='train']")for i in range(len(ele)):if "G1970" in ele[i].text: driver.find_element(By.XPATH, "//div[@id='train_num_{0}']/../../td[13]/a".format(i)).click()break
5、点预定时,有时又会提示登录,可能是12306的某些规则,这里做了特殊处理,如果定位到这个框了,就执行关闭框操作(发现关闭了继续操作不再弹框了,如果后面规则变了,必须要登录,那这里又得继续扫码登录了),如果没定位到,说明没有弹这个框
try: driver.find_element(By.ID, "login") time.sleep(3) driver.find_element(By.ID, "login_close").click() driver.find_element(By.XPATH, "//div[@id='train_num_{0}']/../../td[13]/a".format(i)).click()except:pass
6、乘车人选择,目前元素是固定写四的,这样写不合理,姓名变了就得改元素,后面想优化为用姓名去匹配选择,支持多人选择
driver.find_element(By.ID, "normalPassenger_0").click()driver.find_element(By.ID, "normalPassenger_1").click()
7、座位类别选择,这里是select标签,用select方法获取到元素的option值,用想要买的座位类别去匹配,这里支持多个座位类别选项,如果想买硬卧,硬卧没了再买软卧,那就可以先匹配硬卧,匹配上了就下单,没匹配上继续匹配软卧,按优先顺序匹配的
select1 = driver.find_element(By.ID,"seatType_1") #第1个人作为类别select2 = driver.find_element(By.ID,"seatType_2") #第1个人作为类别options_list=Select(select1).options#硬座1、硬卧3、软卧4、二等座0、一等座M、商务9、一等卧I、二等卧Jlist1=["一等座","二等座","硬座"]for i in list1: print(i)for option in options_list: print(option.text)if i=="一等座" and i in option.text: Select(select1).select_by_value("M") Select(select2).select_by_value("M")breakelif i=="二等座" and i in option.text: Select(select1).select_by_value("0") Select(select2).select_by_value("0")breakelif i=="硬座" and i in option.text: Select(select1).select_by_value("1") Select(select2).select_by_value("1")breakbreak
8、选择靠窗座位还是过道座位,这里目前也是写四未处理的,不同的车次靠窗过道的座位是不一样的,也可能存在,某个靠窗或过道座位卖完了,这里就得做特殊处理
9、确认订单就可以下单成功了,待人工支付了
最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取 【保证100%免费】
更多推荐
所有评论(0)