在做自動化的過程中,我們都會發現每次都要從頭開始點,一直要點到最后,如果中間出現錯誤,就需要重現去點,這樣很麻煩也很費時間,今天我們來認識一種非常簡單的方法,想要測試那個頁面,我們就直接跳轉到哪個頁面進行測試。
Activity
Activity是Android系統中的四大組件之一,可以用於顯示View。幾乎所有的Activity都是對於用戶進行交互的,如果還不懂的話,頁面,我們所看到的app中的頁面就屬於一個Activity。其中Android四大組件有Activity,Service服務,Content Provider內容提供,BroadcastReceiver廣播接收器。
言歸正傳,我們繼續說我們的想要每次都啟動到我們想要的頁面,既然前面也說了,每個頁面都表示一個Activity,那么我么可以通過Activity的方式來進入
獲取Activity的方法
通過adb方式獲取Activity
# 通過adb方式獲取Activity # 方法一: adb shell dumpsys activity top | findstr ACTIVITY # 方法二: adb shell dumpsys activity | findstr "mFocusedActivity" # 方法三: adb shell dumpsys activity activities
通過代碼方式獲取Activity
在代碼中我們可以通過 driver.current_activity 方法獲取
# coding:utf-8 from appium import webdriver import time desired_caps = { 'platformName': 'Android', # 測試版本 'deviceName': 'emulator-5554', # 設備名 'platformVersion': '5.1.1', # 系統版本 "appPackage": "com.taobao.taobao", # app包名 "appActivity": "com.taobao.tao.welcome.Welcome", # 啟動launch Activity "noReset": True, # 不清空數據 "unicodeKeyboard": True, # 使用Unicode編碼方式發送字符串 "resetKeyboard": True, # 鍵盤隱藏起來 } driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) time.sleep(10) text = 'text("注冊/登錄")' driver.find_element_by_android_uiautomator(text).click() time.sleep(2) # 獲取頁面activity a = driver.current_activity print(a) ----------------結果----------------------- com.ali.user.mobile.login.ui.UserLoginActivity
通過Activity啟動app對應頁面
前面已經了解到了如何獲取Activity的方法了,接下來我們就要繼續通過Activity直接進入到app對應頁面中
方法一:
直接在desired_caps的配置文件中把appActivity中改成對應的Activity,直接運行代碼
# coding:utf-8 from appium import webdriver desired_caps = { 'platformName': 'Android', # 測試版本 'deviceName': 'emulator-5554', # 設備名 'platformVersion': '5.1.1', # 系統版本 "appPackage": "com.taobao.taobao", # app包名 "appActivity": "com.ali.user.mobile.login.ui.UserLoginActivity", # 啟動launch Activity "noReset": True, # 不清空數據 "unicodeKeyboard": True, # 使用Unicode編碼方式發送字符串 "resetKeyboard": True, # 鍵盤隱藏起來 } driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
方法二:
啟動完App后通過 start_activity 方法直接跳轉到對應app
源碼:
class Activities(webdriver.Remote): def start_activity(self, app_package, app_activity, **opts): """在測試期間打開任意活動。如果活動屬於 另一個應用程序,啟動該應用程序並打開活動。 這是一個android專用的方法。 參數: - app_package -包含要啟動的活動的包。 - app_activity -要啟動的活動。 - app_wait_package -啟動此包后開始自動化(可選)。 - app_wait_activity -啟動該活動后開始自動化(可選)。 - intent_action -啟動意圖(可選)。 - intent_category -意圖類別開始(可選)。 - intent_flags -發送到意圖的標志(可選)。 - optional_intent_arguments - intent的可選參數(可選) - dont_stop_app_on_reset -應用程序應該在重置時停止(可選)? """ data = { 'appPackage': app_package, 'appActivity': app_activity } arguments = { 'app_wait_package': 'appWaitPackage', 'app_wait_activity': 'appWaitActivity', 'intent_action': 'intentAction', 'intent_category': 'intentCategory', 'intent_flags': 'intentFlags', 'optional_intent_arguments': 'optionalIntentArguments', 'dont_stop_app_on_reset': 'dontStopAppOnReset' } for key, value in arguments.items(): if key in opts: data[value] = opts[key] self.execute(Command.START_ACTIVITY, data) return self
通過源碼可以看出來,需要兩個參數,一個是包名,一個是activity
# coding:utf-8 from appium import webdriver import time desired_caps = { 'platformName': 'Android', # 測試版本 'deviceName': 'emulator-5554', # 設備名 'platformVersion': '5.1.1', # 系統版本 "appPackage": "com.taobao.taobao", # app包名 "appActivity": "com.taobao.tao.welcome.Welcome", # 啟動launch Activity "noReset": True, # 不清空數據 "unicodeKeyboard": True, # 使用Unicode編碼方式發送字符串 "resetKeyboard": True, # 鍵盤隱藏起來 } driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) time.sleep(10)
# 通過start_activity跳轉 driver.start_activity('com.taobao.taobao','com.ali.user.mobile.login.ui.UserLoginActivity')
當然了start_activity不僅可以打開內部的app,如果我們想要調用其他的app也可以打開,直接輸入包名和activity就可以了。這里安靜就不給大家演示了。