0

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この状況では決して評価されないようです。誰かが理由を知っていますか?

4

2 に答える 2

0

回避策を見つけました。このメソッドは、上記のコードが機能しなかったこの特定のケースで正常に機能します。この待機ループが終了するまで、XCUITest コードの実行をブロックします...

/// Ass-simple brute force wait method for when nothing else works.
///
public class func waitUntil(timeout:Int = 30, evalblock:@escaping (() -> Bool))
{
    var count = 0
    repeat
    {
        if count >= timeout || evalblock() == true
        {
            break
        }
        else
        {
            Darwin.sleep(1)
        }
        count += 1
    }
    while true
}
于 2017-10-27T09:16:20.693 に答える
0

NSPredicate は Objective-C ランタイムで動作し、それによって評価されるプロパティまたは関数は @objc 属性でマークする必要があります。

解決:

class Hub : NSObject
{
    @objc 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")
    }
}
于 2021-03-01T07:40:55.953 に答える