本节将自主选座和添加邮寄地址和购票人信息两个部分的功能划到一起,因为这两部分的内容极为相似,其核心的做法都是对网站前端的类class,按钮button,标签div进行监控,当检测到对应的内容时,进行如click等操作。
这里以对选择购票人为例,
因为这里有一个常见的按钮监控不到的问题,
这里分析原因,其一是大麦网本身防止用户使用软件进行抢票,过快的操作将被禁止,其二是大麦网本身对标签的日常更新,导致很多抢票软件需要继续开发才能继续使用。
解决方案如下:
1.更新标签
(1)按F12,点击红标按钮,对于鼠标接触到的所有前端信息,控制台都将转到其标签下
(2)找到对应的标签并进行前端语言转化
可以看到标签1对应的checkbox目前处于false状态,也可以看到观演人的标签是处于w1200这个类下的,同时也在confirmOrder_1这个标签下,这里采用confirmOrder_1作为基检测标签,对应到input按钮的逻辑为:
div(confirmOrder_1)/div[2]/div[2]/div[1]/div[1]/label/span/input
2.进行不断刷新的抢票机制
由于网络问题有时候检测不到checkbox的加载,这里采用的方案是一直监听aria-checked的状态,如果一直为false,那么一直进行选择,即
while(stat.get_attribute('aria-checked') == 'false'):
time.sleep(0.5)
stat = self.driver.find_elements_by_xpath(
'//div[@id="confirmOrder_1"]/div[2]/div[2]/div[1]/div[1]/label/span/input')[
0]
self.driver.find_elements_by_xpath(
'//div[@id="confirmOrder_1"]/div[2]/div[2]/div[1]/div[1]/label/span/input')[
0].click()
print(stat.get_attribute('aria-checked'))
总体代码如下:
def enter_concert(self):
print('###打开浏览器,进入大麦网###')
self.driver = webdriver.Chrome()
self.login()
self.driver.refresh()
self.status = 2
print("###登录成功###")
def choose_ticket(self):
if self.status == 2:
self.num = 1
print("=" * 30)
print("###开始进行日期及票价选择###")
while self.driver.title.find('确认订单') == -1:
buybutton = self.driver.find_element_by_class_name('buybtn').text
if buybutton == "即将开抢":
self.status = 2
self.driver.get(target_url)
print('###抢票未开始,刷新等待开始###')
continue
elif buybutton == "立即预定":
self.driver.find_element_by_class_name('buybtn').click()
self.status = 3
self.num = 1
elif buybutton == "立即购买":
self.driver.find_element_by_class_name('buybtn').click()
self.status = 4
elif buybutton == "选座购买":
self.driver.find_element_by_class_name('buybtn').click()
self.status = 5
elif buybutton == "提交缺货登记":
print('###抢票失败,请手动提交缺货登记###')
break
title = self.driver.title
if title == "确认订单":
self.check_order()
elif self.status == 5:
print("###请自行选择位置和票价###")
break
def check_order(self):
if self.status in [3, 4]:
if(ticket_number == '1'):
stat = self.driver.find_elements_by_xpath(
'//div[@id="confirmOrder_1"]/div[2]/div[2]/div[1]/div[1]/label/span/input')[
0]
while(stat.get_attribute('aria-checked') == 'false'):
time.sleep(0.5)
stat = self.driver.find_elements_by_xpath(
'//div[@id="confirmOrder_1"]/div[2]/div[2]/div[1]/div[1]/label/span/input')[
0]
self.driver.find_elements_by_xpath(
'//div[@id="confirmOrder_1"]/div[2]/div[2]/div[1]/div[1]/label/span/input')[
0].click()
print(stat.get_attribute('aria-checked'))
print('###不选择订单优惠###')
print('###请在付款完成后下载大麦APP进入订单详情页申请开具###')
time.sleep(1)
self.driver.find_elements_by_xpath('//div[@class = "w1200"]//div[2]//div//div[9]//button[1]')[0].click()
def finish(self):
self.driver.quit()
欢迎评论文章,给予宝贵建议,工程提供在github下载学习,请关注作者,共同学习交流。
github工程:https://github.com/sinxuy/Damai