zoukankan      html  css  js  c++  java
  • python12306抢票

    什么是selenium?

    支持通过各种driver(FirfoxDriver,IternetExplorerDriver,OperaDriver,ChromeDriver)驱动真实浏览器完成测试, selenium也是支持无界面浏览器操作的。

    为什么使用selenium?

    模拟浏览器功能,自动执行网页中的js代码,实现动态加载

    如何安装selenium

    不同浏览器版本对应不同浏览器内核

    项目流程

    一、启动webdriver:

    from selenium import webdriver
    path = r"你的浏览器驱动的路径"
    browser = webdriver.Chrome(path)

    二、访问网址:

    url = "https://kyfw.12306.cn/otn/leftTicket/init?"
    browser.get(url)

    三、元素定位

    当我们访问到网页之后,我们首先就要定位到我们要交互的一些元素,比如:

    那么我们想要模拟输入这些内容就必须要先定位到这些元素,定位元素我们可以用到selenium中的常用定位方法:

    • find_element_by_id 通过标签的id属性进行定位

    • find_elements_by_name 通过标签的name属性进行定位

    • find_elements_by_xpath 通过xpath语句进行定位

    • find_elements_by_tag_name 通过标签名进行定位

    • find_elements_by_class_name 通过标签的class属性进行定位

    • find_elements_by_css_selector 通过CSS选择器进行定位

    1、定位出发地:我们可以在网页中按F12打开控制台:

    按照上图步骤,我们可以看到出发地的输入框对应的input标签,标签内有一个id属性,那么我们就可以利用selenium中元素定位的方法:find_element_by_id 来定位这个输入框了:

    start_city = browser.find_element_by_id("fromStationText")

    元素定位好以后,下一步就是要向输入框内发送内容,这就用到了元素交互,最常用的元素交互方式有:

    • click() 模拟点击

    • send_keys() 输入

    • clear() 内容清空

    那么我们现在定位到这个元素之后,首先需要点击一下这个输入框才能输入内容,所以代码如下:

    start_city.click()
    start_city.clear()
    start_city.send_keys("北京 ")

    2、定位目的地:按照同样的方式,我们把出发地也输入内容:

    end_city = browser.find_element_by_id("toStationText")
    end_city.click()
    end_city.clear()
    end_city.send_keys("上海 ")

    3、定位出发时间:同样的方式我们先定位到出发时间的筛选框:

    choice_time = Select(browser.find_element_by_id("cc_start_time"))

    我们这个时候看到,这里的内容和咱们刚才不太一样了,这里变成了一个下拉框的形式,对于这种形式的内容,我们要使用slenium中的另外一个方法:Select

    from selenium.webdriver.support.select import Select
    choice_time = Select(browser.find_element_by_id("cc_start_time"))
    # choice_time.select_by_index() 通过索引来取值
    choice_time.select_by_visible_text("12:00--18:00")

    这样的话我们也就确定了发车时间

    4、选择出发日期:最后一步我们需要选择一下发车日期:

    我们发现每一个发车日期选项卡都对应一个 li 标签,所以我们这次用xpath匹配方式来定位一下:

    data = browser.find_element_by_css_selector("#date_range li:nth-child(4)")
    data.click()

    OK!执行到这里,我们所有的车次就都能查询出来了,下一步要做的就是把我们看好的车次添加到我们的订单中,步骤和上边一样,所以这里就不上图了,直接贴上代码和注释:

    favorite = ["G3","G137","G21"]
    ​
    xpath = '//tbody[@id="queryLeftTable"]//td[4][@class]/../td[1]//a'
    train_list = browser.find_elements_by_xpath(xpath)
    ​
    for train in train_list:
        train_num = train.text
        if train_num in favorite:
            print("亲  有票了哦!!!")
            target = train.find_elements_by_xpath('../../../../../td[13]/a')[0]
            # print(target)
            target.click()
            input("请手动登陆  登陆成功之后请按回车键")
    ​
            time.sleep(3)
            browser.find_element_by_id("normalPassenger_0").click()
            browser.find_element_by_id("submitOrder_id").click()
    ​
            time.sleep(10)
            browser.find_element_by_id("qr_submit_id").click()
    ​
            print("亲  恭喜您抢票成功!!!")
            # 第一个参数代表声音大小  第二个参数代表时长  1000 = 1秒
            Beep(3000,3000)
            break
        else:
            print("亲  暂时还没有票  请耐心等待...")
    browser.quit()
    到这一步我们的这个项目就完成了,下边贴上整合好的代码供大家学习:
    
    from selenium import webdriver
    import time
    # 专门处理下拉框元素
    from selenium.webdriver.support.select import Select
    from winsound import Beep
    ​
    ​
    path = r"E:chrome_driverchromedriver.exe"
    url = "https://kyfw.12306.cn/otn/leftTicket/init?"# 返回一个对象  browser就是我门的一个浏览器
    browser = webdriver.Chrome(path)
    ​
    time.sleep(5)
    browser.get(url)
    ​
    # 元素定位
    # 出发地id fromStationText
    start_city = browser.find_element_by_id("fromStationText")
    # 元素交互
        # click() 模拟鼠标单击事件
        # clear() 清空内容
        # send_keys(要输入的内容)
    start_city.click()
    start_city.clear()
    start_city.send_keys("北京
    ")
    ​
    # 目的地id:toStationText
    end_city = browser.find_element_by_id("toStationText")
    end_city.click()
    end_city.clear()
    end_city.send_keys("上海
    ")
    ​
    choice_time = Select(browser.find_element_by_id("cc_start_time"))
    # choice_time.select_by_index() 通过索引来取值
    choice_time.select_by_visible_text("12:00--18:00")
    ​
    # #date_range li:nth-child(4)
    data = browser.find_element_by_css_selector("#date_range li:nth-child(4)")
    data.click()
    # 防止有网络延迟
    time.sleep(3)
    ​
    favorite = ["G3","G137","G21"]
    ​
    xpath = '//tbody[@id="queryLeftTable"]//td[4][@class]/../td[1]//a'
    train_list = browser.find_elements_by_xpath(xpath)
    ​
    for train in train_list:
        train_num = train.text
        if train_num in favorite:
            print("亲  有票了哦!!!")
            target = train.find_elements_by_xpath('../../../../../td[13]/a')[0]
            # print(target)
            target.click()
            input("请手动登陆  登陆成功之后请按回车键")
    ​
            time.sleep(3)
            browser.find_element_by_id("normalPassenger_0").click()
            browser.find_element_by_id("submitOrder_id").click()
    ​
            time.sleep(10)
            browser.find_element_by_id("qr_submit_id").click()
    ​
            print("亲  恭喜您抢票成功!!!")
            # 第一个参数代表声音大小  第二个参数代表时长  1000 = 1秒
            Beep(3000,3000)
            break
        else:
            print("亲  暂时还没有票  请耐心等待...")
    browser.quit()

     

     

  • 相关阅读:
    android 多渠道打包
    第三方授权认证(一)实现第三方授权登录、分享以及获取用户资料
    Android:支持不同分辨率的屏幕设计 .
    动画效果编程基础--AnimationAndroid
    Android使用尺寸资源 dimens .
    android手机分辨率整理
    线程和进程
    js和html的结合方式
    成员变量和局部变量
    MySQL基础知识
  • 原文地址:https://www.cnblogs.com/cui00/p/12692392.html
Copyright © 2011-2022 走看看