Appium+python自動化(十四)- 與Capability完美懈垢之解讀(超詳解)


簡介

  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證書。

例如 
-----BEGIN CERTIFICATE-----MIIFWjCCBEKg...
-----END CERTIFICATE-----

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

  好了,今天就給小伙伴們分享到這里了,有問題加群討論。

您的肯定就是我進步的動力。支持宏哥的朋友們和宏哥的宏粉記得點波 推薦 哦!!!

個人公眾號

微信群


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM