import time
from datetime import datetime, timedelta
from appium import webdriver
from selenium.webdriver.common.by import By
#from appium.webdriver.extensions.android.nativekey import AndroidKey
"""優(yōu)化部分"""
'''
需要預(yù)留彈窗l(fā)ine61
*******************************appium響應(yīng)過(guò)慢,需要提前啟動(dòng)appium***************************************
'''
"""優(yōu)化部分"""
'''設(shè)置部分'''
#初始化個(gè)人信息
pre_tickets_name="蔡徐坤"
audience_count=1
#填寫(xiě)時(shí)間為24小時(shí)制
main_hour =20
main_minute =38
'''設(shè)置部分'''
desired_caps = {
'platformName': 'Android', # 被測(cè)手機(jī)是安卓
'platformVersion': '12', # 手機(jī)安卓版本
'deviceName': 'xxx', # 設(shè)備名,安卓手機(jī)可以隨意填寫(xiě)
'appPackage': 'cn.damai', # 啟動(dòng)APP Package名稱
'appActivity': '.launcher.splash.SplashMainActivity', # 啟動(dòng)Activity名稱
'unicodeKeyboard': True, # 使用自帶輸入法,輸入中文時(shí)填True
'resetKeyboard': True, # 執(zhí)行完程序恢復(fù)原來(lái)輸入法
'noReset': True, # 不要重置App
'newCommandTimeout': 6000,
'automationName' : 'UiAutomator2'
# 'app': r'd:\apk\bili.apk',
}
#連接appium sever,初始化自動(dòng)環(huán)境
#Remote就是driver類的對(duì)象
def start_get_ticket():
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
#設(shè)置缺省時(shí)間
#測(cè)試過(guò)程出現(xiàn)彈窗,需要修改,或者半人工,需要將隱式等待增長(zhǎng)
driver.implicitly_wait(9)
###開(kāi)始自動(dòng)化測(cè)試
print("5s后開(kāi)始自動(dòng)化測(cè)試")
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()
###需要預(yù)留一個(gè)彈窗位置
###暫時(shí)認(rèn)為需要半人工處理信息
print("前置查找元素任務(wù)已經(jīng)完成,接下來(lái)完成自動(dòng)搶票任務(wù)")
print("查找元素的任務(wù)已經(jīng)完成,請(qǐng)接下來(lái)完成半人工任務(wù):修改預(yù)售票的參數(shù),時(shí)常20秒")
time.sleep(20)
print("即將開(kāi)始搶票,正在等待售票時(shí)間的到來(lái)")
# 獲取當(dāng)前時(shí)間并轉(zhuǎn)換為北京時(shí)間
utc_now = datetime.utcnow()
beijing_now = utc_now + timedelta(hours=8)
# 設(shè)置任務(wù)開(kāi)始時(shí)間
task_time = beijing_now.replace(hour=main_hour, minute=main_minute, second=0, microsecond=0)
# 計(jì)算距離任務(wù)開(kāi)始時(shí)間的時(shí)間差
delta_time = task_time - beijing_now
wait_seconds = delta_time.total_seconds()
# 等待一定時(shí)間后執(zhí)行任務(wù)
time.sleep(wait_seconds)
# 即將開(kāi)始執(zhí)行搶票任務(wù)的代碼
driver.implicitly_wait(2)
"""立即購(gòu)買"""
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 1
if __name__=='__main__':
if(start_get_ticket()):
print("所有任務(wù)都完成")
"""
logs
finish in 2023/6/21/16:04
"""
使用appium不是一個(gè)很好的選擇,而且也不一定能搶到票,由于沒(méi)有學(xué)習(xí)逆向工程,所以這個(gè)只能使用這個(gè)框架,這個(gè)框架在界面中有輪播,播放的情況下,定位元素會(huì)十分慢,但是我周圍的人確實(shí)能夠手工搶到票,做這個(gè)的意義就是省去人工操作,最后提升下我的技能。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-581859.html
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-581859.html
到了這里,關(guān)于appium移動(dòng)端python大麥網(wǎng)搶票的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!