簡介
Capability又叫Appium Desired Capabilities,前邊寫了那麼多例項程式碼,小夥伴可以發現一些規律,就是有一部分程式碼總是重複的出現在你的視線中。這部分就是對Capability的配置。那麼今天給小夥伴們分享、介紹和講解一下Capability。讓你知道她的來龍去脈,知道為什麼程式碼裡那麼寫。
1、 什麼是Capability
在講capability之前大家是否還記得在講log時給大家看過的啟動時的日誌?在我們的整個啟動日誌中會出現一些配置資訊,其實那些資訊就是capability攜帶的配置資訊,如果我們通過程式碼來啟動我們能夠看見的配置資訊如下:
通過上面的配置資訊大家可以看出,在python裡面我們所講的capability其實就是一個字典(我們這裡暫且這麼說,因為每個語言叫法不一樣)。
2、 Capability的作用
我們知道Capability是一個字典之後我們是否需要知道他的作用呢?我們在appium中配置app後我們能夠通過log看出裡面的資訊都是啟動的一些必要配置,通過上面的配置資訊我麼也能夠看出capability配置的就是我們做自動化的一些必要資訊。他主要是告訴server我們本次測試是瀏覽器還是app,是ios還是android以及android的版本資訊等。如果capability不告訴server,那麼server就不認識你,也就無法完成我們的自動化測試。
3、 常用Capability配置講解
3.1 公用Capability
如果有了解過Capability的人會發現一個問題,其實他主要分成了三部分:公共部分、ios部分、android部分,如果你android想用ios的那是不可能的,so,老老實實去了解每個平臺有哪些,他們的作用是什麼。下面我們介紹一些公用常用的
能力 |
描述 |
值 |
automationName |
使用哪個自動化引擎 |
Appium(預設)或Selendroid或者UiAutomator2或者Espresso對於Android或XCUITestiOS或者YouiEngine使用You.i引擎構建的應用程式 |
platformName |
使用哪個移動作業系統平臺 |
iOS,Android或FirefoxOS |
platformVersion |
移動作業系統版本 |
例如7.1,4.4 |
deviceName |
使用的移動裝置或模擬器的種類 |
iPhone Simulator,iPad Simulator,iPhone Retina 4-inch,Android Emulator,Galaxy S4,等....在iOS上,這應該是與儀器返回的有效裝置之一instruments -s devices。在Android上,這個功能目前被忽略,儘管它仍然是必需的。 |
app |
一個或一個檔案的絕對本地路徑或遠端http URL ,或者包含其中的一個。Appium將首先嚐試在適當的裝置上安裝這個應用程式二進位制檔案。請注意,如果您指定和功能(請參閱下文),則此功能對於Android不是必需的。與...不相容。.ipa.apk.zipappPackageappActivitybrowserName |
/abs/path/to/my.apk 要麼http://myapp.com/app.ipa |
browserName |
移動網頁瀏覽器的名稱自動化。應該是一個空字串,而不是自動化應用程式。 |
適用於iOS的“Safari”,適用於Android的“Chrome”,“Chromium”或“瀏覽器” |
newCommandTimeout |
在假定客戶端退出並結束會話之前,Appium將等待來自客戶端的新命令(以秒為單位) |
例如 60 |
language |
(Sim / Emu-only)為模擬器/模擬器設定的語言 |
例如 fr |
locale |
(Sim / Emu-only)為模擬器/模擬器設定的語言環境 |
例如 fr_CA |
udid |
連線的物理裝置的唯一裝置識別符號 |
例如 1ae203187fc012g |
orientation |
(Sim / Emu-only)從某個方向開始 |
LANDSCAPE 要麼 PORTRAIT |
autoWebview |
直接進入Webview上下文。預設false |
true, false |
noReset |
在此會話之前不要重置應用程式狀態。在這裡看到更多的細節 |
true, false |
fullReset |
執行完整的重置。在這裡看到更多的細節 |
true, false |
eventTimings |
啟用或禁用各種Appium內部事件的時間報告(例如,每個命令的開始和結束等)。預設為false。啟用,使用true。然後將這些時間作為events迴應查詢當前會話的財產報告。請參閱事件時間文件瞭解此響應的結構。 |
例如, true |
enablePerformanceLogging |
(僅限Web和webview)啟用Chromedriver(在Android上)或Safari(在iOS上)效能記錄(預設false) |
true, false |
最常用的:
能力 |
描述 |
值 |
automationName |
使用哪個自動化引擎 |
Appium(預設)或Selendroid或者UiAutomator2或者Espresso對於Android或XCUITestiOS或者YouiEngine使用You.i引擎構建的應用程式 |
platformName |
使用哪個移動作業系統平臺(你要測試手機的作業系統) |
iOS,Android或FirefoxOS |
platformVersion |
移動作業系統版本(手機作業系統版本) |
android或者ios版本,例如7.1,4.4 |
deviceName |
使用的移動裝置或模擬器的種類 |
iPhone Simulator,iPad Simulator,iPhone Retina 4-inch,Android Emulator,Galaxy S4,等....在iOS上,這應該是與儀器返回的有效裝置之一instruments -s devices。在Android上,這個功能目前被忽略,儘管它仍然是必需的。 |
app |
apk或者ipa檔案所在的路徑 |
xxx/xxx.apk |
browserName |
瀏覽器名稱 | Chrome |
newCommandTimeout |
超時時間 | 60 |
language |
手機或者模擬器語言 | |
udid |
連線裝置的uid | 1essd2fd3 |
noReset |
不要在會話前重置應用狀態,預設false | true/false |
在自動化測試過程中這些公用的Capability用的時間比較多,大家需要記住,去熟悉他的用法。
3.2 Android獨有Capability
在自動化測試過程中如果你只知道常用的一些引數配置,這個是遠遠達不到要求,因為你不知道什麼時候有什麼樣的突發情況發生,所以你需要了解appium所有最常用的配置引數,當然你可以掌握所有,那樣更好,熟能生巧。下面我們看一下android的Capability。
這些功能僅適用於基於Android的驅動程式(例如 UiAutomator2)。
能力 |
描述 |
值 |
appActivity |
要從包中啟動的Android活動的活動名稱。這往往需要在一個.(例如,.MainActivity而不是MainActivity) |
MainActivity, .Settings |
appPackage |
你想執行的Android應用程式的Java包 |
com.example.android.myApp, com.android.settings |
appWaitActivity |
活動名稱/名稱,逗號分隔,您想要等待的Android活動 |
SplashActivity,SplashActivity,OtherActivity,*,*.SplashActivity |
appWaitPackage |
您想等待的Android應用程式的Java包 |
com.example.android.myApp, com.android.settings |
appWaitDuration |
用於等待appWaitActivity啟動的超時(以毫秒為單位20000)(預設) |
30000 |
deviceReadyTimeout |
在等待裝置準備就緒的幾秒鐘內超時 |
5 |
androidCoverage |
完全合格的儀器類。通過-w在adb shell中,儀器-e覆蓋率為true -w |
com.my.Pkg/com.my.Pkg.instrumentation.MyInstrumentation |
androidCoverageEndIntent |
由您自己執行的廣播操作,用於將覆蓋轉儲到檔案系統。傳遞到-a在adb外殼廣播-a |
com.example.pkg.END_EMMA |
androidDeviceReadyTimeout |
用於等待裝置在啟動後準備就緒的秒數 |
例如, 30 |
androidInstallTimeout |
用於等待apk安裝到裝置的超時(以毫秒為單位)。預設為90000 |
例如, 90000 |
androidInstallPath |
安裝前將在其中安裝apk的裝置上的目錄名稱。預設為/data/local/tmp |
例如 /sdcard/Downloads/ |
adbPort |
用於連線到ADB伺服器的埠(預設5037) |
5037 |
remoteAdbHost |
可選的遠端ADB伺服器主機 |
例如:192.168.0.101 |
androidDeviceSocket |
Devtools套接字名稱。只有當測試的應用程式是Chromium嵌入式瀏覽器時才需要。套接字由瀏覽器開啟,並且Chromedriver作為devtools客戶端連線到它。 |
例如, chrome_devtools_remote |
avd |
avd的名稱發射 |
例如, api19 |
avdLaunchTimeout |
avd啟動並連線到ADB需要多長時間(預設值120000) |
300000 |
avdReadyTimeout |
avd完成啟動動畫需要多長時間(預設120000) |
300000 |
avdArgs |
啟動avd時使用的其他模擬器引數 |
例如, -netfast |
useKeystore |
使用自定義金鑰庫來簽署apks,預設 false |
true 要麼 false |
keystorePath |
自定義金鑰庫路徑,預設〜/ .android / debug.keystore |
例如, /path/to.keystore |
keystorePassword |
自定義金鑰庫的密碼 |
例如, foo |
keyAlias |
金鑰的別名 |
例如, androiddebugkey |
keyPassword |
金鑰的金鑰 |
例如, foo |
chromedriverExecutable |
webdriver可執行檔案的絕對本地路徑(如果Chromium embedder提供了自己的webdriver,則應該使用它來代替與Appium捆綁在一起的原始chromedriver) |
/abs/path/to/webdriver |
autoWebviewTimeout |
等待Webview上下文啟用的時間(以毫秒為單位)。預設為2000 |
例如 4 |
intentAction |
意圖操作將用於啟動活動(預設android.intent.action.MAIN) |
例如android.intent.action.MAIN,android.intent.action.VIEW |
intentCategory |
意圖類別,將用於啟動活動(預設android.intent.category.LAUNCHER) |
例如android.intent.category.LAUNCHER,android.intent.category.APP_CONTACTS |
intentFlags |
將用於啟動活動的標誌(預設0x10200000) |
例如 0x10200000 |
optionalIntentArguments |
將用於啟動活動的其他意圖引數。請參閱意向引數 |
例如--esn <EXTRA_KEY>,--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE>等等。 |
dontStopAppOnReset |
在使用adb啟動應用程式之前,不要停止被測試的應用程式的程式。如果被測試的應用程式是由另一個定位應用程式建立的,那麼將其設定為false將允許在使用adb的測試應用程式啟動過程中定位應用程式的過程仍然存在。換句話說,在dontStopAppOnReset設定的時候true,我們不會-S在adb shell am start通話中包含標誌。有了這個能力被省略或設定為false,我們包括-S標誌。預設false |
true 要麼 false |
unicodeKeyboard |
啟用Unicode輸入,預設 false |
true 要麼 false |
resetKeyboard |
使用unicodeKeyboard功能執行Unicode測試後,將鍵盤重置為原始狀態。如果單獨使用,則忽略。預設false |
true 要麼 false |
<p style="white-space: nowrap;">noSign |
使用除錯鍵跳過檢查和簽名應用程式,只能使用UiAutomator,而不能使用selendroid,預設false |
true 要麼 false |
ignoreUnimportantViews |
呼叫setCompressedLayoutHierarchy()uiautomator函式。此功能可以加快測試執行速度,因為輔助功能命令將更快地忽略某些元素。被忽略的元素是不可能找到的,這就是為什麼這個功能也被實現為可切換的設定以及功能。預設為false |
true 要麼 false |
disableAndroidWatchers |
禁用觀察應用程式沒有響應和應用程式崩潰的android觀察者,這將減少Android裝置/模擬器上的CPU使用率。這個功能只能用於UiAutomator,而不能用於selendroid,預設false |
true 要麼 false |
chromeOptions |
允許ChromeDriver傳遞chromeOptions功能。有關更多資訊,請參閱chromeOptions |
chromeOptions: {args: ['--disable-popup-blocking']} |
recreateChromeDriverSessions |
在移至非ChromeDriver網頁瀏覽的情況下殺死ChromeDriver會話。預設為false |
true 要麼 false |
nativeWebScreenshot |
在Web上下文中,使用本地(adb)方法擷取螢幕截圖,而不是代理ChromeDriver。預設為false |
true 要麼 false |
androidScreenshotPath |
將要放置螢幕截圖的裝置上的目錄名稱。預設為/data/local/tmp |
例如 /sdcard/screenshots/ |
autoGrantPermissions |
讓Appium自動確定您的應用程式需要哪些許可權,並在安裝時將其授予應用程式。預設為false |
true 要麼 false |
networkSpeed |
設定網路速度模擬。指定最大的網路上傳和下載速度。預設為full |
['full','gsm', 'edge', 'hscsd', 'gprs', 'umts', 'hsdpa', 'lte', 'evdo']檢查-netspeed選項有關avds速度模擬的更多資訊 |
gpsEnabled |
在開始會話之前,切換模擬器的gps位置提供程式。預設情況下,模擬器將根據設定的方式啟用或不啟用此選項。 |
true 要麼 false |
isHeadless |
true當不需要顯示裝置顯示時,將此功能設定為無執行模擬器。false是預設值。isHeadless也支援iOS,請檢查XCUITest的具體功能。 |
例如, true |
上面的只是一些簡單的列子,主要的功能是告訴大家,這些是我們經常用的,如果遇見類似的需求那麼可以直接使用,也希望大家看到這裡的時候自己動手去操作一下,看他執行的結果到底是怎麼樣。只有這樣你才能算掌握,只是看一遍還是不行的。
3.3 ios獨有Capability
在我選擇appium時,最主要是因為他能夠同時支援ios和android,在基礎引數配置中ios也有他自己的獨一份,不和android一樣,下面我們大概介紹一下:
BoundleId:這個是必須的,如果不配置就無法啟動ios app,這個是該app的唯一標示。eg:caps.setCapability("boundleId","ios.mooc.test"),這個只是一個簡單的例子。
autoAcceptAlerts: 這個在我們實際專案中非常實用,他就想web端的一個js彈窗,預設情況下是false,如果你的app中有類似情況建議開啟。eg:caps.setCapability("autoAcceptAlerts","true")
這些功能僅適用於XCUITest驅動程式和過時的UIAutomation驅動程式。
能力 |
描述 |
值 |
calendarFormat |
(僅限SIM)為iOS模擬器設定的日曆格式 |
例如 gregorian |
bundleId |
測試中的應用程式的捆綁ID。用於在真實裝置上啟動應用程式或在測試啟動期間使用其他需要包ID的大寫字母。要使用軟體包ID在真實裝置上執行測試,可以省略“應用”功能,但必須提供“udid”。 |
例如 io.appium.TestApp |
udid |
連線的物理裝置的唯一裝置識別符號 |
例如 1ae203187fc012g |
launchTimeout |
假設它掛起和失敗會話之前以毫秒為單位等待儀器的時間 |
例如 20000 |
locationServicesEnabled |
(僅限SIM)強制定位服務處於開啟或關閉狀態。預設是保持當前的模擬設定。 |
true 要麼 false |
locationServicesAuthorized |
(僅限SIM)通過plist將位置服務設定為授權或未授權,以便位置服務警報不會彈出。預設是保持當前的模擬設定。請注意,如果您使用此設定,您還必須使用該bundleId功能傳送您的應用的捆綁ID。 |
true 要麼 false |
autoAcceptAlerts |
如果彈出,則自動接受所有iOS警報。這包括隱私訪問許可權提醒(例如,位置,聯絡人,照片)。預設是false。不適用於XCUITest基於測試。 |
true 要麼 false |
autoDismissAlerts |
如果彈出,則自動關閉所有iOS警報。這包括隱私訪問許可權提醒(例如,位置,聯絡人,照片)。預設是false。不適用於XCUITest基於測試。 |
true 要麼 false |
nativeInstrumentsLib |
使用本機intruments lib(即禁用儀器,無延遲)。 |
true 要麼 false |
nativeWebTap |
(僅限SIM)在Safari中啟用“真實”,非基於JavaScript的網頁瀏覽。預設:false。警告:根據視口的大小/比例,這可能無法準確地點選一個元素 |
true 要麼 false |
safariInitialUrl |
(僅限SIM)(> = 8.1)初始Safari瀏覽器網址,預設為本地歡迎頁面 |
例如 https://www.github.com |
safariAllowPopups |
(僅限Sim)允許JavaScript在Safari中開啟新視窗。預設保持當前的模擬設定 |
true 要麼 false |
safariIgnoreFraudWarning |
(僅限SIM)防止Safari顯示欺詐網站警告。預設保持當前的模擬設定。 |
true 要麼 false |
safariOpenLinksInBackground |
(僅限SIM)Safari是否應允許在新視窗中開啟連結。預設保持當前的模擬設定。 |
true 要麼 false |
keepKeyChains |
(Sim-only)當appium會話開始/結束時是否保留鑰匙串(Library / Keychains) |
true 要麼 false |
localizableStringsDir |
在哪裡尋找可本地化的字串。預設en.lproj |
en.lproj |
processArguments |
使用工具傳遞給AUT的引數 |
例如, -myflag |
interKeyDelay |
輸入時傳送到元素的擊鍵之間的延遲,以毫秒為單位。 |
例如, 100 |
showIOSLog |
是否顯示從appium日誌中的裝置捕獲的任何日誌。預設false |
true 要麼 false |
sendKeyStrategy |
用於將測試型別輸入測試領域的策略。模擬器預設:oneByOne。實際裝置預設值:grouped |
oneByOne,grouped或者setValue |
screenshotWaitTimeout |
以秒為單位的最大超時等待生成螢幕截圖。預設:10 |
例如, 5 |
waitForAppScript |
ios自動化指令碼用於確定應用程式是否已啟動,預設情況下系統等待頁面源不為空。結果必須是布林值 |
例如true;,target.elements().length > 0;,$.delay(5000); true; |
webviewConnectRetries |
向遠端偵錯程式傳送連線訊息以獲取webview的次數。預設:8 |
例如, 12 |
appName |
被測應用程式的顯示名稱。用於在iOS 9+中自動化後臺應用程式。 |
例如, UICatalog |
customSSLCert |
(僅限Sim / Emu)向模擬器新增SSL證照。 |
例如 |
webkitResponseTimeout |
(僅限實際裝置)設定時間(以毫秒為單位)以等待Safari會話中WebKit的響應。預設為5000 |
例如, 10000 |
4、Capability實戰
當我們知道基礎的Capability 如何使用時,大家是否覺得現在我們已經就可以原原本本的照著去執行了呢?其實沒錯,是可以照樣去執行。但是你有思考過一個問題嗎?如果你的app變化了?你的package變化了?你的手機變化了?你的版本變化了等等你怎麼去實現?你是不是還需要到程式裡面來更改程式碼?low嗎?要想不low我們接著往下看。
1 # coding=utf-8 2 # 1.先設定編碼,utf-8可支援中英文,如上,一般放在第一行 3 4 # 2.註釋:包括記錄建立時間,建立人,專案名稱。 5 ''' 6 Created on 2019-7-05 7 @author: 北京-巨集哥 QQ交流群:707699217 8 Project:學習和使用appium自動化測試-與Capability完美懈垢之解讀 9 ''' 10 # 3.匯入模組 11 from appium import webdriver 12 import time 13 import os 14 15 def testCase(platformName,platformVersion,deviceName,app,appPackage,appActivity,port): 16 PATH = lambda p: os.path.abspath(os.path.join(os.path.dirname(__file__), p)) 17 desired_caps = {} 18 desired_caps['platformName'] = platformName #設定平臺 19 desired_caps['platformVersion'] = platformVersion #系統版本 20 desired_caps['deviceName'] = deviceName #裝置id 21 desired_caps['autoLaunch'] = 'true' #是否自動啟動 22 desired_caps['app'] = PATH(app)#安裝包路徑,放在該py檔案的目錄下) 23 desired_caps['appPackage'] = appPackage #包名 24 desired_caps['appActivity'] = appActivity #啟動的activity 25 self.driver = webdriver.Remote('http://localhost:%s/wd/hub', desired_caps) % port
從上面的程式碼我們可以和之前的程式碼進行比較,大家是否發現了一些不同之處。在做自動化時我們一定要保持資料的靈活性,所以在這裡我們做了一些小小的改變,我們將所有的資料都改變成了變數,變數從何而來這個我們後面可能會講,這個會去讀取配置檔案。現在從程式碼層面來看是否要比之前的程式碼更有可讀性呢?其實現實中並不是這樣,有更高階的版本,這個後面有時間再講。
在程式碼的第11行大家注意一個問題沒有,在一個字串中間我使用了一個%s,這個在python裡面代表的意思是取一個變數,這個變數是我後面跟著的 port 這個變數的值,這裡唯一的有問題就是這裡。
5、小結
1、想要更詳細瞭解的小夥們,可以看一下官方文件:
官方文件:https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md
好了,今天就給小夥伴們分享到這裡了,有問題加群討論。
您的肯定就是我進步的動力。支援巨集哥的朋友們和巨集哥的巨集粉記得點波 推薦 哦!!!
個人公眾號
微信群