stf+appium app 真機自動化平臺實現

cool發表於2020-08-27

一、背景

之前搭建過一套stf的真機雲測平臺,最近在搞app自動化,想將stf與appium結合起來,搭建app真機自動化平臺

二、架構圖

架構圖

【備註】:android-provider功能已實現,ios-provider功能待實現
【github地址】:https://github.com/xglh/stf-appium-github

三、前期準備

1、手機上安裝Appium setting等appium工具
2、部署stf服務,將手機接入stf網路,配置stf-openapi token。注意,一定要先安裝Appium setting.apk再接入stf,不然會被stf還原

stf部署參考文件:Android部署IOS部署
stf openapi參考文件:stf-openapi
stf_devices
stf token

3、在stf-provider節點啟動appium程式,一個appium程式繫結一臺手機
#/bin/bash
nohup appium -p 4725 -U a32a6a4e --session-override > appium_a32a6a4e.log &
nohup appium -p 4726 -U b046c875 --session-override > appium_b046c875.log &
4、更改driver.config相應配置

四、基本工作流程

1、ftp上傳app到provider伺服器
2、獲取到可用的裝置號serial_no
# 裝置連線狀態
@unique
class DeviceStatusEnum(Enum):
# adb連線正常
ADB_READY = 'ADB_READY'
# appium連線正常
APPIUM_READY = 'APPIUM_READY'
# stf連線正常
STF_READY = 'STF_READY'
# stf被佔用
STF_LOCKED = 'STF_LOCKED'

定義裝置連線狀態,APPIUM_READY,STF_READY狀態的裝置才可用,優先返回STF_READY狀態的裝置

存在問題:
stf暫時無法連線android 10系統的手機,但是繫結appium程式後也可以執行自動化指令碼,故優先取STF_READY狀態的裝置,再取APPIUM_READY狀態的裝置

3、啟動driver,不指定package和activity
desired_caps = {
"platformName": self.platform,
# appium setting不需要重複安裝
"skipServerInstallation": True,
"skipDeviceInitialization": True,
"deviceName": serial_no,
}
driver = webdriver.Remote(appium_hub, desired_caps)
4、另開執行緒執行adb install命令,主程式通過appium點選繼續安裝按鈕

confirm install

confirm permission

def _confirm_install_app(self, ssh_client: SSHClient, driver, serial_no):
'''
確認安裝apk,需要根據不同機型適配
:param ssh_client:ssh物件
:param driver: driver物件
:param serial_no: 裝置編號
:return: start_activityopts引數,解決啟動的activity不是指定的activity場景
{
'app_wait_package': 'com.android.packageinstaller',
'app_wait_activity': '.permission.ui.GrantPermissionsActivity'
}
'''
opts = {}
# Redmi K20點選繼續安裝按鈕
if serial_no == 'ca352a47':
# 啟動後的activity與目標的不一樣,需要設定start_activity方法的app_wait_packageapp_wait_activity
opts = {
'app_wait_package': 'com.lbe.security.miui',
'app_wait_activity': 'com.android.packageinstaller.permission.ui.GrantPermissionsActivity'
}
# 點選繼續安裝按鈕
WebDriverWait(driver, driver_wait_timeout, driver_wait_poll_frequency).until(
EC.element_to_be_clickable((By.ID, "android:id/button2"))
).click()

return opts

需要根據不同的機型適配確認安裝操作和啟動後的app_wait_package,app_wait_activity引數

5、啟動app
# 啟動app
driver.start_activity(package_name, activity_name, appWaitDuration=10000, **opts)
time.sleep(1)
driver.switch_to.alert.accept()

stf locked.jpg

備註:此狀態為裝置佔用狀態,可以點選進去檢視實時執行效果

以上流程實現apk安裝到啟動的流程

五、具體使用

from driver.driver_manager import DriverManager

app_path = 'xxx'
package_name, activity_name = 'xxx', 'xxx'
# 初始化並上傳app
mDriverManager = DriverManager('android', app_path)

# 1、獲取任意一個可用裝置
driver_info = mDriverManager.get_driver(package_name, activity_name)
# 2、獲取指定標號的裝置
driver_info = mDriverManager.get_driver(package_name, activity_name, serial_no='ca352a47')
# 3、獲取所有可用裝置
driver_info = mDriverManager.get_driver(package_name, activity_name, acquire_all_device=True)
print(driver_info)
# 獲取driver物件
for serial_no in driver_info:
driver = driver_info[serial_no]['driver']
# 釋放裝置
mDriverManager.close()
'''
driver_info示例
{
'ca352a47': {
'device_status': 'STF_LOCKED',
'appium_hub': 'http://1.1.1.1:4727/wd/hub',
'ssh_client': < driver.ssh_manager.SSHClient object at 0x000001EAD52CA860 > ,
'release': '9',
'sdk': '28',
'manufacturer': 'Xiaomi',
'model': 'Redmi K20',
'wm_size': '1080x2340',
'driver': < appium.webdriver.webdriver.WebDriver(session = "246646ac-bf0a-49a8-8b99-7a68b40a7444") >
}
}
'''

六、當前進展&後續開發擴充計劃

當前完成度:

android接入5臺裝置,完成測試app簡單的登入退出demo

後續開發擴充計劃:

1、接入ios-provider
2、完善框架日誌和錄屏功能
3、編寫文件,準備團隊內推廣

相關文章