Appium iOS 原理


一、iOS Appium 原理

1.1 iOS 9.3 系統之前自動化測試

 

 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 自動化架構模式可以用一個抽象的架構表示,就是下面這樣的:

 Appium 架構模式
 

 

iOS 9.3 以及之后的 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。

  1. 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 # 管理設備狀態 - 重啟、關機、睡眠等

  1. 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 # 查看應用是否安裝

  2. carthage,項目依賴管理,主要是 WebDriverAgent 使用,WebDriverAgent 是用它做項目依賴的;

    公司 iOS 項目也使用 carthage,類似於 java 的 maven;

  3. ios-deploy、ideviceinstaller 類似 android 的 adb;

  4. authroize-ios,iOS 授權工具,主要用於模擬器中一些權限的授權;

    npm install -g authroze-ios
    sudo authroze-ios
    

1.2.4 安裝 WebDriverAgent

參考:https://www.cnblogs.com/mo-nian/p/15415781.html

1.2.5 開始跑腳本 Sample-Code

1.2.5.1 准備 APP

這里我們需要將 TestApp 重新編譯才能使用。

  1. 進入 APP 其 xxx.xcodeproj 對應的目錄,open WebDriverAgent.xcodeproj 打開項目;

  2. 修改該項目里 target 的 General 和 Build Settings 列表(和上面一樣);

  3. 通過 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 的元素定位工具
  • 參考連接:https://www.cnblogs.com/mo-nian/p/15415633.html
    • Appium Desktop - Inspect 
    • WebDriverAgent - Inspector
    • WEditor

WebDriver 本身的 API 詳見:http://selenium-python.readthedocs.io/api.html

 

參考:https://testerhome.com/topics/10068


免責聲明!

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



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