UITesting -> UISearchBar в titleView NavigationItem возвращает XCUIElement.Type other

Я устанавливаю titleView для navigationItem для UIViewController как UISearchBar. Это отлично работает в приложении, но теперь я пытаюсь добавить некоторый UITesting, и когда я ищу элемент с помощью XCUIElementQuery, он возвращает XCUIElement.Type как .other вместо .searchField, что я и ожидаю. Впоследствии мой тест падает, когда я пытаюсь ввести текст в поле, используя XCUIApplication().typeText("abcd"). Вот пример кода:

В контроллере представления:

override func viewDidLoad() {
        let searchBar = UISearchBar()
        searchBar.isAccessibilityElement = true
        searchBar.accessibilityIdentifier = "search-bar" 

        searchBar.delegate = self.searchViewController
        self.navigationItem.titleView = searchBar
}

В UITest:

func testEnterTextInSearchBar() {        
    let app = XCUIApplication()
    let searchBarElement = app.descendants(matching: .any).matching(identifier: "search-bar").firstMatch
    searchBarElement.tap()
    app.typeText("test")
}

КРУШЕНИЕ!!! потому что он думает, что тип .other, а не .searchField

Ошибка: «Ни элемент, ни какой-либо потомок не имеют фокуса клавиатуры. Элемент: Атрибуты: Другое, 0x608000192f10, черты: 8589934592, идентификатор:« панель поиска »»

Также использование app.keys["x"].tap() работает нормально, пока включена программная клавиатура.


person drew2dev    schedule 29.11.2017    source источник
comment
Я думаю, что это ошибка в структуре UITest. Я пробовал разные подходы, но даже когда вы записываете тест, он дает ту же ошибку. Может быть, подать радар в Apple?   -  person joern    schedule 29.11.2017
comment
Пожалуйста, убедитесь, что подключение аппаратной клавиатуры симулятора отключено. Вы можете найти его в разделе Оборудование --› Клавиатура --› Подключить аппаратную клавиатуру отключено.   -  person Mahmud Riad    schedule 29.11.2017
comment
Спасибо за ответы. Я тоже склоняюсь к тому, что это баг. Пробовал с отключенной аппаратной клавиатурой. Когда это отключено, я могу заставить работать функцию app.keys[D].tap() (хотя вы должны начать с символа в верхнем регистре, а затем использовать нижний регистр, иначе он не найдет ключи.)   -  person drew2dev    schedule 29.11.2017
comment
Хорошо, я думаю, проблема в том, что searchBar.isAccessibilityElement = true это изменение типа доступности на .other вместо .searchField. Удаление этой строки, кажется, решает проблему.   -  person drew2dev    schedule 29.11.2017
comment
ОДНАКО, чего я не нашел, так это того, что кнопка отмены в элементе UISearchBar не находится в иерархии доступности UITesting!   -  person drew2dev    schedule 30.11.2017
comment
Привет из 2019 года, это все еще проблема. Установка для isAccessibilityElement значения false помогает.   -  person Steffen Andersen    schedule 13.03.2019


Ответы (1)


Шаг 1. Отключите аппаратную клавиатуру. Вы можете найти его на

Hardware --> Keyboard --> Connect Hardware keyboard [Disable this option]

Шаг 2:

 func testEnterTextInSearchBar() {        
 let app = XCUIApplication()

 // use one of below two  code
 let searchBarElement = app.otherElements["search-bar"].tap().firstMatch
 //let searchBarElement = app.searchFields["search-bar"].tap().firstMatch


 searchBarElement.tap()
 searchBarElement.typeText("test")

}

Пожалуйста, дайте мне знать результат.

person Mahmud Riad    schedule 29.11.2017
comment
См. комментарий выше. Спасибо! - person drew2dev; 29.11.2017