前面我們把簡單的頁面邏輯,定位元素,已經定位方法都封裝好了,但是還不支持一鍵啟動,為什么呢?因為我們還要去打開appium才可以,那我們可以思考下,如果把appium命令行啟動也封裝起來,那是不是真的可以一鍵執行了?實現了自動化?
appium參數配置
在前面的版本中說明了,appium分為客戶端和命令行的,在自動化中想要一鍵執行的話,如果通過客戶端做成一鍵啟動成本有點大,但是可以通過命令行去啟動appium,這樣簡單易實現
appium命令行安裝:appium---命令行啟動appium
這里要提到一點,依然要用到命令行了,那肯定需要了解一些參數。參考地址:Appium 服務命令行參數
命令行參數配置
標志 | 默認值 | 描述 | 例子 |
---|---|---|---|
|
null |
進入 REPL 模式 |
|
|
en.lproj |
IOS only: 定位 .strings所在目錄的相對路徑 |
|
|
null |
iOS: 基於模擬器編譯的 app 的絕對路徑或者設備目標的 bundle_id; Android: apk 文件的絕對路徑 |
|
|
null |
(IOS-only) .ipa 文件的絕對路徑 |
|
|
null |
連接物理設備的唯一設備標識符 |
|
|
0.0.0.0 |
監聽的 ip 地址 |
|
|
4723 |
監聽的端口 |
|
|
null |
回調IP地址 (默認: 相同的IP地址) |
|
|
null |
回調端口號 (默認: 相同的端口號) |
|
|
4724 |
(Android-only) 連接設備的端口號 |
|
|
false |
棄用,無效。trace信息現在保留tmp目錄下,每次運行前會清除該目錄中的信息。 也可以參考 –trace-dir 。 |
|
|
3 |
(iOS-only) 遇到 crash 或者 超時,Instrument 重新啟動的次數。 |
|
|
false |
允許 session 被覆蓋 (沖突的話) |
|
|
false |
(iOS) 刪除整個模擬器目錄。 (Android) 通過卸載應用(而不是清除數據)重置應用狀態。在 Android 上,session 完成后也會刪除應用。 |
|
|
false |
session 之間不重置應用狀態 (iOS: 不刪除應用的 plist 文件; Android: 在創建一個新的 session 前不刪除應用。) |
|
|
false |
在第一個 session 前,預啟動應用 (iOS 需要 –app 參數,Android 需要 –app-pkg 和 –app-activity) |
|
|
90000 |
(iOS-only) 等待 Instruments 啟動的時間 |
|
|
null |
將日志輸出到指定文件 |
|
|
debug |
日志級別; 默認 (console[:file]): debug[:debug] |
|
|
false |
在終端輸出里顯示時間戳 |
|
|
false |
使用本地時間戳 |
|
|
false |
不在終端輸出中顯示顏色 |
|
|
null |
同時發送日志到 HTTP 監聽器 |
|
|
false |
(IOS-only) iOS 內建了一個怪異的不可能避免的延遲。我們在 Appium 里修復了它。如果你想用原來的,你可以使用這個參數。 |
|
|
null |
(Android-only) 你要運行的apk的java包。 (例如, com.example.android.myApp) |
|
|
null |
(Android-only) 打開應用時,啟動的 Activity 的名字(比如, MainActivity) |
|
|
false |
(Android-only) 你想等待的 Activity 的包名。(比如, com.example.android.myApp) |
|
|
false |
(Android-only) 你想等待的 Activity 名字(比如, SplashActivity) |
|
|
false |
(Android-only) 完全符合條件的 instrumentation 類。 作為命令 adb shell am instrument -e coverage true -w 的 -w 的參數 |
|
|
null |
(Android-only) 要啟動的 avd 的名字 |
|
|
null |
(Android-only) 添加額外的參數給要啟動avd |
|
|
5 |
(Android-only) 等待設備准備好的時間,以秒為單位 |
|
|
false |
(IOS-Only) 使用 Safari 應用 |
|
|
null |
待使用的移動設備名字 |
|
|
null |
移動平台的名稱: iOS, Android, or FirefoxOS |
|
|
null |
移動平台的版本 |
|
|
null |
自動化工具的名稱: Appium or Selendroid |
|
|
null |
移動瀏覽器的名稱: Safari or Chrome |
|
|
false |
(IOS-Simulator-only) 使用instruments自己啟動的默認模擬器 |
|
|
false |
(IOS-only) 無論應用要用什么模擬器,強制使用 iPhone 模擬器 |
|
|
false |
(IOS-only) 無論應用要用什么模擬器,強制使用 iPad 模擬器 |
|
|
null |
iOS / Android 模擬器的語言 |
|
|
null |
Locale for the iOS simulator / Android Emulator |
|
|
null |
(IOS-only) iOS 模擬器的日歷格式 |
|
|
null |
(IOS-only) 初始化請求時,使用 LANDSCAPE (橫屏) 或者 PORTRAIT (豎屏) |
|
|
null |
(IOS-only) 指定 Instruments 使用的 tracetemplate 文件 |
|
|
false |
(IOS-only) 如果設置了, iOS 模擬器的日志會寫到終端上來 |
|
|
false |
(IOS-only) 如果設置了, iOS 系統的日志會寫到終端上來 |
|
|
null |
指定 JSON 格式的配置文件 ,用來在 selenium grid 里注冊 appiumd |
|
|
0.0.0.0 |
robot 的 ip 地址 |
|
|
-1 |
robot 的端口地址 |
|
|
8080 |
用來和 Selendroid 交互的本地端口 |
|
|
9515 |
ChromeDriver運行的端口 |
|
|
null |
ChromeDriver 可執行文件的完整路徑 |
|
|
false |
(Android-only) 設置簽名 apk 的 keystore |
|
|
(Android-only) keystore 的路徑 |
|
|
|
android |
(Android-only) keystore 的密碼 |
|
|
androiddebugkey |
(Android-only) Key 的別名 |
|
|
android |
(Android-only) Key 的密碼 |
|
|
false |
打印 Appium 服務器的配置信息,然后退出 |
|
|
false |
跳過Appium對是否可以讀/寫必要文件的檢查 |
|
|
60 |
默認所有會話的接收命令超時時間 (在超時時間內沒有接收到新命令,自動關閉會話)。 會被新的超時時間覆蓋 |
|
|
false |
(iOS) 當 Appium 啟動或者關閉的時候,是否保留 keychains (Library/Keychains) |
|
|
false |
如果所選設備是appium不承認的有效設備,會導致會話失敗 |
|
|
false |
Xcode 6存在一個bug,那就是一些平台上如果其他模擬器設備先被刪除時某個特定的模擬器只能在沒有任何錯誤的情況下被建立。這個選項導致了Appium不得不刪除除了正在使用設備以外其他所有的設備。請注意這是永久性刪除,你可以使用simctl或xcode管理被Appium使用的設備類別。 |
|
|
null |
可以被Appium用來管理臨時文件的目錄(絕對路徑),比如存放需要移動的內置iOS應用程序。 默認的變量為 |
|
|
null |
用於保存iOS instruments trace的 appium 目錄,是絕對路徑, 默認為 /appium-instruments |
|
|
android.intent.action.MAIN |
(Android-only) 用於啟動 activity 的intent action |
|
|
android.intent.category.LAUNCHER |
(Android-only) 用於啟動 activity 的intent category |
|
|
0x10200000 |
(Android-only) 啟動 activity 的標志 |
|
|
null |
(Android-only) 啟動 activity 時附帶額外的 intent 參數 |
|
--suppress-adb-kill-server |
false | (Android-only) 如果被設定,阻止Appium殺掉adb實例。 |
封裝appium
1、封裝Dos命令
因為appium命令啟動需要依賴於Dos命令,這里先把Dos命令封裝進來,這里加上了獲取設備信息,后面我們需要傳入到appium中,這里封裝了三種方法。
# coding:utf-8
# dos_cmd.py
import os class Dos_adb: def get_adb_result(self,command): ''' :param command: Dos中輸入內容 :return: 返回解決內容 ''' adb_result = os.popen(command).read().split('\n') return adb_result def get_device(self): ''' 獲取到設備信息 ''' xx = Dos_adb() devices = [] result_list = xx.get_adb_result('adb devices') result = [x for x in result_list if x != ''] if len(result)>1: for i in result: if 'List' in i: continue de = i.split('\tdevice') devices.append(de[0]) return devices else: return None def get_adb(self,command): ''' 執行adb 命令: ''' os.system(command) if __name__ == '__main__': x= Dos_adb() x.get_adb_result('appium')
2、封裝appium讀取設備信息
這里也直接把設備信息全部封裝進來了,如果多設備的話就不能這樣寫了。這里也可以把設備信息封裝在yaml中,方法不唯一。
# coding:utf-8
# appium_start.py
from appium import webdriver from common.dos_cmd import Dos_adb import os path =os.path.dirname(os.getcwd())
# appium日志路徑 appium_log = os.path.join(os.path.join(path,'logs'),'appium_log.txt') class Appium_start(): def Android_device(self): '''啟動app''' desired_caps = { 'platformName': 'Android', # 測試版本 '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) return driver def start(self): ''' 啟動appium ''' adb = Dos_adb() devices = adb.get_device()[0] a = 'appium -p 4723 -U '+devices +' --log %s' %appium_log adb.get_adb(a) if __name__ == '__main__': xx = Appium_start() xx.start() xx.Android_device()
3、執行用例
這里我們在前面的封裝用例的基礎上進行了更改,把封裝的appium通過多線程的方法進行執行。
# coding:utf-8 # start_login.py from pages.login_page import LoginPage import time import os from common.appium_start import Appium_start import threading path =os.path.dirname(os.getcwd()) # 獲取到yaml文件路徑 yaml_path = os.path.join(os.path.join(path,'config'),'element.yaml') class BaseDriver: def login(self,driver): page =LoginPage(driver) time.sleep(8) # 獲取用戶名元素以及輸入內容 use = page.get_username_element(yaml_path) use.send_keys('1111') # 獲取密碼元素以及輸入內容 pas = page.get_password_element(yaml_path) pas.send_keys('22222') # 進行點擊登錄 button = page.get_login_button_element(yaml_path) button.click() if __name__ == '__main__': t2 = threading.Thread(target=Appium_start().start) t2.start() time.sleep(20) xx= Appium_start().Android_device() t1 = threading.Thread(target=BaseDriver().login(xx)) t1.start()
這里需要注意的是我們通過代碼啟動appium的過程中需要用到多線程,因為appium啟動完成后,沒有辦法進行繼續執行其他的代碼
感謝您的關注,哪里不懂的可以下方留言,看到后第一時間回復