1.說明
appium官方文檔 : https://appium.io/docs/en/about-appium/intro/
uiselector 元素定位:https://developer.android.google.cn/reference/androidx/test/uiautomator/UiSelector?hl=en
2. 鼠標滑動操作代碼
from appium import webdriver import time from appium.webdriver.common.touch_action import TouchAction desired_caps = { 'platformName':'Android', # 測試Android系統 'platformVersion':'7.1.2', # Android版本 可以在已連接手機 設置->關於手機 中查看 'deviceName':'127.0.0.1:62001', # cmd中使用 adb devices 命令查看已連接的設備 'automationName':'UiAutomator2', # 自動化引擎(默認UiAutomator2即可) 'noReset': True, # 不要重置app的狀態(比如,已經登陸的app,我們運行項目的時候保留之前的狀態) 'fullReset': False, # 不要清理app的緩存數據(比如,已經登陸的app,我們運行項目的時候保留之前的狀態) 'appPackage':"org.cnodejs.android.md", # 應用的包名(打開對應包名的app) 'appActivity': ".ui.activity.MainActivity" # 應用的活動頁名稱 } driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_capabilities=desired_caps) time.sleep(5) viewgroup = driver.find_element_by_android_uiautomator('new UiSelector().className("android.view.ViewGroup").index(2)') # 獲取元素控件的坐標位置(使用坐標位置去計算滑動坐標,可以保證我們在不同的手機上正常運行) print('location', viewgroup.location) # {'x': 0, 'y': 120} 元素的左上角坐標 print('rect', viewgroup.rect) # {'height': 1440, 'width': 900, 'x': 0, 'y': 120} 元素寬高和元素左上角坐標 zb = viewgroup.rect # 滑動的開始坐標x,y 結束坐標x,y 滑動時間(毫秒) # 當前設置效果為:從下往上滑動 driver.swipe(start_x=zb['width']/2,start_y=zb['height']+zb['y']-1,end_x=zb['width']/2,end_y=zb['y']+1,duration=200) # 等同於 # driver.swipe(start_x=450,start_y=1559,end_x=450,end_y=121,duration=200) # 當前設置效果為:從上往下滑動 driver.swipe(start_x=300, start_y=200, end_x=300, end_y=800, duration=200) time.sleep(3) # 點擊頁面中的第一個帖子的作者 first_tiezi = '//*[@resource-id="org.cnodejs.android.md:id/recycler_view"]/android.widget.LinearLayout[1]/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.LinearLayout[2]' driver.find_element_by_xpath(first_tiezi).click() time.sleep(3) # 當前設置效果為:從右往左滑動 driver.swipe(start_x=550,start_y=700,end_x=500,end_y=700,duration=200) time.sleep(3) # 當前設置效果為:從左往右滑動 driver.swipe(start_x=50,start_y=700,end_x=550,end_y=700,duration=200) time.sleep(3)
3.鼠標滑動查找元素
from appium import webdriver import time desired_caps = { 'platformName':'Android', # 測試Android系統 'platformVersion':'7.1.2', # Android版本 可以在已連接手機 設置->關於手機 中查看 'deviceName':'127.0.0.1:62001', # cmd中使用 adb devices 命令查看已連接的設備 'automationName':'UiAutomator2', # 自動化引擎(默認UiAutomator2即可) 'noReset': True, # 不要重置app的狀態(比如,已經登陸的app,我們運行項目的時候保留之前的狀態) 'fullReset': False, # 不要清理app的緩存數據(比如,已經登陸的app,我們運行項目的時候保留之前的狀態) 'appPackage':"org.cnodejs.android.md", # 應用的包名(打開對應包名的app) 'appActivity': ".ui.activity.MainActivity" # 應用的活動頁名稱 } driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_capabilities=desired_caps) time.sleep(5) viewgroup = driver.find_element_by_android_uiautomator('new UiSelector().className("android.view.ViewGroup").index(2)') # 獲取元素控件的坐標位置(使用坐標位置去計算滑動坐標,可以保證我們在不同的手機上正常運行) print('location', viewgroup.location) # {'x': 0, 'y': 120} 元素的左上角坐標 print('rect', viewgroup.rect) # {'height': 1440, 'width': 900, 'x': 0, 'y': 120} 元素寬高和元素左上角坐標 zb = viewgroup.rect ''' 方案一: 滑動的開始坐標x,y 結束坐標x,y 滑動時間(毫秒) 當前設置效果為:從下往上滑動 滑動查找元素文本內容為:你們學會了沒 找到元素后,點擊元素 優點:一邊滑動,一邊查找 缺點:使用這種方法必須要精准的控制滑動速度,否則滑動過快,可能會錯過目標元素 ''' flag = False while True: driver.swipe(start_x=zb['width']/2,start_y=zb['height']+zb['y']-1,end_x=zb['width']/2,end_y=zb['y']+1,duration=200) # 等同於 driver.swipe(start_x=450,start_y=1559,end_x=450,end_y=121,duration=200) eles = driver.find_elements_by_id('org.cnodejs.android.md:id/tv_title') # 獲取多個元素的值 for ele in eles: print(ele.text) if ele.text == "你們學會了沒": ele.click() flag = True break if flag == True: break # 中斷while 循環 ''' 方案二: 滑動查找元素文本內容為:你們學會了沒(使用的時候更改查找內容即可) 找到元素后,點擊元素 缺點:不能一邊滑動一邊加載(適用於通訊錄之類的,不需要加載的),找不到會報錯的 ''' ele = driver.find_element_by_android_uiautomator('new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().text("你們學會了沒").instance(0));') ele.click()