一、iOS Appium 原理
1.1 iOS 9.3 系統之前自動化測試
1.1.1 Native 自動化
這是iOS 9.3 系統之前自動化測試的架構模式。通過 Android Appium 原理的學習 ,我們很容易理解 iOS Appium 原理:
- Appium Client 端執行代碼發送到 Appium Server端(Server 集成了蘋果官方的 Instruments);
- Server 端將一行行代碼翻譯成一條條指令,同時在手機上注入 bootstrap.jar ;
- Server 與該 jar 包通信將指令傳給 bootstrap.jar,jar 包調用手機里的自動化測試框架(UIAutomation),UIAutomation框架執行指令。
1.1.2 Hybrid(WebView)自動化
通過 Android Appium 原理的學習,Android 4.4 系統之后,Appium 支持使用 ChromeDriver 進行對 Hybrid 頁面的自動化測試。那么 iOS 上是怎么做的呢?
iOS 上早期蘋果官方就一直提供 iOS webkit debug proxy(這是蘋果官方自己開發的私有的通信協議),Appium 集成了該框架,通過它傳遞指令。
1.2 iOS 9.3 系統之后自動化測試
Appium 在 iOS 下工具的變革
- iOS 9 之前一直以 instruments 下的 UIAutomation為驅動底層技術(弊端由於 instruments 的限制,單台 mac 只能對應單台設備);
- iOS 9.3 時代推出 XCUITest 工具,用以替代 UIAutomation;
- iOS 10 時代蘋果直接廢棄了 UIAutomation、Facebook 推出 WebDriverAgent(實現的 server 能夠支持單台 mac 對應多個設備);
- Appium 在iOS 9.3 后全面采用 WebDriverAgent 的方案。
1.2.1 關於 WebDriverAgent
- FaceBook 出品;
- 實現了一個 server,通過 server 可以遠程控制 iOS 設備:啟動應用、關閉應用、點擊、滾動等操作;
- 通過連接 XCTest.framework 調用蘋果的 API 執行動作;
- 支持多個設備同時進行自動化;
- Appium、Macaca 已經集成。
但是 WebDriverAgent 僅僅只提供了一個 server(和 inspect 進行元素定位),並沒有像 Appium 一樣提供 java 或 python 的 Client 端去寫腳本,腳本執行的時候發送指令給 server,然后去運行。WebDriverAgent 要求你自己去實現 Client 端,即拿 Java/ Python 的 WebDriver 庫進行封裝,然后發送指令。 所以 WebDriverAgent 其實就類似於 Appium server,就只是一個 server。
1.2.2 關於 iOS 9.3 之后的 Appium 自動化架構模式
Appium 很粗暴的把整個 WebDriverAgent 直接集成到自己的項目里,然后通信機制就走 WebDriverAgent,Appium 其實就提供了一個 Client 端的作用。
所以 iOS 9.3 系統之后自動化測試核心是 WebDriverAgent,Appium 就提供了一個 Client 端來寫腳本和發送指令。
通過前面的學習,我們知道 Appium 自動化架構模式可以用一個抽象的架構表示,就是下面這樣的:
iOS 9.3以及之后的 Appium 自動化架構模式如下圖所示:
從圖中可以看出:
- Client 端是 Appium 之前本身提供的;
- Server 端是:WebDriverAgent 和 Instruments;( Appium 直接把 WebDriverAgent 整個集成進來,Instruments 是為了支持 iOS 9.3 之前的系統)
- 最右邊是一個手機
- 之前 Server 是和 bootstrap.jar 通信,這里 WebDriverAgent 提供了 WebDriverAgentRunner (類似 bootstrap.jar 的功能),WebDriverAgent與之通信;
- WebDriverAgentRunner 是一個應用,Client 和 server 運行了之后,WebDriverAgentRunner 會被裝到手機上,這個應用會接收來自 Server 的指令,並連接底層的 XCTest.framwork,並告訴 XCTest.framwork 操作手機進行自動化。
1.2.3 必裝的軟件
Xcode、command line tool、libimobiledevice、ios-deploy、carthage、WebDriverAgent、Appium。
- libimobiledevice / ideviceinstaller 庫,相當於 android 的 adb,是 Appium 底層用到的工具之一,用於獲取 iOS 設備信息。
其常用命令如下:
-
查看當前所連接的設備
idevice_id -l # 顯示當前所連接設備的 udid
instruments -s devices # 列出所有設備,包括真機、模擬器、mac -
安裝應用
ideviceinstaller -u [udid] -i [xxx.ipa] # xxx.ipa 為應用在本地的路徑
-
卸載應用
ideviceinstaller -u [udid] -U [bundleId]
-
查看設備已安裝的應用
ideviceinstaller -u [udid] -l # 查看設備安裝的第三方應用
ideviceinstaller -u [udid] -l -o list_user # 同上,查看設備安裝的第三方應用
ideviceinstaller -u [udid] -l -o list_system # 查看設備安裝的系統應用
ideviceinstaller -u [udid] -l -o list_all # 查看設備安裝的所有應用 -
獲取設備信息
ideviceinfo -u [udid] # 獲取設備信息
ideviceinfo -u [udid] -k DeviceName # 獲取設備名稱 同命令 idevicename
idevicename # 同上
ideviceinfo -u [udid] -k ProductVersion # 獲取設備版本 10.3.3
ideviceinfo -u [udid] -k ProductType # 獲取設備類型 iPhone 8,1
ideviceinfo -u [udid] -k ProductName # 獲取設備系統名稱 -
其他系統文件信息
ideviceinfo # 獲取設備所有信息
idevicesyslog # 獲取設備日志
idevicecrashreport -e test # 獲取設備 crashlog,test 是文件夾需新建
idevicediagnostics # 管理設備狀態 - 重啟、關機、睡眠等
-
ios-deploy 常用命令
ios-deploy -c # 查看當前鏈接的設備
ios-deploy --[xxx.app] # 安裝APP
ios-deploy --id [udid] --uninstall_only --bundle_id [bundleId] # 卸載應用
ios-deploy --id [udid] --list_bundle_id # 查看所有應用
ios-deploy --id [udid] --exists --bundle_id # 查看應用是否安裝 -
carthage,項目依賴管理,主要是 WebDriverAgent 使用,WebDriverAgent 是用它做項目依賴的;
公司 iOS 項目也使用 carthage,類似於 java 的 maven;
-
ios-deploy、ideviceinstaller 類似 android 的 adb;
-
authroize-ios,iOS 授權工具,主要用於模擬器中一些權限的授權;
npm install -g authroze-ios
sudo authroze-ios
1.2.4 安裝 WebDriverAgent
-
從 FB 的 GitHub 上下載WebDriverAgent
-
初始化項目
在 WebDriverAgent 目錄下執行:./Scripts/bootstrap.sh
-
編譯 WebDriverAgent
- open WebDriverAgent.xcodeproj(會使用默認打開工具Xcode打開項目)。
- 修改 WebDriverAgent.lib 以及 WebDriverAgentRunner 這兩個 target 下的 General 和 Build Settings列表(前者是在 mac 上運行的,后者是在手機上運行的)。
- General 列表需要修改:簽名 Signing 和 BundleId: 簽名 Signing:可以用個人免費開發者證書,用任意 AppleId 可申請;BundleId:之前 BundleId 是綁定了 FB team 的證書的,不能使用,所以要改一個新的。 Build Settings列表需要修改 BundleId 和 上一步一樣。
- WebDriverAgentRunner 是在手機上運行的,要想在手機上安裝,需要和上一步一樣修改 General 和 Build Settings 列表。
- 手機上設置 - 通用 - 描述文件 里信任一下該證書。
- Xcode - Product - Test,會安裝 WebDriverAgentRunner 並啟動 WebDriverAgent 這個 server。
-
替換 Appium 下的 WebDriverAgent:刪除原 WebDriverAgent 文件夾,把編譯好的 WebDriverAgent 放進去即可
- 如果用 npm 安裝的目錄在:cd /usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent/;
- 如果用 desktop 安裝的目錄在:/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent/)
1.2.5 開始跑腳本 Sample-Code
1.2.5.1 准備 APP
這里我們需要將TestApp重新編譯才能使用。
-
進入 APP 其 xxx.xcodeproj 對應的目錄,open WebDriverAgent.xcodeproj 打開項目;
-
修改該項目里 target 的 General 和 Build Settings列表(和上面一樣);
-
通過 Xcode 編譯運行。
或者通過 xcodebuild 命令通過命令行編譯運行 xcodebuild -project TestApp.xcodeproj -target TestApp -sdk iphoneos10.3 -configuration
development
1.2.5.2 准備腳本
- iOS 項目的 Desired_caps
Desired_caps:{
’platformName’:’iOS’,
‘platformVersion’:’10.3.3’,
‘devideName’:’iPhone 7 Plus’,
‘udid’:’’, #如果是真機的話必須提供
‘app’:’~/appPath/app.app’, #app路徑,如果只填bundleId,那就是通過id啟動已有的App
}
- iOS 的元素定位
- Appium Desktop - Inspect (推薦)
- WebDriverAgent - Inspector
這里說說 Appium Desktop - Inspect 是怎么使用的。
- 打開並啟動 Appium Desktop,點擊軟件右上角第一個按鈕 “ start inspector session”;
- 會出現彈窗,彈窗里配置好 Desired_caps。
其他Desired_caps配置參見官方文檔:https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md
- 定位方式推薦:AccessbilityId
注意
webdriver.py 里只延展定義了針對移動端的 API,is_displayed()、.is_enabled()() 等這些 API 可以去看 WebDriver 即 Slenium 2 本身的。
WebDriver 本身的 API 詳見:http://selenium-python.readthedocs.io/api.html
原文鏈接:https://testerhome.com/topics/10068