XCTWaiter を使用して、UI オートメーション セットアップで特定の条件を待機しています。これは私のカスタムwaitForメソッドです:
// UITools.swift
public class func waitFor(_ element:Any, timeout:UInt, clause:String) -> Bool
{
let predicate = NSPredicate(format: clause)
let expectation = testcase.expectation(for: predicate, evaluatedWith: element)
print("Waiting for \(element) to become \"\(clause)\" within \(timeout) seconds ...")
let result = XCTWaiter.wait(for: [expectation], timeout: TimeInterval(timeout))
switch result
{
case .completed:
return true
case .invertedFulfillment:
print("waitFor result is in inverted fulfillment.")
return true
case .timedOut:
print("waitFor result is timed out.")
case .incorrectOrder:
print("waitFor result is in incorrect order.")
case .interrupted:
print("waitFor result is interrupted.")
}
return false
}
この方法は、XCUIElements を待つ場合には問題なく機能しますが、ネットワーク リクエストが終了するまで待ちたい場合があるため、ネットワーク リクエストが終了したら true に設定されるフラグを使用します。簡単な例を次に示します。
class Hub : NSObject
{
var isTestRailCasesRetrived = false
func retrieveTestRailCaseData()
{
isTestRailCasesRetrived = false
testrailClient.getTestCases()
{
(response:TestRailModel) in
// Do processing here ...
print("Found \(totalCases) TestRail cases for suite with ID \(suite.id).")
self.isTestRailCasesRetrived = true
}
UITools.waitFor(self, timeout: 30, clause: "isTestRailCasesRetrived == true")
}
}
ただし、XCTWaiter が完全に到達することはなく、タイムアウト後にタイムアウトするだけです。isTestRailCasesRetrived
この状況では決して評価されないようです。誰かが理由を知っていますか?