一、前言
項(xiàng)目閑置下來了,終于抽空有時(shí)間搞自動(dòng)化了,看了下網(wǎng)上的教程基本通篇都是android自動(dòng)化的介紹 ,ios自動(dòng)化方面的內(nèi)容網(wǎng)上簡(jiǎn)介的少之可憐。由于本人對(duì)ios自動(dòng)化也是第一次做,甚至對(duì)蘋果電腦的使用都不太熟悉,花了大概一周時(shí)間粗略的看下ios開發(fā)知識(shí),網(wǎng)上隨手下載的來源于這兩本《iOS開發(fā)從入門到精通.pdf》、《iOS開發(fā)指南:從零基礎(chǔ)到App上架.pdf 》、至于Mac筆記本的學(xué)習(xí)完全是邊使用邊查詢操作 ;本文完全秉著指導(dǎo)小白操作的流程帶你一步一步搭建IOS自動(dòng)化測(cè)試環(huán)境
二、iOS 自動(dòng)化相關(guān)框架介紹
自動(dòng)化測(cè)試類工具 隨著移動(dòng)互聯(lián)網(wǎng)的興起,APP 測(cè)試的越來越被重視!Android 系統(tǒng)因?yàn)樽约旱拈_源性,測(cè)試工具和測(cè)試方法比較廣為流傳,但是 iOS 系統(tǒng)的私密性,導(dǎo)致很多測(cè)試的執(zhí)行都有點(diǎn)麻煩。
為了幫助大家更好的執(zhí)行 iOS APP 的測(cè)試,以下為大家收集了非常全面的 iOS 測(cè)試工具,涵蓋各大領(lǐng)域,希望各位能有所認(rèn)識(shí)
三、自動(dòng)化測(cè)試類工具
1. UIAutomation
UIAutomation 是蘋果提供的UI 自動(dòng)化測(cè)試框架,使用 JavaScript 編寫。
基于 UIAutomation 有擴(kuò)展型的工具框架和驅(qū)動(dòng)型的框架。擴(kuò)展型框架以 JavaScript 擴(kuò)展庫方法提供了很多好用 js 工具,注入式的框架通常會(huì)提供一些 Lib 或者是 Framework,要求測(cè)試人員在待測(cè)應(yīng)用的代碼工程中導(dǎo)入這些內(nèi)容,框架可以通過他們完成對(duì) app 的驅(qū)動(dòng)。
驅(qū)動(dòng)型 UI Automation 在自動(dòng)化測(cè)試底層使用了 UI Automation 庫,通過 TCP 通信的方式驅(qū)動(dòng) UI Automation 來完成自動(dòng)化測(cè)試,通過這種方式,編輯腳本的語言不再局限于 JavaScript。
這個(gè)工具在 iOS UI 自動(dòng)化測(cè)試中使用非常廣泛。
具體參考資料:https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/UIAutomation.html
2.XCTest
XCTest 是蘋果在 iOS 7 和 Xcode5 引入的一個(gè)簡(jiǎn)單而強(qiáng)大的測(cè)試框架,集成在 Xcode 中,用來編寫測(cè)試代碼。它提供了各個(gè)層次的測(cè)試。
XCTest 測(cè)試編寫起來非常簡(jiǎn)單,并且遵循 xUnit 風(fēng)格。
Xcode 在創(chuàng)建工程時(shí),會(huì)默認(rèn)使用 XCTest,并且默認(rèn)創(chuàng)建了Unit Test(單元測(cè)試)和UI Test(界面測(cè)試)兩個(gè) Target,其中 Unit Test 主要用于測(cè)試代碼的大部分基本功能,比如絕大多數(shù) Model 的類和方法測(cè)試,業(yè)務(wù)邏輯測(cè)試,網(wǎng)絡(luò)接口調(diào)用測(cè)試等等。
UI Test 一般會(huì)考慮到用戶的交互流程,模擬用戶的交互操作,利用 XCTest 的 UI 記錄特性來獲取界面上的一些列視圖元素和操作事件,然后在測(cè)試方法中觸發(fā)事件。
所以這是一個(gè)可以提供各個(gè)層次的測(cè)試的框架,比如單元測(cè)試,自動(dòng)化測(cè)試,性能測(cè)試等。
具體參考資料:
https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/01-introduction.html
3. KIF
KIF 是 Keep It Functional 項(xiàng)目的縮寫,是一款iOS app 功能性測(cè)試框架,來自 Square,該測(cè)試框架只支持 iOS。
所有測(cè)試使用 Objective-C 語言編寫,對(duì)測(cè)試人員來講,需要熟練的掌握 Objective-C 語言 , 對(duì)蘋果開發(fā)者來說非常容易上手,更是一款開發(fā)者廣為推薦的測(cè)試工具。
KIF 使用未公開的 Apple API(私有 API),這對(duì)于測(cè)試目的而言是安全的,基于第三方 iOS UI 的單元測(cè)試框架,所以可以做項(xiàng)目的單元測(cè)試,也可以做 UI 集成測(cè)試。但缺點(diǎn)是運(yùn)行較慢。
具體參考資料:https://github.com/kif-framework/KIF
4. Frank
Frank 是 iOS 開發(fā)環(huán)境下一款實(shí)現(xiàn)自動(dòng)測(cè)試的工具,Xcode 環(huán)境下開發(fā)完成后,通過 Frank 實(shí)現(xiàn)結(jié)構(gòu)化的測(cè)試用例,其底層語言為 Ruby,作為一款開源的 iOS 測(cè)試工具,在國外已經(jīng)有廣泛的應(yīng)用。
但是國內(nèi)相關(guān)資料卻比較少。其最大的優(yōu)點(diǎn)是允許我們用熟悉的自然語言實(shí)現(xiàn)實(shí)際的操作邏輯。
它提供了針對(duì) iOS 平臺(tái)的功能測(cè)試能力,可以模擬用戶的操作對(duì)應(yīng)用程序進(jìn)行黑盒測(cè)試,并且使用 Cucumber 編寫測(cè)試用例,使測(cè)試用例如同自然語言一樣描述功能需求,讓測(cè)試以“可執(zhí)行的文檔”的形式成為業(yè)務(wù)客戶與交付團(tuán)隊(duì)之間的橋梁。
優(yōu)點(diǎn):測(cè)試場(chǎng)景是在 Cucumber 的幫助下,用可理解的英語句子寫的,還有活躍的社區(qū)支持,以及不斷擴(kuò)大中的庫。
缺點(diǎn):對(duì)手勢(shì)的支持有限,所以在設(shè)備上運(yùn)行測(cè)試有點(diǎn)難。
具體參考資料:https://www.testingwithfrank.com/
5. Calabash-iOS
Calabash 是一個(gè)適用于 iOS 和 Android 開發(fā)者的跨平臺(tái) app 測(cè)試框架,可用來測(cè)試屏幕截圖、手勢(shì)和實(shí)際功能代碼。
Calabash 開源免費(fèi)并支持 Cucumber 語言,Cucumber 能讓你用自然的英語語言表述 app 的行為,實(shí)現(xiàn) BDD(Behavior Driven Development,行為驅(qū)動(dòng)開發(fā))。
而 Calabash-iOS 就是一個(gè)基于 Calabash 的 iOS 的功能、自動(dòng)化測(cè)試框架。
優(yōu)點(diǎn):
有大型社區(qū)支持;
列表項(xiàng)簡(jiǎn)單,類似英語表述的測(cè)試語句支持在屏幕上的所有動(dòng)作,如滑動(dòng),縮放,旋轉(zhuǎn),敲擊等。
缺點(diǎn):
測(cè)試步驟失敗后,將跳過所有的后續(xù)步驟,這可能會(huì)導(dǎo)致錯(cuò)過更嚴(yán)重的產(chǎn)品問題。
測(cè)試耗費(fèi)時(shí)間,因?yàn)樗偸悄J(rèn)先安裝 app,需要 Calabash 框架安裝在 iOS 的 ipa 文件中, 因此測(cè)試人員必須要有 iOS 的 app 源碼。
除了 Ruby,對(duì)其他語言不友好
具體資料獲取路徑:https://github.com/calabash/calabash-ios
6. Subliminal
Subliminal 是另一款與 XCTest 集成的框架,也是個(gè)不錯(cuò) iOS 集成測(cè)試框架。
與 KIF 不同的是,它基于 UIAutomation 編寫,對(duì)開發(fā)者隱藏 UIAutomation 中一些復(fù)雜的細(xì)節(jié)。可惜近幾年沒有更新了,若能支持 swift 就好了。
具體資料獲取路徑:https://github.com/Diaoul/subliminal
7. Kiwi
Kiwi 是對(duì) XCTest 的一個(gè)完整替代,使用 xSpec 風(fēng)格編寫測(cè)試。Kiwi 帶有自己的一套工具集,包括 expectations、mocks、stubs,甚至還支持異步測(cè)試。
它是一個(gè)適用于 iOS 開發(fā)的 Behavior Driven Development(BDD)庫,有著非常漂亮的語法。
優(yōu)點(diǎn)在于其簡(jiǎn)潔的接口和可用性,易于設(shè)置和使用,可以寫出結(jié)構(gòu)性強(qiáng)易讀測(cè)試,非常適合新手開發(fā)者。
Kiwi 也是使用 Objective-C 語言編寫,易于 iOS 開發(fā)人員上手。
具體資料獲取路徑:https://github.com/kiwi-bdd/Kiwi8. Appium
Appium 是一個(gè)開源的、跨平臺(tái)的自動(dòng)化測(cè)試工具,支持 iOS、Android 和 FirefoxOS 平臺(tái)。
通過 Appium,開發(fā)者無需重新編譯 app 或者做任何調(diào)整,就可以測(cè)試移動(dòng)應(yīng)用,可以使測(cè)試代碼訪問后端 API 和數(shù)據(jù)庫。
它是通過驅(qū)動(dòng)蘋果的 UIAutomation 框架來實(shí)現(xiàn)的 iOS 平臺(tái)支持。
開發(fā)者可以使用 WebDriver 兼容的任何語言編寫測(cè)試腳本,如 Ruby,C#,Java, JS,OC, PHP,Python,Perl 和 Clojure 語言。
具體資料獲取路徑:http://appium.io/
內(nèi)測(cè)發(fā)布工具
1. fir.im
為開發(fā)者提供測(cè)試應(yīng)用極速發(fā)布,應(yīng)用崩潰實(shí)時(shí)分析、用戶反饋收集等一系列開發(fā)測(cè)試效率工具服務(wù),幫助開發(fā)者將更多精力放在產(chǎn)品的開發(fā)與應(yīng)用的優(yōu)化上。
2. 蒲公英
『蒲公英』是專為 iOS、Android 開發(fā)者提供的免費(fèi)用應(yīng)用內(nèi)測(cè)、托管的平臺(tái),旨在解決開發(fā)者將應(yīng)用分發(fā)給內(nèi)測(cè)用戶時(shí)的繁雜、低效的問題。
3. TestFlight
TestFlight 是蘋果提供的應(yīng)用測(cè)試工具,允許開發(fā)者邀請(qǐng)用戶對(duì)應(yīng)用的預(yù)發(fā)布版本進(jìn)行測(cè)試,從而在應(yīng)用正式發(fā)布至 App Store 前收集用戶反饋。
以上常用框架介紹完了,本篇幅主要以appium進(jìn)行實(shí)踐講解
Appium驅(qū)動(dòng)IOS測(cè)試原理
XCUITest是蘋果開發(fā)的一個(gè)做IOS自動(dòng)化測(cè)試的框架,需要了解些Swift等iOS編程知識(shí)WebDriverAgent是Facebook開發(fā)的一個(gè)iOS自動(dòng)化測(cè)試工具,先來看下面的這張?jiān)韴D:
WDA在Client創(chuàng)建了一個(gè)Server,在手機(jī)端安裝了一個(gè)叫作WebDriverAgentRunner 的一個(gè)應(yīng)用;這個(gè)應(yīng)用會(huì)接收來自 Server 的指令,并連接底層的 XCTest.framwork,讓 XCTest.framwork 調(diào)用蘋果API來操作手機(jī)進(jìn)行自動(dòng)化
而appium是把WebDriverAgentRunner 給集成進(jìn)去了,因此實(shí)現(xiàn)了appium的跨平臺(tái)能力
通過上圖我們了解到 Appium 很粗暴的把整個(gè) WebDriverAgent 直接集成到自己的項(xiàng)目里,然后通信機(jī)制就走 WebDriverAgent,Appium 其實(shí)就提供了一個(gè) Client 端的作用。所以 iOS 9.3 系統(tǒng)之后自動(dòng)化測(cè)試核心是 WebDriverAgent,Appium 就提供了一個(gè) Client 端來寫腳本和發(fā)送指令。
Appium 自動(dòng)化架構(gòu)模式可以用一個(gè)抽象的架構(gòu)表示,就是下面這樣的:
從圖中可以看出:
Client 端是 Appium 之前本身提供的;
Server 端是:WebDriverAgent 和 Instruments;( Appium 直接把 WebDriverAgent 整個(gè)集成進(jìn)來,Instruments 是為了支持 iOS 9.3 之前的系統(tǒng))
最右邊是一個(gè)手機(jī)
之前 Server 是和 bootstrap.jar 通信,這里 WebDriverAgent 提供了 WebDriverAgentRunner (類似 bootstrap.jar 的功能),WebDriverAgent與之通信;
WebDriverAgentRunner 是一個(gè)應(yīng)用,Client 和 server 運(yùn)行了之后,WebDriverAgentRunner 會(huì)被裝到手機(jī)上,這個(gè)應(yīng)用會(huì)接收來自 Server 的指令,并連接底層的 XCTest.framwork,并告訴 XCTest.framwork 操作手機(jī)進(jìn)行自動(dòng)化。
關(guān)于 WebDriverAgent
FaceBook 出品:
實(shí)現(xiàn)了一個(gè) server,通過 server 可以遠(yuǎn)程控制 iOS 設(shè)備:?jiǎn)?dòng)應(yīng)用、關(guān)閉應(yīng)用、點(diǎn)擊、滾動(dòng)等操作;
通過連接 XCTest.framework 調(diào)用蘋果的 API 執(zhí)行動(dòng)作;
支持多個(gè)設(shè)備同時(shí)進(jìn)行自動(dòng)化;
Appium、Macaca 已經(jīng)集成。
但是 WebDriverAgent 僅僅只提供了一個(gè) server(和 inspect 進(jìn)行元素定位),并沒有像 Appium 一樣提供 java 或 python 的 Client 端去寫腳本,腳本執(zhí)行的時(shí)候發(fā)送指令給 server,然后去運(yùn)行。WebDriverAgent 要求你自己去實(shí)現(xiàn) Client 端,即拿 Java/ Python 的 WebDriver 庫進(jìn)行封裝,然后發(fā)送指令。所以 WebDriverAgent 其實(shí)就類似于 Appium server,就只是一個(gè) server。
基礎(chǔ)環(huán)境搭建
基礎(chǔ)環(huán)境:一臺(tái)蘋果筆記本、一個(gè)iphone手機(jī)
基礎(chǔ)環(huán)境
MacBook Pro: 10.15.7
Macbook Pro(做 iOS 測(cè)試,Mac 是繞不開的,我們依賴的軟件環(huán)境需要運(yùn)行在 Mac 上,必須要有一臺(tái) Mac 本(很貴),得攢銀子咬牙買一臺(tái) ~,我用的公司分配的測(cè)試本)。
iphone真機(jī):iPhone 8 Plus 14.4
iPhone、iPad:既然測(cè)試 iOS 軟件,那 iPhone 和 iPad 也自然不用多說了,雖然 Xcode 里有虛擬機(jī),但是實(shí)際測(cè)試還是以真機(jī)為準(zhǔn)。本文也主要以真機(jī)為準(zhǔn)
appium:1.20.2
appium原理
Appium是一個(gè)開源、跨平臺(tái)的測(cè)試框架,可以用來測(cè)試原生及混合的移動(dòng)端應(yīng)用。Appium支持IOS、Android及FirefoxOS平臺(tái)。Appium使用WebDriver的json wire協(xié)議,來驅(qū)動(dòng)Apple系統(tǒng)的UIAutomation庫、Android系統(tǒng)的UIAutomator框架。Appium對(duì)IOS系統(tǒng)的支持得益于Dan Cuellar’s對(duì)于IOS自動(dòng)化的研究。Appium也集成了Selendroid,來支持老android版本。
Appium支持Selenium WebDriver支持的所有語言,如java、Object-C、JavaScript、Php、Python、Ruby、C#、Clojure,或者Perl語言,更可以使用Selenium WebDriver的Api。Appium支持任何一種測(cè)試框架。如果只使用Apple的UIAutomation,我們只能用javascript來編寫測(cè)試用例,而且只能用Instruction來運(yùn)行測(cè)試用例。同樣,如果只使用Google的UIAutomation,我們就只能用java來編寫測(cè)試用例。Appium實(shí)現(xiàn)了真正的跨平臺(tái)自動(dòng)化測(cè)試。
appium選擇了client-server的設(shè)計(jì)模式。只要client能夠發(fā)送http請(qǐng)求給server,那么的話client用什么語言來實(shí)現(xiàn)都是可以的,這就是appium及webdriver如何做到支持多語言的;
Appium優(yōu)點(diǎn)
開源
跨架構(gòu):Native App、Hybird App、Web App
跨設(shè)備:Android、iOS、Firefox OS
不依賴源碼
使用任何 WebDriver 兼容的語言來編寫測(cè)試用例。比如 Java, Objective-C, JavaScript with Node.js (in both callback and yield-based flavours), PHP, Python, Ruby, C#, Clojure, 或者 Perl.
不需要重新編譯APP
支持IOS手機(jī)錄制視頻
Appium理念
你無需為了自動(dòng)化,而重新編譯或者修改你的應(yīng)用。
你不必局限于某種語言或者框架來寫和運(yùn)行測(cè)試腳本。
一個(gè)移動(dòng)自動(dòng)化的框架不應(yīng)該在接口上重復(fù)造輪子。(移動(dòng)自動(dòng)化的接口應(yīng)該統(tǒng)一)
無論是精神上,還是名義上,都必須開源。
Appium 在 iOS 下工具的變革:
iOS 9 之前一直以 instruments 下的 UIAutomation為驅(qū)動(dòng)底層技術(shù)(弊端由于 instruments 的限制,單臺(tái) mac 只能對(duì)應(yīng)單臺(tái)設(shè)備);
iOS 9.3 時(shí)代推出 XCUITest 工具,用以替代 UIAutomation;
iOS 10 時(shí)代蘋果直接廢棄了 UIAutomation、Facebook 推出 WebDriverAgent(實(shí)現(xiàn)的 server 能夠支持單臺(tái) mac 對(duì)應(yīng)多個(gè)設(shè)備);
Appium 在iOS 9.3 后全面采用 WebDriverAgent 的方案。
xcode: 12.4
MacBook appstore應(yīng)用商店搜索下載即可
安裝內(nèi)容
前提環(huán)境:
python , selenium , setuptools、pip
通用環(huán)境:
Homebrew ,Node & NPM ,Carthage ,Appium ,python-client ,Appium-Doctor , ios-deploy , ideviceinstaller & libimobiledevice , ios_webkit_debug_proxy , authroize-ios
IOS環(huán)境:
xCode , Command Line Tools
前提環(huán)境
python
此處使用python3 , 官網(wǎng)下載https://www.python.org/ 一步下一步安裝即可
selenium
終端輸入: pip install Selenium 安裝最新版本的selenium。pip install Selenium 如需安裝指定的版本,則pip install Selenium==版本號(hào)。
setuptools、pip
下載setuptools
https://pypi.python.org/pypi/setuptools 、https://pypi.python.org/pypi/pip
打開cmd 進(jìn)入setuptools解壓目錄,輸入:python setup.py install
進(jìn)入pip解壓目錄,輸入:python setup.py install
安裝好后,打開終端,輸入pip,如提示不是內(nèi)部命令,則將python安裝目錄下Scripts目錄添加到環(huán)境變量Path中。
通用環(huán)境
Homebrew
Homebrew是一個(gè)包管理軟件,它可以使我們更容易地安裝其他一些軟件
/usr/bin/ruby-e"$(curl–fsSLhttps://raw.githubusercontent.com/Homebrew/install/master/install)"
覆蓋安裝:
/usr/bin/ruby-e"$(curl-fsSLhttps://raw.githubusercontent.com/Homebrew/install/master/install)"brew-v//檢查homebrew是否安裝 brewlist//查看已安裝列表 brewupdate//更新Homebrew
如果安裝失敗:
可以打開網(wǎng)址:http://vip.ytesting.com/q.do?a&id=ff80808172521d8201726a74986f0880 將其內(nèi)容保存為homebrew.txt,
然后終端輸入:
/usr/bin/rubyhomebrew.txt
注意:此步驟還順帶安裝了Xcode命令行工具(xcode-commaindline-tools)。
檢查homebrew是否安裝
終端輸入安裝:
Node & NPM
Node是一個(gè)javascript運(yùn)行時(shí)環(huán)境,npm是節(jié)點(diǎn)包管理器。我們需要這些,因?yàn)锳ppium是一個(gè)節(jié)點(diǎn)應(yīng)用程序。
node-v重新安裝:brewreinstallnodenpmconfigsetregistryhttps://registry.npm.taobao.org/
默認(rèn)的npm源再國內(nèi)都很慢,安裝好node之后需要重新配置一個(gè)國內(nèi)源 (非必須)
在終端中,輸入以下命令(此命令也將安裝npm):
brewinstallnode
查看node版本
Carthage
Carthage項(xiàng)目依賴管理, 類似于 java 的 maven;主要是 WebDriverAgent 使用,WebDriverAgent 是用它做項(xiàng)目依賴的
brewinstallcarthage
更新carthage : rew upgrade carthage
重新安裝 : brew reinstall carthage2. 安裝完成后檢查一下是否安裝成功
carthageversion//打印出版本號(hào)即表示安裝成功
終端輸入:
Appium
Appium是一個(gè)用于本地、混合和移動(dòng)web應(yīng)用程序的開源測(cè)試自動(dòng)化框架。它使用WebDriver協(xié)議驅(qū)動(dòng)iOS、Android和Windows mobile應(yīng)用程序。
安裝 Appium(二選1) ;
兩者基本沒什么區(qū)別:非要說區(qū)別的話 ,方式1 安裝版本較穩(wěn)定 方式2則版本最新。
方式1:安裝桌面版 appium-server(推薦)桌面版包含了appium-server,同時(shí)也包含一個(gè)元素定位器,建議安裝桌面版。
方式2:安裝 appium-server 版
npminstall-gappium
默認(rèn)安裝最新的版本,如果想安裝指定的版本:
npminstall-gappium@1.7.2
卸載 Appium:
npmuninstall-gappium npmcacheclean--forceappium-v
啟動(dòng)appium服務(wù)
appium& [1]965$[Appium]WelcometoAppiumv1.9.1 [Appium]AppiumRESThttpinterfacelistenerstartedon0.0.0.0:4723
安裝完成之后輸入appium -v,顯示版本號(hào)表示appium server安裝成功
終端安裝server版輸入
python-client
下載python-client
gitclonegit@github.com:appium/python-client.git
安裝python-client
cdpython-client#進(jìn)入python-client目錄 pythonsetup.pyinstall#安裝python-client
Appium-Doctor
檢查appium安裝是否成功的工具集指令
npminstallappium-doctor-gappium-doctor--ios
備注:necessary dependcies 必須全部是對(duì)勾狀態(tài) ,可選部分依賴可以不用全部安裝
檢查 iOS環(huán)境是否安裝成功
安裝 appium-doctor
ios-deploy
ios-deploy 一個(gè)不需要用Xcode安裝和調(diào)試應(yīng)用的命令行工具。需要一個(gè)有效的開發(fā)者證書,需要 Xcode 7以上的版本。終端輸入命令進(jìn)行安裝:
brewinstallios-deploy#安裝命令 brewreinstallios-deploy#重新安裝 brewupgradeios-deploy#更新命令
常用命令如下:
ios-deploy-c#查看當(dāng)前鏈接的設(shè)備 ios-deploy--[xxx.app]#安裝APP ios-deploy--id[udid]--uninstall_only--bundle_id[bundleId]#卸載應(yīng)用 ios-deploy--id[udid]--list_bundle_id#查看所有應(yīng)用 ios-deploy--id[udid]--exists--bundle_id#查看應(yīng)用是否安裝
ideviceinstaller & libimobiledevice
ios-deploy、ideviceinstaller 類似 android 的 adb;是 Appium 底層用到的工具之一,用于獲取 iOS 設(shè)備信息。
brewinstallideviceinstaller#用于查看bundleid brewreinstallideviceinstaller#重新安裝brewinstalllibimobiledevice--HEAD#安裝最新的更新 brewreinstalllibimobiledevice#重新安裝
其常用命令如下:
idevice_id-l#顯示當(dāng)前所連接設(shè)備的udid instruments-sdevices#列出所有設(shè)備,包括真機(jī)、模擬器、macideviceinstaller-u[udid]-i[xxx.ipa]#xxx.ipa為應(yīng)用在本地的路徑ideviceinstaller-u[udid]-U[bundleId]ideviceinstaller-u[udid]-l#查看設(shè)備安裝的第三方應(yīng)用 ideviceinstaller-u[udid]-l-olist_user#同上,查看設(shè)備安裝的第三方應(yīng)用 ideviceinstaller-u[udid]-l-olist_system#查看設(shè)備安裝的系統(tǒng)應(yīng)用 ideviceinstaller-u[udid]-l-olist_all#查看設(shè)備安裝的所有應(yīng)用ideviceinfo-u[udid]#獲取設(shè)備信息 ideviceinfo-u[udid]-kDeviceName#獲取設(shè)備名稱同命令 idevicenameidevicename#同上 ideviceinfo-u[udid]-kProductVersion#獲取設(shè)備版本10.3.3 ideviceinfo-u[udid]-kProductType#獲取設(shè)備類型iPhone8,1 ideviceinfo-u[udid]-kProductName#獲取設(shè)備系統(tǒng)名稱idevicesyslog#屏幕上即可看見手機(jī)上所有的日志 idevicesyslog>>iphone.log重定向日志到文件中idevicecrashreport#參數(shù)可設(shè)置具體文件存放位置idevicescreenshot#獲取當(dāng)前截屏,效率比appium截屏高10倍ideviceinfo#獲取設(shè)備所有信息 idevicesyslog#獲取設(shè)備日志 idevicecrashreport-etest#獲取設(shè)備 crashlog,test是文件夾需新建 idevicediagnostics#管理設(shè)備狀態(tài)-重啟、關(guān)機(jī)、睡眠等idevicediagnosticsrestart
重啟
其他系統(tǒng)文件信息
截屏
獲取手機(jī)端崩潰報(bào)告
查看手機(jī)實(shí)時(shí)日志
獲取設(shè)備信息
查看設(shè)備已安裝的應(yīng)用
卸載應(yīng)用
安裝應(yīng)用
查看當(dāng)前所連接的設(shè)備
ideviceinstaller 是一個(gè)與iOS設(shè)備的installation_proxy交互的工具,允許安裝、升級(jí)、卸載、存檔、還原和列舉已安裝或存檔的app。此工具用于在真機(jī)上運(yùn)行測(cè)試,默認(rèn)是都安裝的。
libimobiledevice 是一個(gè)跨平臺(tái)的軟件庫 ;不依賴任何已有的私有庫,不需要越獄。應(yīng)用軟件可以通過這個(gè)開發(fā)包輕松訪問設(shè)備的文件系統(tǒng)、獲取設(shè)備信息,備份和恢復(fù)設(shè)備,管理 SpringBoard 圖標(biāo),管理已安裝應(yīng)用,獲取通訊錄、日程、備注和書簽等信息
ios_webkit_debug_proxy
Appium使用ios_webkit_debug_proxy這個(gè)工具在真機(jī)上訪問web view。即混合應(yīng)用的測(cè)試 ;在終端中,運(yùn)行以下命令:
brewinstallios-webkit-debug-proxy#安裝命令 brewreinstallios-webkit-debug-proxy#重新安裝
附:
iOS WebKit Debug Proxy的原理是在本地起了一個(gè)代理做WebInspector到WebKit遠(yuǎn)程調(diào)試的協(xié)議轉(zhuǎn)發(fā)。
authroize-ios
iOS 授權(quán)工具,主要用于模擬器中一些權(quán)限的授權(quán);
npminstall-gauthroze-iossudoauthroze-ios sudoauthroze-ios
iOS 環(huán)境
Xcode
安裝Xcode和模擬器 :
啟動(dòng)Mac應(yīng)用程序商店并下載/安裝Xcode(Version 13.1)。安裝之后,啟動(dòng)Xcode并選擇 Xcode > Preferences > Components 來安裝可能想要測(cè)試的模擬器。
安裝Command Line Tools
默認(rèn)是不會(huì)安裝Command Line Tools的,Command Line Tools是在Xcode中的一款工具,可以在命令行中運(yùn)行C程序。為了配置appium環(huán)境,我們需要安裝Xcode Command Line Tools。
官網(wǎng)下載
方法一:
xcode-select--install#查看是否安裝 xcode-select:error:commandlinetoolsarealreadyinstalled,use"SoftwareUpdate"to install updates(錯(cuò)誤:命令行工具已經(jīng)安裝,請(qǐng)使用“軟件更新”安裝更新)
方法二:
打開Xcode,創(chuàng)建一個(gè)新的項(xiàng)目,在OSX下面選擇Application,如果右側(cè)出現(xiàn)Command line tool圖 標(biāo),表示已經(jīng)安裝成功。
方法三:
打開XCode 新建工程,如果安裝了,在新建窗口可以看到
xcodebuild-version
如果已經(jīng)安裝過xcode,appium-doctor提示未安裝,則運(yùn)行命令即可:
sudoxcode-select-r
附錄:
xcrunsimctllist|grep'(Booted)'#查看已啟動(dòng)的模擬器udid instruments-sdevices#列出所有設(shè)備,包括真機(jī)、模擬器、mac #錄像功能 xrecord--quicktime--list xrecord--quicktime--name="iPhone"--out="/Users/yong/video/iphone.mp4"--force
安裝完成后,在終端中輸入以下命令來查看安裝版本:
下載完成后,雙擊已下載的 .dmg 進(jìn)行安裝
檢驗(yàn) Command Line Tools 是否安裝成功
至此iOS環(huán)境搭建完畢!!!只適用于模擬器,真機(jī)的話還需要配置。
iOS 真機(jī)調(diào)試環(huán)境配置
前面我們知道WebDriverAgent是集成Appium測(cè)試ios應(yīng)用的橋梁 (表現(xiàn)形式上:是安裝在ios設(shè)備上的一個(gè)應(yīng)用),WebDriverAgent 先前是一個(gè)獨(dú)立的項(xiàng)目需要自己從github下載進(jìn)行編譯執(zhí)行 ,在后來appium已經(jīng)強(qiáng)行將其綁定在其組件中也就是說當(dāng)你安裝好appium時(shí),WebDriverAgent也自動(dòng)幫忙將其安裝好,只需要手動(dòng)修改部分內(nèi)容,重新編譯打包即可運(yùn)行。
方式一:WebDriverAgent通過下載源碼進(jìn)行安裝
不推薦通過此種方式安裝,該方式先前是為老版本ios 9.4 之前的版本沿用 ,且 github上的源碼已經(jīng)距離現(xiàn)在兩年多沒有更新了,為避免不必要的問題。盡可能不要使用此種方式
安裝webdriverAgent
(1) 在github上下載最新webdriverAgent代碼
gitclonehttps://github.com/facebook/WebDriverAgent
(2)下載依賴
cd/Users/yourname/WebDriverAgent mkdir-pResources/WebDriverAgent.bundle sh./Scripts/bootstrap.sh
該腳本會(huì)使用Carthage下載所有的依賴,使用npm打包響應(yīng)的js文件。執(zhí)行完成后,直接雙擊打開WebDriverAgent.xcodeproj這個(gè)文件。
配置webdriverAgent
配置WebDriverAgentLib,選擇開發(fā)者賬號(hào)
配置WebDriverAgentRunner,選擇開發(fā)者賬號(hào)
連接并選擇自己的ios設(shè)備,運(yùn)行
運(yùn)行成功后,iphone手機(jī)上會(huì)新建一個(gè)無圖標(biāo)的WebDriverAgent的應(yīng)用,自動(dòng)打開后馬上又返回桌面
而在xcode控制臺(tái)會(huì)打印如下日志:
里面有IP地址與端口號(hào)
在網(wǎng)址上輸入http://(ip地址):(端口號(hào))/status,如果網(wǎng)頁上返回一些json格式的數(shù)據(jù),說明運(yùn)行成功http://10.0.223.58:8100/status,有些iphone手機(jī)通過手機(jī)的IP和端口號(hào)還不能訪問,此時(shí)需要將手機(jī)的端口轉(zhuǎn)發(fā)到mac上
iproxy 8100 8100 # iproxy 8300 8100
執(zhí)行命令后,通過訪問 http://localhost:8100/ status來驗(yàn)證, 如果網(wǎng)頁上返回一些json格式的數(shù)據(jù),說明運(yùn)行成功
而如果是想查看UI的圖層,則可訪問http://localhost:8100/inspector,方便書寫測(cè)試用例
備注:
通常來說為了持續(xù)集成,自動(dòng)化會(huì)比較好一些,我們不必每次都通過這種方式來啟動(dòng)xcode、WebDriverAgent,這種方式只在第1次搭建環(huán)境時(shí)運(yùn)行即可,我們可以在自動(dòng)化腳本中加入如下代碼,這樣只要在以后啟動(dòng)appium后,運(yùn)行自動(dòng)化腳本,就會(huì)直接啟動(dòng)WebDriverAgent
desiredCapabilities.setCapability("useNewWDA", true);
如果xcode在先啟動(dòng)wda,而代碼中又用此行代碼,運(yùn)行時(shí)xcode中會(huì)顯示執(zhí)行失敗,報(bào)出沖突的錯(cuò)誤哦,所以后期只在代碼中啟動(dòng)WebDriverAgent即可,不再需要用xcode啟動(dòng)
精簡(jiǎn)過程如下:
方式二:WebDriverAgent通過集成appium進(jìn)行安裝
命令行安裝:命令行安裝的appium一般安裝在/usr/local/bin/appium下,
WebDriverAgent將會(huì)在路徑:/usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent/ 下
桌面版安裝:WebDriverAgent的路徑是:ls /Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent
以上兩種方式都可以在對(duì)應(yīng)目錄看到 WebDriverAgent.xcodeproj 工程,右鍵選擇用xcode打開 ;在 “Signing&Capabilities” 下將 WebDriverAgentLib 和 WebDriverAgentRunner設(shè)置成 “Automatically manage signing” 并在 “Team” 中選擇你的開發(fā)團(tuán)隊(duì)
新用戶第一次需要?jiǎng)?chuàng)建Team團(tuán)隊(duì)
剩下操作步驟和方式一種第3步一樣, 不在此列出 ;
IOS自動(dòng)化-WebDriverAgent-APPIUM框架原理
WebDriverAgent是Facebook開發(fā)的基于XCTest.framework的開源項(xiàng)目,實(shí)現(xiàn)了在iOS上支持WebDriver協(xié)議的服務(wù),可以用來啟動(dòng)/終止APP,點(diǎn)擊/滑動(dòng)頁面。
webdriver協(xié)議是一套基于HTTP協(xié)議的JSON格式規(guī)范,協(xié)議規(guī)定了不同操作對(duì)應(yīng)的格式。之所以需要這層協(xié)議,是因?yàn)閕OS、Android、瀏覽器等都有自己的UI交互方式,通過這層”驅(qū)動(dòng)層“屏蔽各平臺(tái)的差異,就可以通過相同的方式進(jìn)行自動(dòng)化的UI操作,做網(wǎng)絡(luò)爬蟲常用的selenium是瀏覽器上實(shí)現(xiàn)webdriver的驅(qū)動(dòng),而WebDriverAgent則是iOS上實(shí)現(xiàn)webdriver的驅(qū)動(dòng)。
Appium客戶端
在iOS上的客戶端實(shí)際上就是使用了WebDriverAgent,作為實(shí)現(xiàn)webdriver協(xié)議的驅(qū)動(dòng)層。
Appium服務(wù)端
Appium的服務(wù)端是一個(gè)桌面應(yīng)用,用于和客戶端通信,啟動(dòng)Appium的服務(wù)端之后,會(huì)在電腦上啟動(dòng)一個(gè)默認(rèn)端口號(hào)是4723的HTTP服務(wù)。當(dāng)我們編寫完腳本執(zhí)行時(shí),腳本代碼會(huì)被轉(zhuǎn)換為webdriver協(xié)議的JSON數(shù)據(jù),通過HTTP請(qǐng)求發(fā)送到電腦的4723端口。Appium服務(wù)端將腳本的執(zhí)行請(qǐng)求下發(fā)給客戶端(請(qǐng)求客戶端的6100端口),客戶端同樣使用webdriver協(xié)議響應(yīng)
利用Appium-Python-Client進(jìn)行iOS的自動(dòng)化測(cè)試
配置 appium 工具
運(yùn)行 Appium-Desktop
開啟start server
點(diǎn)擊start new session并且在Desired Capabilities 中輸入相關(guān)的參數(shù)后點(diǎn)擊Start Session
運(yùn)行成功后,會(huì)彈出一個(gè)控制界面,在該界面中可以控制手機(jī)上正在運(yùn)行的程序
開始自動(dòng)化測(cè)試
打開下載后的appiumSimpleDemo文件,打開appiumSimpleDemo.xcodepro程序,配置下TARGET的簽名
在appiumSimpleDemo的根目錄執(zhí)行編譯指令,編譯出一個(gè)app文件xcodebuild -sdk iphoneos -target appiumSimpleDemo -configuration Release,編譯成功后app文件的地址會(huì)打印在命令行中 ;此處直接使用 xcode進(jìn)行編譯也可以 ,怎么方便怎么來
執(zhí)行appiumSimpleDemo.py 文件路徑如下:/Users/jx/PycharmProjects/53ui_ios/venv/bin/python /Users/jx/appiumSimpleDemo/appiumSimpleDemo.py
源碼如下:
importunittest importos fromappiumimportwebdriver fromtimeimportsleep classappiumSimpleTezt(unittest.TestCase): defsetUp(self): app_path='/Users/jx/appiumSimpleDemo/build/Release-iphoneos/appiumSimpleDemo.app' app=os.path.abspath(app_path) self.driver=webdriver.Remote( command_executor='http://127.0.0.1:4723/wd/hub', desired_capabilities={ 'app':app, 'platformName':'iOS', 'platformVersion':'14.4', 'deviceName':'iPhone8plus', 'bundleId':'com.yongapps.app', 'udid':'4c7a46cee7f512ff1463eb3b09dc5329e779355c' } ) deftest_push_view(self): next_view_button=self.driver.find_element_by_accessibility_id("entrynextview") next_view_button.click() sleep(2) back_view_button=self.driver.find_element_by_accessibility_id("Back") back_view_button.click() deftearDown(self): sleep(1) #self.driver.quit() if__name__=='__main__': suite=unittest.TestLoader().loadTestsFromTestCase(appiumSimpleTezt) unittest.TextTestRunner(verbosity=2).run(suite)
踩坑筆記
問題1:如果安裝 carthage出現(xiàn)以下錯(cuò)誤:
Error:Anunexpectederroroccurredduringthebrewlinkstep Theformulabuilt,butisnotsymlinkedinto/usr/local Permissiondenied@dir_s_mkdir-/usr/local/Frameworks Error:Permissiondenied@dir_s_mkdir-/usr/local/Frameworks
原因是carthage已經(jīng)安裝,但是沒有 link 到 brew,還有就是文件夾權(quán)限問題,在終端輸入:
MacBook-pro~%sudomkdir/usr/local/Frameworks MacBook-pro~%sudochown$(whoami):admin/usr/local/Frameworks MacBook-pro~%brrewlinkcarthage
問題2:安裝 libimobiledevice & ideviceinstaller 遇到:“invalid active developer path”
運(yùn)行:
MacBook-pro~%xcode-select--install MacBook-pro~%sudoxcode-select-r
可能出現(xiàn)的問題
dyld:Librarynotloaded:/usr/local/opt/openssl/lib/libssl.1.0.0.dylibReferencedfrom: /usr/local/opt/libimobiledevice/lib/libimobiledevice.6.dylibReason:imagenotfound
如果遇到如上錯(cuò)誤,則先卸載ideviceinstaller 和 libimobiledevice
MacBook-pro~%brewuninstallideviceinstaller MacBook-pro~%brewuninstalllibimobiledevice
然后再重安裝即可
問題3:ios-webkit-debug-proxy 安裝遇到 The following directories are not writable by your user:
詳細(xì)錯(cuò)誤提示:
Thefollowingdirectoriesarenotwritablebyyouruser: /usr/local/share/man/man5 /usr/local/share/man/man7
解決方法:因?yàn)槭窃撃夸洘o權(quán)限無法寫入的問題,所以直接sudo給上權(quán)限就可以了,然后再使用安裝命令就可以了,示例如下圖:
問題4:xcode-select --install命令行安裝提示 Xcode alone is not sufficient on Sierra.
Error:XcodealoneisnotsufficientonSierra. InstalltheCommandLineTools: xcode-select--install
解決方案:Mac最新場(chǎng)景下安裝Xcode時(shí)已經(jīng)沒有Command Line了,需要單獨(dú)安裝。根據(jù)提示在使用命令xcode-select --install` 安裝時(shí)最后結(jié)果是不能安裝該軟件。需要安裝如上所示
問題5:方式一 安裝WebDriverAgent 執(zhí)行 ./Scripts/bootsrap.sh 出錯(cuò)如下
安裝最后我們可以看到部分依賴安裝需要安裝 Carthage 這個(gè)東西,如果沒注意的話就會(huì)造成 RoutingHTTPServer 部分文件缺失,后面 build 就會(huì)報(bào)錯(cuò) 。
通過命令 brew install carthage 安裝后再執(zhí)行 ./Scripts/bootstrap.sh 即可。
根據(jù) WebDriverAgent 官網(wǎng)提供的步驟,將參數(shù)替換為我們真機(jī)的參數(shù)后在真機(jī)上嘗試build 。
執(zhí)行完命令后可能會(huì)出現(xiàn)如下報(bào)錯(cuò)
從報(bào)錯(cuò)信息來看,缺少 development team,那么我們回到 Xcode,將 Automatically manage signing 進(jìn)行勾選后選擇一個(gè) Team,注意要進(jìn)入 WebDriverAgentRunner 中進(jìn)行設(shè)置 。設(shè)置好之后又會(huì)出現(xiàn)報(bào)錯(cuò)
這個(gè)報(bào)錯(cuò)信息就和我們之前提到的一樣,bundle indentifler 不唯一,保險(xiǎn)起見,這里將項(xiàng)目中所有的 Targets 都進(jìn)行了修改
修改好之后我們?cè)俅?build,之前的問題解決了,不幸的是 build 又 fail 了,又出現(xiàn)了新的報(bào)錯(cuò):
解決辦法:
沒錯(cuò),我們?cè)趫?bào)錯(cuò)出雙擊,進(jìn)入到報(bào)錯(cuò)代碼處,將 assign 改為 strong 后再次 build :
Build succeeded !!!老淚縱橫…
最終,再執(zhí)行
最后踩坑:build成功后,ios真機(jī)上沒有安裝WDA這個(gè)問題困擾了我一個(gè)星期,然后最后我把ios設(shè)備名改成英文后安裝成功了。。。
終于在 iOS 真機(jī)上看到了 WDA 的身影
問題6:執(zhí)行 ./Scripts/bootstrap.sh ERROR in ./js/app.js 報(bào)錯(cuò) 出錯(cuò)如下
問題7: 執(zhí)行時(shí)候報(bào) xcodebuild failed with code 65 錯(cuò)誤
問題8: 個(gè)人證書調(diào)試失敗
Failed to register bundle identifier.The app identifier "com.facebook.WebDriverAgentRunner" cannot be registered to your development team because it is not available. Change your bundle identifier to a unique string to try again.
需要手動(dòng)更改目標(biāo)的bundle id,方法是進(jìn)入“Build Settings”選項(xiàng),更改“Product bundle Identifier”的值使Xcode將接受,默認(rèn)為com.facebook.WebDriverAgentRunner,你需要改成不一樣的,如:io.automation.WebDriverAgentRunner (此處必須修改為和你在蘋果開發(fā)者后臺(tái)申請(qǐng)的bundle Id 一樣 )
返回 “Signing&Capabilities” 選項(xiàng),看到對(duì)于文件WebDriverAgentRunner的配置文件已經(jīng)創(chuàng)建成功了
問題9: 解決警告問題
解決方案如下:
問題10: 將WDA安裝到被測(cè)手機(jī)上,安裝失敗 ,提示如下
報(bào)錯(cuò): error:Noprofilesfor'io.uitest.WebDriverAgentRunner.xctrunner'werefound:Xcodecouldn'tfindanyiOSAppDevelopmentprovisioningprofilesmatching'io.uitest.WebDriverAgentRunner.xctrunner'.Automaticsigningisdisabledandunabletogenerateaprofile.Toenableautomaticsigning,pass-allowProvisioningUpdatestoxcodebuild.(intarget'WebDriverAgentRunner'fromproject'WebDriverAgent')
報(bào)這個(gè)錯(cuò)是因?yàn)闆]有接入相關(guān)的設(shè)備到MAC上,只要設(shè)備接入,并通過XCode菜單:Product->Destnation->"Select Devices"選中要連接的設(shè)備就行。
解決方案:
XCode:Product->Destination->"Select your iphone"
Product->Scheme->"Select WebDriverAgentRunner"
Product -> Test
注意:運(yùn)行Test之前,手機(jī)先解鎖再通過USB線連接到電腦。
問題10: 解決Product -> Test報(bào)錯(cuò)問題,如下所示
/usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeprojUser-suppliedCFBundleIdentifiervalue'com.facebook.wda.lib'intheInfo.plistmustbethesameasthePRODUCT_BUNDLE_IDENTIFIERbuildsettingvalue'com.facebook.WebDriverAgentLib'.
解決方案:
運(yùn)行報(bào)錯(cuò):
/usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgentLib/Vendor/RoutingHTTPServer/RoutingHTTPServer.h9:'CocoaAsyncSocket/GCDAsyncSocket.h'filenotfound
解決:進(jìn)入appium-webdriveragent目錄,重新執(zhí)行:
MacBook-pro%cd/usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent MacBook-proappium-webdriveragent%sh./Scripts/bootstrap.sh
再次執(zhí)行Product -> Test,彈出密鑰授權(quán)彈窗,輸入密鑰(多次輸入密鑰,直到彈窗消失)
最后報(bào)錯(cuò):Command CodeSign failed with a nonzero exit code解決方案---通過終端命令:
MacBook-proappium-webdriveragent%xcodebuild-projectWebDriverAgent.xcodeproj-schemeWebDriverAgentRunner-destination'id=000-000080E'test
執(zhí)行中會(huì)彈出密鑰彈窗,多次輸入密鑰,直到彈窗消失
最后機(jī)上可以看到一個(gè)沒有圖標(biāo)的 WebDriverAgentRunner.app 應(yīng)用,進(jìn)入設(shè)置 -》通用 -》設(shè)備管理 -》點(diǎn)擊 開發(fā)者app下面的證書 -》點(diǎn)擊“第一個(gè)藍(lán)色字體信任按鈕” -》點(diǎn)擊信任,再重新執(zhí)行項(xiàng)目即可正常連接xcode點(diǎn)擊直接運(yùn)行:
再次報(bào)錯(cuò):
/usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeprojUser-suppliedCFBundleIdentifiervalue'com.facebook.wda.runner'intheInfo.plistmustbethesameasthePRODUCT_BUNDLE_IDENTIFIERbuildsettingvalue'io.uitest.WebDriverAgentRunner'.
解決方案:
最終看到這樣輸出就是成功了:
TestSuite‘Alltests’startedat2017-01-231512.585 TestSuite‘WebDriverAgentRunner.xctest’startedat2017-01-231512.586 TestSuite‘UITestingUITests’startedat2017-01-231512.587 TestCase‘-[UITestingUITeststestRunner]’started. t=0.00sStartTestat2017-01-231512.588 t=0.00sSetUp
備注:
xxx.app為 Xcode 編譯后的應(yīng)用安裝包路徑
xxx.ipa為應(yīng)用在本地的路徑
問題11: wda安裝成功了,但是 驗(yàn)證時(shí)訪問無結(jié)果
解決方案:
有些國產(chǎn)的iPhone機(jī)器通過手機(jī)的IP和端口還不能訪問,此時(shí)需要將手機(jī)的端口轉(zhuǎn)發(fā)到Mac上。
使用--HEAD安裝最新版本
$brewinstalllibimobiledevice--HEAD$iproxy81008100
這時(shí)通過訪問http://localhost:8100/status確認(rèn)WDA是否運(yùn)行成功。
此時(shí)你應(yīng)該可以看到有返回信息,只不過返回的sessionID 為空 ,此處如果有問題見問題12
問題12: Appium 重簽名后的 wda 正常啟動(dòng)了,但是沒有返回 sessionID
wda 的日志如下:
TestSuite'WebDriverAgentRunner.xctest'startedat2020-06-121528.188 TestSuite'UITestingUITests'startedat2020-06-121528.188 2020-06-121528.215329+0800WebDriverAgentRunner-Runner[616:123635][UserDefaults]Couldn'twritevaluesforkeys( KeyboardAutocorrection )inCFPrefsPlistSource<0x282b9ed00>(Domain:com.apple.Preferences,User:kCFPreferencesCurrentUser,ByHost:No,Container:(null),ContentsNeedRefresh:No):settingpreferencesoutsideanapplication'scontainerrequiresuser-preference-writeorfile-write-datasandboxaccess 2020-06-121528.221426+0800WebDriverAgentRunner-Runner[616:123635][UserDefaults]Couldn'twritevaluesforkeys( KeyboardPrediction )inCFPrefsPlistSource<0x282b9ed00>(Domain:com.apple.Preferences,User:kCFPreferencesCurrentUser,ByHost:No,Container:(null),ContentsNeedRefresh:No):settingpreferencesoutsideanapplication'scontainerrequiresuser-preference-writeorfile-write-datasandboxaccess 2020-06-121528.222215+0800WebDriverAgentRunner-Runner[616:123635][UserDefaults]Couldn'twritevaluesforkeys( KeyboardShowPredictionBar )inCFPrefsPlistSource<0x282b9ed00>(Domain:com.apple.Preferences,User:kCFPreferencesCurrentUser,ByHost:No,Container:(null),ContentsNeedRefresh:No):settingpreferencesoutsideanapplication'scontainerrequiresuser-preference-writeorfile-write-datasandboxaccess 2020-06-121528.224043+0800WebDriverAgentRunner-Runner[616:123635][UserDefaults]Couldn'twritevaluesforkeys( DidShowGestureKeyboardIntroduction )inCFPrefsPlistSource<0x282b9ed00>(Domain:com.apple.Preferences,User:kCFPreferencesCurrentUser,ByHost:No,Container:(null),ContentsNeedRefresh:No):settingpreferencesoutsideanapplication'scontainerrequiresuser-preference-writeorfile-write-datasandboxaccess TestCase'-[UITestingUITeststestRunner]'started. t=0.00sStartTestat2020-06-121528.224 t=0.00sSetUp 2020-06-121528.230656+0800WebDriverAgentRunner-Runner[616:123635]BuiltatJun1220201529 2020-06-121528.238785+0800WebDriverAgentRunner-Runner[616:123635]ServerURLHere->http://172.18.62.8:8100<-ServerURLHere 2020-06-12?1528.239467+0800?WebDriverAgentRunner-Runner[616:123836]?Using?singleton?test?manager
使用 postman 發(fā)送請(qǐng)求,返回的 sessionID 為 null,但是 xcode 的控制臺(tái)沒有報(bào)任何錯(cuò)誤
啟動(dòng)應(yīng)用程序直接返回 400
此問題坑爹至極 ,網(wǎng)上搜索了眾多內(nèi)容都沒有此問題的答案 ;但是有人在testhome上已經(jīng)提出了這個(gè)問題但是至今沒有人回復(fù)答案 ;
解決方案:
安裝usbmuxd
brewinstallusbmuxd
iproxy該工具會(huì)將設(shè)備上的端口號(hào)映射到電腦上的某一個(gè)端口
最后使用iproxy 進(jìn)行端口轉(zhuǎn)發(fā)的時(shí)候, 一定跟上指定的設(shè)備id
即: iproxy local_port device_port -u udid
問題13:解決 XCUITest iproxy exited with code 208
命令行執(zhí)行
ps-ax|grep-**i**"iproxy"|grep-vgrep|awk'{print"kill-9"$1}'|sh
問題14:每次測(cè)試應(yīng)用都需要啟動(dòng) WebDriverAgent , 修改使用腳本方式自動(dòng)運(yùn)行
#解鎖keychain,以便可以正常的簽名應(yīng)用, PASSWORD="YourPassword" securityunlock-keychain-p$PASSWORD~/Library/Keychains/login.keychain #獲取設(shè)備的UDID,用到了之前的libimobiledevice UDID=$(idevice_id-l|head-n1) #真機(jī)運(yùn)行測(cè)試 xcodebuild-projectWebDriverAgent.xcodeproj-schemeWebDriverAgentRunner-destination"id=$UDID"test #模擬器運(yùn)行測(cè)試 #xcodebuild-projectWebDriverAgent.xcodeproj-schemeWebDriverAgentRunner-destination"platform=iOSSimulator,name=iPhoneX"test
腳本運(yùn)行完成后,同樣手機(jī)/模擬器上會(huì)出現(xiàn)一個(gè)無圖標(biāo)的 WebDriverAgent 應(yīng)用,啟動(dòng)之后,馬上又返回到桌面。此時(shí)終端會(huì)輸出 IP 地址和端口。
附錄
1. 關(guān)于Certificate、Provisioning Profile、App ID的介紹及其之間的關(guān)系
考慮到想要將待測(cè)試應(yīng)用安裝到真機(jī) ,首先繞不過去的必須得申請(qǐng)證書,申請(qǐng)證書之前又必須得要開發(fā)者賬號(hào),以上都具備了開始按步驟申請(qǐng)Certificate、Provisioning Profile、App ID ;可是即使你申請(qǐng)成功,難免對(duì)以上三者之間關(guān)系感到懵逼,以下對(duì)三者之間關(guān)系進(jìn)行簡(jiǎn)介說明,幫助理清之間的脈絡(luò)關(guān)系
開發(fā)者賬號(hào)類型
概念介紹
如果你擁有一個(gè)開發(fā)者賬戶的話,在iOS Dev Center打開Certificates, Indentifiers & Profiles,你就可以看到如下的列表:
Profile Portal改版有一段時(shí)間了,改版之后的結(jié)構(gòu)比以前更清晰明了,易于理解和管理。
上面的列表就包含了開發(fā)、調(diào)試和發(fā)布iOS應(yīng)用程序所需的所有內(nèi)容:Certificates、Identifiers、Devices、Provisioning Profiles。下面將一一解釋這幾個(gè)東東。
Certificate
證書是用來給應(yīng)用程序簽名的,只有經(jīng)過簽名的應(yīng)用程序才能保證他的來源是可信任的,并且代碼是完整的, 未經(jīng)修改的。在Xcode Build Setting的Code Signing Identity中,你可以設(shè)置用于為代碼簽名的證書。
眾所周知,我們申請(qǐng)一個(gè)Certificate之前,需要先申請(qǐng)一個(gè)Certificate Signing Request (CSR) 文件,而這個(gè)過程中實(shí)際上是生成了一對(duì)公鑰和私鑰,保存在你Mac的Keychain中。代碼簽名正是使用這種基于非對(duì)稱秘鑰的加密方式,用私鑰進(jìn)行簽名,用公鑰進(jìn)行驗(yàn)證。如下圖所示,在你Mac的keychain的login中存儲(chǔ)著相關(guān)的公鑰和私鑰,而證書中包含了公鑰。你只能用私鑰來進(jìn)行簽名,所以如果沒有了私鑰,就意味著你不能進(jìn)行簽名了,所以就無法使用這個(gè)證書了,此時(shí)你只能revoke之前的證書再申請(qǐng)一個(gè)。因此在申請(qǐng)完證書時(shí),最好導(dǎo)出并保存好你的私鑰。當(dāng)你想與其他人或其他設(shè)備共享證書時(shí),把私鑰傳給它就可以了。私鑰保存在你的Mac中,而蘋果生成的Certificate中包含了公鑰。當(dāng)你用自己的私鑰對(duì)代碼簽名后,蘋果就可以用證書中的公鑰來進(jìn)行驗(yàn)證,確保是你對(duì)代碼進(jìn)行了簽名,而不是別人冒充你,同時(shí)也確保代碼的完整性等。
證書主要分為兩類:Development和Production,Development證書用來開發(fā)和調(diào)試應(yīng)用程序,Production主要用來分發(fā)應(yīng)用程序(根據(jù)證書種類有不同作用),下面是證書的分類信息:(括號(hào)內(nèi)為證書有效期)
(注:不同類型的開發(fā)者賬戶所能創(chuàng)建的證書種類不同,關(guān)于開發(fā)者賬戶的對(duì)比和InHouse證書相關(guān)的內(nèi)容,請(qǐng)見我的另一篇文章)
有一些類型的證書我沒有使用過,所以也不了解具體的作用。
App ID
App ID用于標(biāo)識(shí)一個(gè)或者一組App,App ID應(yīng)該是和Xcode中的Bundle ID是一致的或者匹配的。App ID主要有以下兩種:
每創(chuàng)建一個(gè)App ID,我們都可以設(shè)置該App ID所使用的APP Services,也就是其所使用的額外服務(wù)。每種額外服務(wù)都有著不同的要求,例如,如果要使用Apple Push Notification Services,則必須是一個(gè)explicit App ID,以便能唯一標(biāo)識(shí)一個(gè)應(yīng)用程序。下面是目前所有可選的服務(wù)和相應(yīng)的配置要求。
如果你的App使用上述的任何一種service,就要按照要求去配置。
Device
Device最簡(jiǎn)單了,就是iOS設(shè)備。Devices中包含了該賬戶中所有可用于開發(fā)和測(cè)試的設(shè)備。每臺(tái)設(shè)備使用UDID來唯一標(biāo)識(shí)。
每個(gè)賬戶中的設(shè)備數(shù)量限制是100個(gè)。Disable 一臺(tái)設(shè)備也不會(huì)增加名額,只能在membership year 開始的時(shí)候才能通過刪除設(shè)備來增加名額。
Provisioning Profile
一個(gè)Provisioning Profile文件包含了上述的所有內(nèi)容:證書、App ID、設(shè)備。
試想一下,如果我們要打包或者在真機(jī)上運(yùn)行一個(gè)應(yīng)用程序,我們首先需要證書來進(jìn)行簽名,用來標(biāo)識(shí)這個(gè)應(yīng)用程序是合法的、安全的、完整的等等;然后需要指明它的App ID,并且驗(yàn)證Bundle ID是否與其一致;再次,如果是真機(jī)調(diào)試,需要確認(rèn)這臺(tái)設(shè)備能否用來運(yùn)行程序。而Provisioning Profile就把這些信息全部打包在一起,方便我們?cè)谡{(diào)試和發(fā)布程序打包時(shí)使用,這樣我們只要在不同的情況下選擇不同的profile文件就可以了。而且這個(gè)Provisioning Profile文件會(huì)在打包時(shí)嵌入.ipa的包里。
例如,如下圖所示,一個(gè)用于Development的Provisioning Profile中包含了該P(yáng)rovisioning Profile對(duì)應(yīng)的App ID,可使用的證書和設(shè)備。這意味著使用這個(gè)Provisioning Profile打包程序必須擁有相應(yīng)的證書,并且是將App ID對(duì)應(yīng)的程序運(yùn)行到Devices中包含的設(shè)備上去。
Explicit App ID:唯一的App ID,這種App ID用于唯一標(biāo)識(shí)一個(gè)應(yīng)用程序,例如com.ABC.demo1,標(biāo)識(shí)Bundle ID為com.ABC.demo1的程序。
Wildcard App ID:通配符App ID,用于標(biāo)識(shí)一組應(yīng)用程序。例如*可以表示所有應(yīng)用程序,而com.ABC.*可以表示以com.ABC開頭的所有應(yīng)用程序。
In-House and Ad Hoc (3年):用來發(fā)布In-House和AdHoc的應(yīng)用程序。
MDM CSR
Push Production (1年):用來在發(fā)布版本中使用Apple Push Notification。
Pass Type ID Certificate
Website Push ID Certificate
App Development (1年):用來開發(fā)和真機(jī)調(diào)試應(yīng)用程序。
Push Development (1年):用來調(diào)試Apple Push Notification
Development
Production
App Store :用來發(fā)布提交App Store的應(yīng)用程序。
如上所述,在一臺(tái)設(shè)備上運(yùn)行應(yīng)用程序的過程如下:
與證書一樣,Provisioning Profile也分為Development和Distribution兩種:
(注:前面提到不同賬戶類型所能創(chuàng)建的證書種類不同,顯然Profile文件的種類是和你所能創(chuàng)建的證書種類相關(guān)的)
Development (1年)
Distribution (1年)
In House
Ad Hoc
App Store
In House 與Ad Hoc的不同之處在于:In House沒有設(shè)備數(shù)量限制,而Ad Hoc是用來測(cè)試用的,Ad Hoc的包只能運(yùn)行在該賬戶內(nèi)已登記的可用設(shè)備上,顯然是有最多100個(gè)設(shè)備的數(shù)量限制。所以這兩種Provisioning Profile文件的區(qū)別就在于其中的設(shè)備限制不一樣而已,而他們所使用的Certificate是相同的。
開發(fā)/發(fā)布流程
了解了上面的概念,再來看開發(fā)及發(fā)布流程就非常簡(jiǎn)單了,而且相信你不用看教程也能一步步完成所有的操作了。
開發(fā)/真機(jī)調(diào)試流程
根據(jù)上面的介紹,可以知道進(jìn)行Development主要有以下幾個(gè)步驟:
申請(qǐng)證書
加入設(shè)備
生成Provisioning Profile
設(shè)置Xcode Code Sign Identifer
事實(shí)上第三步通常是不需要的,因?yàn)槲覀兺ǔ6际怯肵code生成和管理的iOS Team Provisioning Profile來進(jìn)行開發(fā),因?yàn)樗浅7奖悖圆恍枰约菏謩?dòng)生成Provisioning Profile。
iOS Team Provisioning Profile是第一次使用Xcode添加設(shè)備時(shí),Xcode自動(dòng)生成的,它包含了Xcode生成的一個(gè)Wildcard App ID(*,匹配所有應(yīng)用程序),賬戶里面所有的Devices和所有Development Certificates,如下圖所示。因此,team中的所有成員都可以使用這個(gè)iOS Team Provisioning Profile在team中的所有設(shè)備上調(diào)試所有的應(yīng)用程序。并且當(dāng)有新設(shè)備添加進(jìn)來時(shí),Xcode會(huì)更新這個(gè)文件。
發(fā)布流程
網(wǎng)上有很多關(guān)于發(fā)布App Store的流程,我就不綴述了,不過根據(jù)上面的概念介紹,不管是App Store、In-House還是Ad-Hoc,打包流程都是差不多的,都包括了以下幾個(gè)關(guān)鍵步驟:
創(chuàng)建發(fā)布證書
創(chuàng)建App ID
創(chuàng)建對(duì)應(yīng)的Provisioning Profile文件
設(shè)備Bundle ID和App ID一致
設(shè)置Xcode Code Sign Identifer,選擇合適的Profile和證書進(jìn)行簽名,打包
2. WebDriverAgent 整體框架設(shè)計(jì)
GitHub的描述:
WebDriverAgentisaWebDriverserverimplementationforiOSthatcanbeusedtoremotecontroliOSdevices.Itallowsyoutolaunch&killapplications,tap&scrollviewsorconfirmviewpresenceonascreen.Thismakesitaperfecttoolforapplicationend-to-endtestingorgeneralpurposedeviceautomation.ItworksbylinkingXCTest.frameworkandcallingApple'sAPItoexecutecommandsdirectlyonadevice.WebDriverAgentisdevelopedandusedatFacebookforend-to-endtestingandissuccessfullyadoptedbyAppium.
WebDriverAgent在iOS端實(shí)現(xiàn)了一個(gè)WebDriverServer,可用于遠(yuǎn)程控制iOS設(shè)備。它允許您啟動(dòng)和終止應(yīng)用程序,點(diǎn)擊和滾動(dòng)視圖或確認(rèn)屏幕上的視圖狀態(tài)。這使其成為應(yīng)用端到端測(cè)試或通用設(shè)備自動(dòng)化的完美工具。它通過鏈接XCTest.framework和調(diào)用Apple的API來直接在設(shè)備上執(zhí)行命令。WebDriverAgent在Facebook上開發(fā)并用于端到端測(cè)試,并被Appium成功采用。特性:
適用于設(shè)備和模擬器
實(shí)現(xiàn)大部分WebDriver規(guī)范
實(shí)現(xiàn)Mobile JSON Wire Protocol Spec的一部分
USB支持設(shè)備
具有友好用戶界面的Inspector 端點(diǎn),用于檢查當(dāng)前設(shè)備狀態(tài)
易于開發(fā),因?yàn)樗梢酝ㄟ^Xcode直接啟動(dòng)和調(diào)試
尚不支持,但與tvOS和OSX一起使用
WDA Client
WDA Client是基于WebDriverAgent實(shí)現(xiàn)的WDA的客戶端。
我們?cè)?iOS 設(shè)備上啟動(dòng)了 WDA 的服務(wù)端。為了運(yùn)行 Mac OS 上的腳本,我們需要在 Mac OS 上安裝 WDA 客戶端。
facebook-wda 就是 WDA 的 Python 客戶端庫,通過直接構(gòu)造HTTP請(qǐng)求直接跟WebDriverAgent通信。
#安裝WDApython客戶端 pip3install--prefacebook-wda
-
自動(dòng)化測(cè)試
+關(guān)注
關(guān)注
0文章
214瀏覽量
26929 -
iOS
+關(guān)注
關(guān)注
8文章
3397瀏覽量
150865
原文標(biāo)題:Appium +iOS 自動(dòng)化測(cè)試全網(wǎng)最全教程(實(shí)踐、總結(jié) 、踩坑)
文章出處:【微信號(hào):TestinChina,微信公眾號(hào):Testin云測(cè)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論