1. 程式人生 > >Appium-Server與Appium-Desktop的區別

Appium-Server與Appium-Desktop的區別

Appium-Server的配置,在之前的博文已有介紹,基於Python的Appium環境搭建合集,所以在此處就不詳細介紹了。今天主要來分享下Appium-Server和Appium desktop在使用上的區別。

在這篇博文中分享瞭如何使用模擬器,Genymotion模擬器的安裝及指令碼製作,但還沒分享如何使程式碼正常執行起來,接下來詳細說明。

在談起程式碼時,就需要先了解下appium的關鍵字

Appium 服務關鍵字

關鍵字 描述 例項
automationName 你想使用的自動化測試引擎 Appium (預設) 或 Selendroid
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 .ipa or .apk檔案所在的本地絕對路徑或者遠端路徑,也可以是一個包括兩者之一的.zip。 Appium會先嚐試安裝路徑對應的應用在適當的真機或模擬器上。針對Android系統,如果你指定app-package和app-activity(具體見下面)的話,那麼就可以不指定app。 會與 browserName 衝突 比如/abs/path/to/my.apk或http://myapp.com/app.ipa
browserName 需要進行自動化測試的手機 web 瀏覽器名稱。如果是對應用進行自動化測試,這個關鍵字的值應為空。 iOS 系統上可以用 'Safari' ,Android 系統上可以用 'Chrome', 'Chromium', 或 'Browser'。
newCommandTimeout 設定命令超時時間,單位:秒。達到超時時間仍未接收到新的命令時 Appium 會假設客戶端退出然後自動結束會話。 比如 60
autoLaunch Appium是否需要自動安裝和啟動應用。預設值true true, false
language (Sim/Emu-only) 設定模擬器 ( simulator / emulator ) 的語言。 如: fr
locale (Sim/Emu-only) 設定模擬器 ( simulator / emulator ) 的區域設定。 如: fr_CA
udid 連線的物理裝置的唯一裝置標識 如: 1ae203187fc012g
orientation (Sim/Emu-only) 在一個設定的方向模式中開始測試 LANDSCAPE (橫向) 或 PORTRAIT (縱向)
autoWebview 直接轉換到 WebView 上下文。 預設值 false、 true, false
noReset 不要在會話前重置應用狀態。預設值false。 true, false
fullReset (iOS) 刪除整個模擬器目錄。(Android) 通過解除安裝——而不是清空資料——來重置應用狀態。在 Android 上,這也會在會話結束後自動清除被測應用。預設值 false true, false

Android特有

關鍵字 描述 例項
appActivity 你要從你的應用包中啟動的 Android Activity 名稱。它通常需要在前面新增 . (如:使用.MainActivity 而不是 MainActivity) MainActivity, .Settings
appPackage 你想執行的Android應用的包名

比如com.example.android.myApp,

 com.android.settings

appWaitActivity 你想要等待啟動的 Android Activity 名稱 SplashActivity
deviceReadyTimeout 設定等待一個模擬器或真機準備就緒的超時時間 5
androidCoverage 用於執行測試的 instrumentation 類。作為命令 adb shell am instrument -e coverage true -w 的-w 引數。

com.my.Pkg/

com.my.Pkg.instrumentation.MyInstrumentation

enablePerformanceLogging (僅適用於 Chrome 和 webview) 開啟 Chromedriver 的效能日誌。 (預設 false) true, false
androidDeviceReadyTimeout 等待裝置在啟動應用後準備就緒的超時時間。以秒為單位。 如 30
androidDeviceSocket 開發工具的 socket 名稱。只有在被測應用是一個使用 Chromium 核心的瀏覽器時需要。 socket 會被瀏覽器開啟,然後 Chromedriver 把它作為開發者工具來進行連線。 如 chrome_devtools_remote
avd 需要啟動的 AVD (安卓虛擬裝置) 名稱。 如 api19
avdLaunchTimeout 以毫秒為單位,等待 AVD 啟動並連線到 ADB 的超時時間。(預設值120000) 300000
avdReadyTimeout 以毫秒為單位,等待 AVD 完成啟動動畫的超時時間。(預設值 120000) 300000
avdArgs 啟動 AVD 時需要加入的額外的引數。 如 -netfast
useKeystore 使用一個自定義的 keystore 來對 apk 進行重簽名。預設值 false true or false
keystorePath 自定義 keystore 的路徑。預設: ~/.android/debug.keystore 如 /path/to.keystore
keystorePassword 自定義 keystore 的密碼。 如 123456
keyAlias key 的別名 如 androiddebugkey
keyPassword key 的密碼 如 123456
chromedriverExecutable webdriver 可執行檔案的絕對路徑 (如果 Chromium 核心提供了對應的 webdriver, 應該用它代替 Appium 自帶的 webdriver) /abs/path/to/webdriver
autoWebviewTimeout 以毫秒為單位,等待 Webview 上下文啟用的時間。預設值 2000 如 4
intentAction 用於啟動 activity 的 intent action。 (預設值android.intent.action.MAIN)

如 android.intent.action.MAIN,

android.intent.action.VIEW

intentCategory 用於啟動 activity 的 intent category。 (預設值android.intent.category.LAUNCHER)

如 android.intent.category.LAUNCHER,

android.intent.category.APP_CONTACTS

intentFlags 用於啟動 activity 的標識 ( flags ) (預設值 0x10200000) 如 0x10200000
optionalIntentArguments 用於啟動 activity 的額外 intent 引數 如 --esn <EXTRA_KEY>, --ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE>
stopAppOnReset 在使用 adb 啟動應用前停止被測應用的程序 ( process ) 。如果被測應用是被另一個應用建立的,當這個引數被設定為 false 時,允許另一個應用的程序在使用 adb 啟動被測應用時繼續存活。預設值 true true 或 false
unicodeKeyboard 使用 Unicode 輸入法。預設值false true 或 false
resetKeyboard 在設定了 unicodeKeyboard 關鍵字的 Unicode 測試結束後,重置輸入法到原有狀態。如果單獨使用,將會被忽略。預設值 false true 或 false
noSign 跳過檢查和對應用進行 debug 簽名的步驟。只能在使用 UiAutomator 時使用,使用 selendroid 是不行。預設值 false true 或 false
ignoreUnimportantViews 呼叫 uiautomator 的函式setCompressedLayoutHierarchy()。由於 Accessibility 命令在忽略部分元素的情況下執行速度會加快,這個關鍵字能加快測試執行的速度。被忽略的元素將不能夠被找到,因此這個關鍵字同時也被實現成可以隨時改變的 *設定 ( settings ) * 。預設值 false true 或 false

iOS特有

關鍵字 描述 例項
calendarFormat (Sim-only) 為iOS的模擬器設定日曆格式 如 gregorian (公曆)
bundleId 被測應用的 bundle ID 。用於在真實裝置中啟動測試,也用於使用其他需要 bundle ID 的關鍵字啟動測試。在使用 bundle ID 在真實裝置上執行測試時,你可以不提供 app 關鍵字,但你必須提供 udid 。 如 io.appium.TestApp
udid 連線的真實裝置的唯一裝置編號 ( Unique device identifier ) 如 1ae203187fc012g
launchTimeout 以毫秒為單位,在 Appium 執行失敗之前設定一個等待 instruments 的時間 比如: 20000
locationServicesEnabled (Sim-only) 強制開啟或關閉定位服務。預設值是保持當前模擬器的設定 true 或 false
locationServicesAuthorized (Sim-only) 通過修改 plist 檔案設定是否允許應用使用定位服務,從而避免定位服務的警告出現。預設值是保持當前模擬器的設定。請注意在使用這個關鍵字時,你同時需要使用 bundleId 關鍵字來發送你的應用的 bundle ID。 true 或者 false
autoAcceptAlerts 當 iOS 的個人資訊訪問警告 (如 位置、聯絡人、圖片) 出現時,自動選擇接受( Accept )。預設值 false。 true 或者 false
autoDismissAlerts 當 iOS 的個人資訊訪問警告 (如 位置、聯絡人、圖片) 出現時,自動選擇不接受( Dismiss )。預設值false。 true 或者 false
nativeInstrumentsLib 使用原生 intruments 庫 (即關閉 instruments-without-delay ) true 或者 false
nativeWebTap (Sim-only) 在Safari中允許"真實的",非基於 javascript 的 web 點選 (tap) 。 預設值: false。注意:取決於 viewport 大小/比例, 點選操作不一定能精確地點中對應的元素。 true 或者 false
safariInitialUrl (Sim-only) (>= 8.1) 初始化 safari 的時使用的地址。預設是一個本地的歡迎頁面 如https://www.github.com
safariAllowPopups (Sim-only) 允許 javascript 在 Safari 中建立新視窗。預設保持模擬器當前設定。 true 或者 false
safariIgnoreFraudWarning (Sim-only) 阻止 Safari 顯示此網站可能存在風險的警告。預設保持瀏覽器當前設定。 true 或者 false
safariOpenLinksInBackground (Sim-only) Safari 是否允許連結在新視窗開啟。預設保持瀏覽器當前設定。 true 或者 false
keepKeyChains (Sim-only) 當 Appium 會話開始/結束時是否保留存放密碼存放記錄 (keychains) (庫(Library)/鑰匙串(Keychains)) true 或者 false
localizableStringsDir 從哪裡查詢本地化字串。預設值 en.lproj en.lproj
processArguments 通過 instruments 傳遞到 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;

Appium-Server

瞭解了appium的關鍵字,再來看程式碼裡面的引數,示例如下:

desired_caps = {
    'platformName': 'Android',
    'platformVersion': '4.4.4',
    'deviceName': 'S5',
    'appPackage': '',   #包名
    'appActivity': '',    #app入口
    'udid': '192.168.66.101:5555',  # genymotion裝置
    'noReset': 'true',
    'unicodeKeyboard': 'True',
    'resetKeyboard': 'True',
}

這些引數,前六個引數都是必須的,後三個引數可視自己的配置使用。還有更多的引數,看上述的appium關鍵字即可,也可以參照該文件:https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md

引數定位

程式碼示例如下:

account = driver.find_element_by_id('id/rel_content')
account.find_element_by_id('id/edit_acount')
driver.press_keycode(61)
print("換行操作")

if driver.find_element_by_id('id/img_clear_acount'):
    clr_account = driver.find_element_by_id('id/img_clear_acount').click()
    print("賬號清除成功")

account.send_keys('10086')
print("賬號輸入完畢")
time.sleep(2)

driver.press_keycode(61)
print("換行操作")

password = driver.find_element_by_id('id/rel_content')
password.find_element_by_id('id/edit_pass')
password.send_keys('123456')
print("密碼輸入完畢")
driver.find_element_by_xpath('//android.widget.TextView[@text="登 錄"]').click()
print("點選登入按鈕")

上述程式碼中,使用到的常規定位方式,id,xpath,還有更多的操作api,可參見這篇博文,裡面總結的很詳細,Appium Python API 中文版。

執行appium

程式碼講述完畢,那又如何使用appium來執行程式碼呢?步驟如下:

1.配置appium

開啟appium,對引數進行配置,先配置dvices name,獲取devices name的方式使用命令adb devices即可,配置如下

2.服務設定

將server address配置為本地ip即可,埠預設為4723,配置如下:

3.啟動appium

點選appium介面上的啟動按鈕,出現如下介面,則說明啟動成功。

服務啟動成功,則可以執行程式碼了,在模擬器中可檢視到對應的操作。執行程式碼時,會自動在真機或模擬器上安裝兩個app,appium settings和unlock,自動安裝的,可以忽略。

上述就是Appium-Server使用的配置了,但Appium-Server有一兩年沒有更新了。Windows版在2015年底止步於的 AppiumForWindows_1_4_16_1.zip 。

於是,新的工具 Appium-desktop 來了! 它來繼續 Appium-Server的使命。當然,Appium-Server當前仍然是可用的。接下來則來說說Appium-desktop。

Appium-desktop

下載安裝

下載地址:https://github.com/appium/appium-desktop/releases/tag/v1.13.0,依照各自需要的版本下載即可。比如windows版,將下載下來的.exe檔案,雙擊安裝即可。

安裝配置

在安裝好了之後,用appium-doctor來檢查是否配置成功,但新版的appium是沒有doctor檔案的,所以需要通過npm下載並安裝,命令如下:

npm install -g appium-doctor

輸入命令後,出現如下圖所示介面:

安裝好了之後,再使用如下命令檢查新版的appium是否安裝成功,命令如下:

appium-doctor

輸入命令後,出現如下介面,則說明安裝成功:

啟用配置

1.啟動服務

開啟安裝好的appium,出現如下介面

連線本機的話,host可以不配置,就用預設的0.0.0.0,埠也用預設的4723,直接點選start server v1.13.0按鈕,出現如下介面,說明服務啟動成功

2.新建連線

new session window,進入到如下頁面:

輸入引數如下:

引數配置好了之後,最好是儲存下,避免下次使用的時候,需要再次輸入。

3.元素定位

點選start session按鈕後,進入到如下頁面:

在該頁面就可以進行元素定位了,元素定位的詳細api,可以參見之前提到的那篇api文件。

將寫好的程式碼,在編譯工具中執行即可,便可在模擬器或真機上看到效果,效果圖就不上了。

問題總結

1.appium-desktop可支援安卓高版本

在模擬器那一篇博文中,我說我使用模擬器的原因,就是因為老版的appium不支援android8及以上的版本,今天在使用appium-desktop時,發現可以直接使用appium desktop定位元素。

2.'unicodeKeyboard' must be of type boolean; 'resetKeyboard' must be of type boolean

該問題是appium版本的問題,新版本unicodeKeyboard、resetKeyboard是布林型別,將True的雙引號去掉,就可以了,如:

'unicodeKeyboard': True,

'resetKeyboard': True,

以上就是我個人在使用上,對appium-server和appium-desktop認知的區別了,具體其他的區別,還待深入使用後發現。今天分享就到這了,有描述有誤的地方,歡迎批評指正。祝大家節日快樂。

 

本文僅代表作者觀點,系作者@溫一壺清酒發表。
歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。
文章出處:http://www.cnblogs.com/hong-fithing/