Python基于Selenium,Firebug实现12306购票

最近在学习自动化测试的内容,写这篇博客的目的是练习webdriver的元素定位方式。

使用材料

Firefox 35、用到的插件Firebug(高版本的火狐不支持firebug)

1. 使用自己的账号密码登陆

从12306购票主页开始: https://kyfw.12306.cn/otn/leftTicket/init 首先观察需要进行的操作:
点击“登陆” -----》点击“账号登陆”-----》输入“用户名”,“密码”。
在这里插入图片描述
在这里插入图片描述
实现代码:

driver.find_element_by_id('login_user').click()
driver.find_element_by_link_text('账号登录').click()
driver.find_element_by_id('J-userName').send_keys('XXXXXXXX') # 自己的账号
driver.find_element_by_id('J-password').send_keys('XXXXXXXX')  # 自己的密码

如果需要查询某个元素的id,可以使用firebug插件,这里以找到用户名的属性为例:
开启firebug-----》点击下图中标出的按钮-------》选中用户名文本框--------》查看对应的属性

在这里插入图片描述
验证码的输入,此处使用的是手工的方法,利用time模块让程序暂停运行10s,手动选择验证码。

2. 进入车票预定界面

利用鼠标的悬停事件找到“车票”,再点击“单程”按钮(第一次写,没有考虑到悬停的问题导致总是定位不到单程按钮,加入悬停之后,解决问题)
在这里插入图片描述
实现代码:

element = driver.find_element_by_link_text('车票')
ActionChains(driver).move_to_element(element).perform()  # 在“车票”上悬停
driver.find_element_by_link_text('单程').click()
time.sleep(5)

3. 输入出发地和目的地,日期,选择车类型,点击查询

需要执行的操作:输入出发地和目的地,日期,选择车类型,点击查询
在这里插入图片描述

driver.find_element_by_id("fromStationText").click()
driver.find_element_by_css_selector(u'[title=xx]').click() # 填入需要的起始站
driver.find_element_by_id("toStationText").click()
driver.find_element_by_css_selector(u"[title=xx").click() # 终点站
driver.find_element_by_id("train_date").click()
driver.find_element_by_css_selector(
    "div.cal:nth-child(1) > div:nth-child(3) > div:nth-child(22) > div:nth-child(1)").click()  # 选择时间	
driver.find_element_by_css_selector("[value='Z']").click() # 选择车次类型
driver.find_element_by_id("query_ticket").click() # 点击查询

关于起始站和终点站的定位,使用了firebug查询,首先已经利用了id定位到了出发地的文本框,就会出现很多站名,如下图,随便对某个地点点击右键------》点击“使用firebug查看元素”,就可以定位到title属性,用CSS选择器即可。
在这里插入图片描述
关于时间的选择:同样的先点击了出发日的文本框,然后在浏览器中点击任何日期,然后右键----》点击查看元素------》在弹出的控制台中有对应的语句------》右键,点击复制唯一选择器,可以得到这个日期的属性-------》使用CSS选择器即可。

在这里插入图片描述

4. 选中车次,乘车人信息设置

选择合适的车次,点击预定,预定按钮的属性与时间获取类似,
----------》右键---------》查看元素-----------》复制唯一选择器----------》CSS选择器

在这里插入图片描述
选择乘车人-----》选择是否购买学生票-------》点击提交
在这里插入图片描述
实现代码:

# 选择车次
driver.find_element_by_css_selector('XXXXXXX').click()  # 填写所需车次
time.sleep(3)
# 选择乘车人,选择乘车人是否是学生
driver.find_element_by_css_selector('#normalPassenger_0').click()
driver.find_element_by_link_text("取消").click()
# 提交订单
driver.find_element_by_id('submitOrder_id').click()

还可以进一步写循环刷票,用while True 就可以实现。

完整代码

from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import ActionChains

# 实例化一个浏览器 Firefox 35 , firebug
driver = webdriver.Firefox()

# 打开12306主页
url = 'https://kyfw.12306.cn/otn/leftTicket/init'
driver.get(url)

# 使用自己的账号密码登陆
# 需要手工再点击一下验证码和登陆 所以先睡眠10s
driver.find_element_by_id('login_user').click()
driver.find_element_by_link_text('账号登录').click()
driver.find_element_by_id('J-userName').send_keys('xxxxxxxxxxx')
driver.find_element_by_id('J-password').send_keys('xxxxxxxxxxxx')
print('login in!')
time.sleep(10)

# 进入预定车票的界面,利用鼠标的悬停事件找到车票element,得到单程的link
element = driver.find_element_by_link_text('车票')
ActionChains(driver).move_to_element(element).perform()
time.sleep(3)
driver.find_element_by_link_text('单程').click()
time.sleep(5)
#
# 输入出发地和目的地,日期,选择车类型,点击查询
driver.find_element_by_id("fromStationText").click()
driver.find_element_by_css_selector(u'[title=xx]').click()
time.sleep(2)
driver.find_element_by_id("toStationText").click()
driver.find_element_by_css_selector(u"[title=xxx]").click()
time.sleep(2)
driver.find_element_by_id("train_date").click()
driver.find_element_by_css_selector(
    "xxx").click()
time.sleep(2)
driver.find_element_by_css_selector("[value='Z']").click()
time.sleep(2)
driver.find_element_by_id("query_ticket").click()
time.sleep(5)

# 选择车次 进行预定
driver.find_element_by_css_selector('xxxxxxx').click()
time.sleep(3)

# 选择乘车人,选择乘车人是否是学生
driver.find_element_by_css_selector('#normalPassenger_0').click()
time.sleep(2)
driver.find_element_by_link_text("取消").click()
time.sleep(3)

# 提交订单
driver.find_element_by_id('submitOrder_id').click()

猜你喜欢

转载自blog.csdn.net/pici7002/article/details/88814593