解决12306抢票系统弹出来的弹窗问题
应为疫情原因进入12306网站登陆界面弹出来这样一个界面
进入登陆界面的网站,把鼠标放在确定的位置右键点击检查,找到
# 我把它放在另一个函数中,这样调用就可以了
def click_ok1(self):
bounce_button = driver.find_element_by_css_selector(".btn.btn-primary.ok")
bounce_button.click()
第二个弹出来的界面也是和上面的解决方法是一样的
把鼠标放在确认键,右键点击检查
hint_button = driver.find_element_by_css_selector("#content_defaultwarningAlert_id .up-box-bd .lay-btn")
if hint_button:
hint_button.click()
以上就是我解决的这个方法,下面我我做这个12306完整的代码,
import csv
import datetime
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
driver = webdriver.Chrome(executable_path="D:\Spyder-selinuim\ChromeDriver\chromedriver.exe")
# 9:商务座,M:一等座,O:二等座,3:硬卧,4:软卧,1:硬座
class TrainSpyder(object):
login_url = "https://kyfw.12306.cn/otn/resources/login.html"
login_after_url = "https://kyfw.12306.cn/otn/view/index.html"
search_ticket_url = "https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc"
confirm_passengers_url = "https://kyfw.12306.cn/otn/confirmPassenger/initDc"
def __init__(self, from_station, to_station, start_date, trains_num, passengers):
"""
:param from_station:起始站
:param to_station: 终点站
:param start_date:起始时间
:param trains_num:车次。{""}
:param passengers:乘客信息列表
"""
self.from_station = from_station
self.to_station = to_station
self.start_date = start_date
self.trains_num = trains_num
self.passengers = passengers
self.selected_num = None
# 初始化站点多对应的代号
self.station_codes = {}
self.init_station_code()
def init_station_code(self):
with open("stations.csv", 'r', encoding='utf8') as f:
reader = csv.DictReader(f)
for line in reader:
name = line["name"]
code = line["code"]
self.station_codes[name] = code
def login(self):
driver.get(self.login_url)
# 通过手机扫描登陆
input("等待扫描......")
self.click_ok1()
# 等待url是否进入个人中心
WebDriverWait(driver, 100).until(
ec.url_contains(self.login_after_url)
)
print("登录成功!")
def search_ticket(self):
"""
查询余票信息
:return: None
"""
driver.get(self.search_ticket_url)
# 第二个界面弹出来的界面
hint_button = driver.find_element_by_css_selector("#content_defaultwarningAlert_id .up-box-bd .lay-btn")
if hint_button:
hint_button.click()
# 起点站
from_station_input = driver.find_element_by_id("fromStation")
from_station_code = self.station_codes[self.from_station]
driver.execute_script("arguments[0].value='%s'" % from_station_code, from_station_input)
# 终点站
to_station_input = driver.find_element_by_id("toStation")
to_station_codes = self.station_codes[self.to_station]
driver.execute_script("arguments[0].value='%s'" % to_station_codes, to_station_input)
# 设置出发时间
start_data_input = driver.find_element_by_id("train_date")
driver.execute_script("arguments[0].value='%s'" % self.start_date, start_data_input)
# 执行查询操作
search_button = driver.find_element_by_id("query_ticket")
search_button.click()
# 解析车次信息
WebDriverWait(driver, 100).until(
ec.presence_of_element_located((By.XPATH, "//tbody[@='queryLeftTable']/tr"))
)
train_details = driver.find_elements_by_xpath("//tbody[@='queryLeftTable']/tr[not(@datatran)]")
is_searched = False
for train_detail in train_details:
detail_info = train_detail.text.replace("\n", "").split(" ")
number = detail_info[0]
if number in self.trains_num:
seat_types = self.trains_num[number]
# 二等座
for seat_type in seat_types:
if seat_type == "O":
count = detail_info[9]
if count.isdigit() or count == '有':
is_searched = True
break
elif seat_type == "M":
count = detail_info[8]
if count.isdigit() or count == '有':
is_searched = True
break
if is_searched:
self.selected_num = number
orderButton = train_detail.find_elements_by_xpath(".//td[@class='no-br']")
orderButton.click()
def click_ok1(self):
bounce_button = driver.find_element_by_css_selector(".btn.btn-primary.ok")
bounce_button.click()
def confirm_passengers_info(self):
WebDriverWait(driver, 100).until(
ec.url_contains(self.confirm_passengers_url)
)
WebDriverWait(driver, 100).until(
ec.presence_of_element_located((By.XPATH, "//ul[@id='normal_passenger_id']//li/label"))
)
# 确认需要购买车票的乘客
pasenger_labels_input = driver.find_elements_by_xpath("//ul[@id='normal_passenger_id']//li/label")
for pasenger_labels in pasenger_labels_input:
name = pasenger_labels.text
if name in self.passengers:
pasenger_labels.click()
# 确认需要购买的席位信息
seat_select = Select(driver.find_element_by_id("seatType_1"))
seat_types = self.trains_num[self.selected_num]
for seat_type in seat_types:
try:
seat_select.select_by_value(seat_type)
except NoSuchElementException:
continue
else:
break
WebDriverWait(driver, 100).until(
ec.element_to_be_clickable((By.XPATH, "submitOrder_id"))
)
submit_button = driver.find_element_by_id("submitOrder_id")
submit_button.click()
def run(self):
# 1.登录
self.login()
# 2.余票查询
self.search_ticket()
# 3.确定乘客和车次信息
self.comfirm_passengers_info()
def main():
# 9:商务座,M:一等座,O:二等座,3:硬卧,4:软卧,1:硬座
start_date = datetime.date.today().strftime("%Y-%m-%d")
base_info = TrainSpyder("株洲", "深圳", start_date, {"G72":["O", "M"]}, ['严京'])
base_info.run()
if __name__ == '__main__':
main()
最后,鄙人初来乍到,如有不妥,请各位大佬多多指教,一定洗耳恭听。