Python selenium+pyautogui写的一个12306抢票

用selenium+pyautogui写的一个12306抢票``最近处于找工作阶段,在家里闲着无聊,写了一个12306的抢票,还很简陋,也是第一次写文发帖,大佬勿喷。首先导入模块部分。有些外部库需要pip安装。import re #正则import pyautogui#键鼠操作import smtplib#邮件import datetime#时间from time import ...
摘要由CSDN通过智能技术生成

用selenium+pyautogui写的一个12306抢票

``
最近处于找工作阶段,在家里闲着无聊,写了一个12306的抢票,还很简陋,也是第一次写文发帖,大佬勿喷。
首先导入模块部分。有些外部库需要pip安装。

import re  #正则
import pyautogui#键鼠操作
import smtplib#邮件
import datetime#时间
from time import sleep#睡眠
from  selenium import webdriver#操作浏览器
from selenium.webdriver import ActionChains
from selenium.webdriver.support.ui import Select
from email.mime.text import MIMEText#邮件

先把主函数的一部分拉出来

    login_url = 'https://kyfw.12306.cn/otn/resources/login.html'#网址
    b=Open(login_url)#打开浏览器(网址)
    login(b,name,pwd)#登录  (12306用户名,密码)
    check_tickets(b,fromStation,toStation,train_date,departure_time,train_type,set_type_list)#查票 (出发站点,到达站点,出发日期,发车时间,列车类型,座位列表)
    send_mail(sender_mail,sender_pwd,receiver_address, reserve(b,people,seat))#发邮件( 发件人,发件人密码,收件人    订票(预定人,座位类型))
    if __name__ == '__main__':
   		 main()

打开浏览器

def Open(url):#打开浏览器 关闭更新 进入指定地址
    # ffpro=r'C:\Users\Administrator\AppData\Roaming\Mozilla\Firefox\Profiles\rxgmslh7.default'
    # profile=webdriver.FirefoxProfile(ffpro)#文件夹 加载这个文件夹不更新浏览器
    # b=webdriver.Firefox(profile)#火狐浏览器 
    b=webdriver.Chrome()#这个是谷歌  
    b.implicitly_wait(10)#隐式等待10秒  如果10秒之内完成则不等待进入下一步 如果10秒以后则进入下一步
    b.maximize_window()#最大化窗口
    sleep(1)
    b.get(url)
    return b  #返回b

在这里插入图片描述

登录部分,最近的加了扫码登录,这里用的账号登录,点击账号登录,输入用户名、密码,手动验证,登录

def login(b,name,pwd):#登录
    b.find_element_by_class_name('login-hd-account').click()#用户密码登录
    b.implicitly_wait(10)
    sleep(1)
    b.find_element_by_id('J-userName').clear()
    b.find_element_by_id('J-userName').send_keys(name)#姓名
    b.find_element_by_id("J-password").clear()
    b.find_element_by_id("J-password").send_keys(pwd)  # 密码
    sleep(10)  # 验证码要手动输入一下
    b.find_element_by_id("J-login").click()  # 不用自己点登录
    b.implicitly_wait(10)
    sleep(2)
    while 1:#设置一个死循环 如果验证失败则重新登录
        try:
            personage_login = b.find_element_by_xpath('//*[@id="gerenzhongxin"]/h2/a')
            if personage_login.text=='个人中心':
                break#登录成功则跳出死循环
        except: 如果登录不成功必然页面不会跳转 必然会报错,如果报错则重新登录
            login(b,name,pwd)

查票部分,分段来讲
(1)车票悬浮窗

def check_tickets(b,fromStation,toStation,train_date,departure_time,train_type,set_type_list):#查票筛选
    b.implicitly_wait(10)
    sleep(3)
    e=b.find_element_by_link_text('车票')
    ActionChains(b).move_to_element(e).perform()#悬停在车票上显示下拉框
    sleep(1)
    b.implicitly_wait(10)
    b.find_element_by_link_text('单程').click()#这里选择的是单程
    b.implicitly_wait(10)
    sleep(1)

在这里插入图片描述
查票这里是个悬浮窗,引用的是from selenium.webdriver import ActionChains这个模块,悬停在车票上点击单程。
查票部分
(2)日历

    js = 'document.getElementById("train_date").removeAttribute("readonly")'
    b.execute_script(js)
    b.find_element_by_id("train_date").clear()
    b.find_element_by_id("train_date").send_keys(train_date)#日历元素处理
    sleep(1)
    pyautogui.moveTo(764,347)
    pyautogui.click(764, 347)#日历框里面点一下 这几个 pyautogui 要根据不同的电脑、浏览器像素自己定位
    pyautogui.moveTo(21,361)
    pyautogui.click(21,361)#空白地方点一下 消掉日历弹出窗
    sleep(1)

查票阶段,这里有个日历元素,用JS语句来处理,输入完以后发现弹出的窗口消不掉,反复试验了几次,在输入框点一次下,在输入框以外的空白地方点一下可以消掉弹出的窗口,这里是用的pyautogui,手动截图然后用画图工具打开,得到输入框的像素点坐标,移动到那个坐标点击。这里不同的电脑、不同的浏览器可能导致像素点不一致。
在这里插入图片描述
查票部分
(3)出发车站到达车站

    b.find_element_by_id('fromStationText').clear()
    b.find_element_by_id('fromStationText').send_keys(fromStation)  # 出发车站
    pyautogui.moveTo(275, 410)
    pyautogui.click(275, 410)  # 这里选的是第一个
    sleep(1)
    b.find_element_by_id('toStationText').clear()
    b.find_element_by_id('toStationText').send_keys(toStation)  # 到达车站
    pyautogui.moveTo(504, 410)
    pyautogui.click(504, 410)  # 这里选的是第一个
    sleep(1)  

直接输地址进去会显示灰色,这里仍然用的pyautogui处理,移动到下面提示弹出框的位置,点击。
在这里插入图片描述

查票部分
(4)其余的一些筛选,改版以后的有自助查询,勾选以后点击查询如果有票则会有声音提示,并且每隔5秒会自动查询一次,

    b.find_element_by_xpath('//*[@id="auto_query"]').click()  # 自助查询
    s1 = Select(b.find_element_by_id('cc_start_time'))  # 实例化Select
    s1.select_by_visible_text(departure_time)    #发车时间 #00:00--24:00 00:00--06:00 06:00--12:00 12:00--18:00 18:00--24:00
    b.find_element_by_id('sf1_label').click()#普通 学生
    # b.find_element_by_xpath('//*[@id="checkbox_8KcrDAF3Vr"]').click()K
    # li[1] GC-高铁/城际  li[2] D-动车 li[3] Z-直达 li[4] T-特快 li[5] K-快速 li[6] 其他
    b.find_element_by_xpath('//*[@id="_ul_station_train_code"]/li[{}]/input'.format(train_type)).click()#这里选的是快速
    # p=b.find_element_by_xpath('//*[@id="_ul_station_train_code"]/li[5]/label').text
    # print(p)

发车时间和列车类型都是列表,传参数进去查对应的类型
在这里插入图片描述
查票部分

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python Selenium+Pytest是一种用于自动化测试的组合。首先,需要安装PythonSelenium,以及浏览器驱动程序,如ChromeDriver或FirefoxDriver,以便使用Selenium WebDriver API来控制浏览器。\[1\]接下来,可以使用Pytest来编和运行测试用例。 在项目结构中,通常会有一个tests文件夹,其中包含测试用例文件,如test_ui.py。还有一个pages文件夹,其中包含页面对象文件,如page_objects.py。utils文件夹中包含一些辅助函数和配置文件,如helpers.py和config.py。reports文件夹用于存储测试报告,screenshots文件夹用于存储测试过程中的截图,logs文件夹用于存储日志文件。drivers文件夹中包含浏览器驱动程序。还有一个requirements.txt文件用于管理项目的依赖关系,README.md文件用于提供项目的说明,run_tests.py文件用于运行测试用例。\[2\] 在终端中,可以使用pytest来运行测试。可以指定目录运行pytest test或多个目录运行pytest test test1\test11。也可以指定模块运行pytest test\test_mod.py,指定类运行pytest test\test_mod.py\Test1,指定方法运行pytest test\test_mod.py\Test1::test_01。如果需要更详细的信息,可以使用-v参数来打印测试类和测试函数的详细信息,使用-s参数来打印额外的信息。\[3\] #### 引用[.reference_title] - *1* *2* [python+selenium+pytest的UI自动设计思路](https://blog.csdn.net/xiaoxiao2235/article/details/129679022)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [python+selenium+pytest(中)自动化测试框架pytest的应用](https://blog.csdn.net/qq_36967200/article/details/124238560)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值