Xcode 9: как создавать экземпляры XCUIElement с помощью XCUIElementQuery?

После просмотра видеороликов WWDC Xcode 2017 и XCTest я обновил свои тесты до использовать последние дополнения в XCTests.

Недавно я обновился до бета-версии Xcode 9, работающей под управлением OS X Sierra 10.12.4.

После этого все тесты, в которых я использовал XCUIElement() для создания экземпляра элемента, завершились неудачей. .

Пример строки кода: XCTAssertTrue(XCUIElement().scrollToElement(tablesQuery.cells.staticTexts["Featured"]).exists)

Я получаю сообщение об ошибке: 'init()' недоступен: используйте XCUIElementQuery для создания экземпляров XCUIElement.

Если вам интересно, что такое scrollToElement(), это пользовательская функция для прокрутки к запрашиваемому элементу, если он не отображается в текущем представлении. Это часть пользовательского расширения XCUIElement, которое я написал.

Как часть решения, можете ли вы предложить: Как сейчас предполагается создавать экземпляры XCUIElement?

Для справки: scrollToElement()

open func scrollToElement(_ element: XCUIElement) -> XCUIElement {
    while !element.visible() {
        swipeUp()
    }
    return element
}

open func visible() -> Bool {
    guard self.exists && !self.frame.isEmpty else { return false }
    return XCUIApplication().windows.element(boundBy: 0).frame.contains(self.frame)
}

Любая помощь приветствуется!


person nChetan    schedule 15.06.2017    source источник
comment
Зачем вообще нужно пытаться создать экземпляр XCUIElement? Я думаю, вам следует сделать scrollToElement статическим методом.   -  person AdamPro13    schedule 16.06.2017
comment
@AdamPro13 Хорошая идея, но внутри scrollToElement я использую метод swipeUp() из XCUIElement, поэтому его нельзя сделать статическим.   -  person nChetan    schedule 16.06.2017
comment
Вы не можете просто создать экземпляр XCUIElement, потому что они сопоставляются с существующими элементами пользовательского интерфейса. Если вы создали элемент, не связанный с пользовательским интерфейсом, вы ничего не сможете с ним сделать, потому что он ничего не знает.   -  person AdamPro13    schedule 16.06.2017
comment
Спасибо Адам! Я нашел решение, используя вместо этого XCUIApplication.   -  person nChetan    schedule 17.06.2017


Ответы (1)


Вы не можете инициализировать XCUIElements напрямую — вы должны получить к ним доступ через XCUIApplication, который является подклассом XCUIElement. Если вы вызовете свой метод прокрутки из XCUIApplication, он будет работать.

let app = XCUIApplication()
XCTAssertTrue(app.scrollToElement(app.tables.cells.staticTexts["Featured"]).exists)
person Oletha    schedule 16.06.2017
comment
Это сработало как шарм, ты мой спаситель. Я как-то не заметил, что XCUIApplication является подклассом XCUIElement. Большое спасибо! - person nChetan; 17.06.2017