2016-08-30 7 views
2

私のiOSのUIをテストするために、私は次のテストヘルパー関数を持っている:UITestでNSPredicateでvalueForKeyを使用する方法はありますか?

私は私のテストで
func waitForElementToHaveKeyboardFocus(element: XCUIElement) { 
    self.expectationForPredicate(NSPredicate(format:"valueForKey(\"hasKeyboardFocus\") == true"), evaluatedWithObject:element, handler: nil) 
    self.waitForExpectationsWithTimeout(5, handler: nil) 
} 

を:

let usernameTextField = app.textFields["Username"] 
let passwordTextField = app.secureTextFields["Password"] 
waitForElementToHaveKeyboardFocus(usernameTextField) 

テストは、次のエラーで失敗します。

error: -[ExampleAppUITests.ExampleAppUITests testExampleApp] : failed: caught "NSUnknownKeyException", "[<_NSPredicateUtilities 0x10e554ee8> valueForUndefinedKey:]: this class is not key value coding-compliant for the key hasKeyboardFocus." 

失敗時にテストにブレークポイントを設定し、手動でvalueForKey("hasKeyboardFocus")をフォーカスしたフィールドとフォーカスしていないフィールドの両方に呼び出すと、正しい動作が得られます。

(lldb) po usernameTextField.valueForKey("hasKeyboardFocus") 
    t = 51.99s  Find the "Username" TextField 
    t = 51.99s   Use cached accessibility hierarchy for ExampleApp 
    t = 52.00s   Find: Descendants matching type TextField 
    t = 52.01s   Find: Elements matching predicate '"Username" IN identifiers' 
▿ Optional<AnyObject> 
    - Some : 1 

(lldb) po passwordTextField.valueForKey("hasKeyboardFocus") 
    t = 569.99s  Find the "Password" SecureTextField 
    t = 569.99s   Use cached accessibility hierarchy for ExampleApp 
    t = 570.01s   Find: Descendants matching type SecureTextField 
    t = 570.01s   Find: Elements matching predicate '"Password" IN identifiers' 
▿ Optional<AnyObject> 
    - Some : 0 

それはUIテストでNSPredicateXCUIElement仕事にvalueForKeyを作ることは可能ですか?これを行う別のエレガントな方法はありますか?

答えて

2

あなたの述語が少しオフになっているようです。以下にそれを変更してみてください:あなたは述語を作成するときにvalueForKey部分に渡す必要はありません

NSPredicate(format: "hasKeyboardFocus == true"), evaluatedWithObject:element, handler: nil) 

+0

素晴らしいです。奇妙なことに、私はデバッガで試してみましたが、動作しません: 'エラー::2:1:エラー:' XCUIElement '型の値に' hasKeyboardFocus 'というメンバがありません。その構文を持つ他の述部、例えば: 'NSPredicate(format:" hittable == true ")'はデバッガで動作します。しかし、 'hasKeyboardFocus'はデバッガの' valueForKey'でしか動作しません。奇妙な。 – Mitochondrion

2

あなたはメソッドにクロージャとしてvalueForKey("")のためにあなたの文を渡す場所が、このような何かを行うことができます。

func waitForElementToHaveKeyboardFocus(statement statement:() -> Bool, timeoutSeconds: Int) 
{ 
    var second = 0 
    while statement() != true { 
     if second >= timeoutSeconds { 
      XCTFail("statement reached timeout of \(timeoutSeconds) seconds") 
     } 

     sleep(1) 
     second = second + 1 
    } 
} 

、その後のようなテストに使用します。

waitForElementToHaveKeyboardFocus(statement: { usernameTextField.valueForKey("hasKeyboardFocus") as? Bool == true }, timeoutSeconds: 10) 

名前を変更することができますこのメソッドはより汎用的で、渡されたクロージャーを検証します。お役に立てれば!

関連する問題