Post

從零開始:如何成功建置並執行你的第一次UITest

紀錄在從未執行過 UITtest 的 app 讓它能成功跑 UITtest 期間遇到的狀況

從零開始:如何成功建置並執行你的第一次UITest

從零開始:如何成功建置並執行你的第一次UITest

紀錄在從未執行過 UITtest 的 app 讓它能成功跑 UITtest 期間遇到的狀況

紀錄在從未執行過 UITtest 的 app 讓它能成功跑 UITtest 期間遇到的狀況

紀錄在從未執行過 UITtest 的 app 讓它能成功跑 UITtest 期間遇到的狀況

先讓 UITests 能 build 成功

錯誤:There is no scheme and/or test plan that contains every test you are trying to run.

處理:UITests 沒被配置到任何 target 的 test 階段,所以從 scheme Edit 中把 UT scheme 的 test 階段加進去就可以了

錯誤:各種文檔案顯示 build 失敗

處理:清除其他無關檔案卻有勾選 UITest 的檔案

跟UITtest無相關的檔案都取消掉

跟UITtest無相關的檔案都取消掉

錯誤:Undefined symbols: Linker command failed with exit code 1 (use -v to see invocation)

處理:清除不必要的 Compile Sources 和 Copy Bundle Resources

不會用到的通通刪除,一些比較久的 code 可能多了很多無關的

不會用到的通通刪除,一些比較久的 code 可能多了很多無關的

第一次build成功

要能自動登入

怎麼找到登入時帳密的輸入框?

(輸入框是 自定義物件 但在 vc 有拉出物件)

1
2
3
4
// 在 VC 長這樣
@IBOutlet var xxxView(自定義物件): userIDView!
// 在 UITest 這樣抓
private lazy var userIDInputView = app.otherElements["userIDView"]

物件不只一層,裡面有多個物件時怎麼抓?

可以透過下 break point 時下指令 po 物件.children(matching: .any)

children(matching:)

因為原本一直找不到輸入使用者名稱的 textfield,後來這樣才發現原來不是單純的在 view 的下一層。

用 .descendants 似乎可以列出更多層

descendants(matching:)

登入時的帳號密碼可能是 secureTextFields 要留意跟 textFields 是不一樣的!

成功進行登入

跑 UITest 可能失敗的狀況

可能造成測試失敗:登入進行時可能出現的警告視窗如何點掉?

1
2
3
4
5
6
/// 可以檢查警告彈窗上的按鈕,有偵測到就點掉
sleep(1) // 等待彈窗出現緩衝時間
if app.buttons.staticTexts["按鈕文字"].exits {
let btn = app.buttons.staticTexts["按鈕文字"]
btn.tap()
}

錯誤:Neither element nor any descendant has keyboard focus.

要點擊輸入的元素(輸入框之類的)沒有鍵盤焦點(沒點擊到、沒有firstresponse之類的)

可能有開 ipone 的輔助操作(畫面會出現圓點) 蓋到要點擊的輸入框了

Post converted from Medium by ZMediumToMarkdown.

This post is licensed under CC BY 4.0 by the author.