Intereting Posts
как я могу проверить, является ли NSUrl допустимым URL-адресом изображения? NSInvalidArgumentException Trace: <redacted> <redacted> <redacted> в iOS 6 Имея 2 многострочные метки на одном UITableViewCell в iOS 8 Элементы UITableview становятся жирными после прокрутки вверх Создание пользовательских типов Core Foundation. Swift: обратный вызов делегата / протокола XCTest (тест модуля) Как использовать веб-безопасные цвета в Xcode Отображать текст TextLabel над пользовательским изображением ячейки не получать push-уведомления в приложении cordova ios с использованием firebase Модальный контроллер просмотра с различным стилем StatusBar, чем ParentViewController Как очистить содержимое подвью до рисования Приобретение безопасного элемента в Keychain иногда возвращает ошибку -25308 (errSecInteractionNotAllowed) в iOS Центрировать несколько независимых элементов в быстрой (раскадровке) DFPInterstitial: непризнанный селектор gad_MD5String Как обновить SDK Google Mobile Ads в xcode при получении этого сообщения: <Google: HTML> В настоящее время вы используете версию 7.6.0 SDK?

Есть ли способ использовать valueForKey с NSPredicate в UITest?

У меня есть следующая тестовая вспомогательная функция для тестов IOS UI:

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") останова в тесте при valueForKey("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 

Можно ли сделать valueForKey на XCUIElement работе с NSPredicate в тесте UI? Есть ли еще один элегантный способ сделать это?

Похоже, что ваш предикат слегка отключен. Попробуйте изменить его на следующее:

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

При создании предиката вам не нужно передавать часть valueForKey .

вы можете сделать что-то подобное, когда вы передаете свой оператор для 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) 

вы можете переименовать этот метод в более общий, и он будет проверять ваше закрытое закрытие. Надеюсь это поможет!