import timefrom datetime import datetime, timedeltafrom appium import webdriverfrom selenium.webdriver.common.by import By#from appium.webdriver.extensions.android.nativekey import AndroidKey"""优化部分"""'''需要预留弹窗line61 *******************************appium响应过慢,需要提前启动appium***************************************'''"""优化部分"""'''设置部分'''#初始化个人信息pre_tickets_name="蔡徐坤"audience_count=1#填写时间为24小时制main_hour =20main_minute =38'''设置部分'''desired_caps = { 'platformName': 'Android', # 被测手机是安卓 'platformVersion': '12', # 手机安卓版本 'deviceName': 'xxx', # 设备名,安卓手机可以随意填写 'appPackage': 'cn.damai', # 启动APP Package名称 'appActivity': '.launcher.splash.SplashMainActivity', # 启动Activity名称 'unicodeKeyboard': True, # 使用自带输入法,输入中文时填True 'resetKeyboard': True, # 执行完程序恢复原来输入法 'noReset': True, # 不要重置App 'newCommandTimeout': 6000, 'automationName' : 'UiAutomator2' # 'app': r'd:\apk\bili.apk',}#连接appium sever,初始化自动环境#Remote就是driver类的对象def start_get_ticket(): driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) #设置缺省时间 #测试过程出现弹窗,需要修改,或者半人工,需要将隐式等待增长 driver.implicitly_wait(9) ###开始自动化测试 print("5s后开始自动化测试") time.sleep(5) driver.find_element(By.XPATH,'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.LinearLayout[2]').click() search_box=driver.find_element(By.XPATH,'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.RelativeLayout/android.widget.EditText') search_box.send_keys(pre_tickets_name) driver.find_element(By.XPATH,'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.ViewFlipper/android.widget.FrameLayout/androidx.recyclerview.widget.RecyclerView/android.widget.RelativeLayout[1]/android.widget.TextView[2]').click() driver.find_element(By.XPATH,'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.ViewFlipper/android.widget.LinearLayout/androidx.viewpager.widget.ViewPager/android.widget.FrameLayout/android.widget.FrameLayout/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.widget.FrameLayout[1]/android.widget.LinearLayout').click() ###需要预留一个弹窗位置 ###暂时认为需要半人工处理信息 print("前置查找元素任务已经完成,接下来完成自动抢票任务") print("查找元素的任务已经完成,请接下来完成半人工任务:修改预售票的参数,时常20秒") time.sleep(20) print("即将开始抢票,正在等待售票时间的到来") # 获取当前时间并转换为北京时间 utc_now = datetime.utcnow() beijing_now = utc_now + timedelta(hours=8) # 设置任务开始时间 task_time = beijing_now.replace(hour=main_hour, minute=main_minute, second=0, microsecond=0) # 计算距离任务开始时间的时间差 delta_time = task_time - beijing_now wait_seconds = delta_time.total_seconds() # 等待一定时间后执行任务 time.sleep(wait_seconds) # 即将开始执行抢票任务的代码 driver.implicitly_wait(2) """立即购买""" driver.find_element(By.XPATH, "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout[2]/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.LinearLayout").click() """确定""" driver.implicitly_wait(4) driver.find_element(By.XPATH, "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout[2]/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.TextView").click() """选择观众,1位或者2位""" if (audience_count == 1): driver.implicitly_wait(2) driver.find_element(By.XPATH, "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.RelativeLayout/androidx.recyclerview.widget.RecyclerView/android.widget.LinearLayout[1]/androidx.recyclerview.widget.RecyclerView/android.widget.LinearLayout[1]/android.widget.CheckBox").click() if (audience_count == 2): driver.implicitly_wait(2) driver.find_element(By.XPATH, "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.RelativeLayout/androidx.recyclerview.widget.RecyclerView/android.widget.LinearLayout[1]/androidx.recyclerview.widget.RecyclerView/android.widget.LinearLayout[1]/android.widget.CheckBox").click() driver.find_element(By.XPATH, "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.RelativeLayout/androidx.recyclerview.widget.RecyclerView/android.widget.LinearLayout[1]/androidx.recyclerview.widget.RecyclerView/android.widget.LinearLayout[2]/android.widget.CheckBox").click() """提交订单""" driver.implicitly_wait(2) driver.find_element(By.XPATH, "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.RelativeLayout/android.widget.LinearLayout[2]/android.widget.FrameLayout/android.widget.LinearLayout[2]/android.widget.TextView[3]").click() return 1if __name__=='__main__': if(start_get_ticket()): print("所有任务都完成")"""logsfinish in 2023/6/21/16:04"""
使用appium不是一个很好的选择,而且也不一定能抢到票,由于没有学习逆向工程,所以这个只能使用这个框架,这个框架在界面中有轮播,播放的情况下,定位元素会十分慢,但是我周围的人确实能够手工抢到票,做这个的意义就是省去人工操作,最后提升下我的技能。
来源地址:https://blog.csdn.net/weixin_73288362/article/details/131334046