XCUITest и виджет сегодня

У меня есть приложение с виджетом сегодня. Поэтому я хотел бы провести на нем тестирование пользовательского интерфейса.

Я нашел способ открыть панель "Сегодня / Уведомления". Это кажется легким:

let statusBar = XCUIApplication().statusBars.elementBoundByIndex(0)
statusBar.swipeDown()

Но тогда я не могу найти способ сделать что-то полезное. Можно записывать взаимодействия пользовательского интерфейса в панели "Сегодня / Уведомления", но такой код не может воспроизвести мои действия.

2 ответа

Сначала вам нужно открыть Today View, вы можете использовать этот способ:

    let app = XCUIApplication()
    // Open Notification Center
    let bottomPoint = app.coordinate(withNormalizedOffset: CGVector(dx: 0, dy: 2))
    app.coordinate(withNormalizedOffset: CGVector(dx: 0, dy: 0)).press(forDuration: 0.1, thenDragTo: bottomPoint)
    // Open Today View
    let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard")
    springboard.scrollViews.firstMatch.swipeRight()

Затем, чтобы получить доступ ко всему, что вам нужно, просто используйте springboard, например:

let editButton = springboard.buttons["Edit"]

Есть похожая проблема тестирования расширений. Я обнаружил, что вам нужно нажать на элемент в том месте, где он находится на экране, а не на сам элемент, чтобы управлять взаимодействием. Я не проверял это по вашему сценарию, но пока не нашел ничего неприкасаемого с помощью этого метода.

Вот Swift пример нажатия кнопки "X" на трамплине для значка приложения, который аналогичным образом не может быть нажат при обычном взаимодействии:

let iconFrame = icon.frame // App icon on the springboard
let springboardFrame = springboard.frame // The springboard (homescreen)
icon.pressForDuration(1.3) // tap and hold

// Tap the little "X" button at approximately where it is. The X is not exposed directly
springboard.coordinateWithNormalizedOffset(CGVectorMake((iconFrame.minX + 3) / springboardFrame.maxX, (iconFrame.minY + 3) / springboardFrame.maxY)).tap()

Получив кадр суперпредставления и подпредставления, вы можете рассчитать, где на экране должен быть элемент. Обратите внимание, что coordinateWithNormalizedOffset принимает вектор в диапазоне [0,1], а не смещение кадра или пикселя. Прикосновение к самому элементу по координатам также не работает, поэтому вы должны нажать на слой superview / XCUIApplication().

Более обобщенный пример:

let myElementFrame = myElement.frame
let appFrame = XCUIApplication().frame
let middleOfElementVector = CGVectorMake(iconFrame.midX / appFrame.maxX, iconFrame.midY / appFrame.maxY)

// Tap element from the app-level at the given coordinate
XCUIApplication().coordinateWithNormalizedOffset(middleOfElementVector).tap()

Если вам нужно получить доступ к слою Springboard и выйти за пределы приложения, вы можете сделать это с помощью:

let springboard = XCUIApplication(privateWithPath: nil, bundleID: "com.apple.springboard")
springboard.resolve()

Но вам нужно представить некоторые частные методы XCUITest с Objective-C:

@interface XCUIApplication (Private) {
    - (id)initPrivateWithPath:(id)arg1 bundleID:(id)arg2;
}

@interface XCUIElement (Private) {
    - (void) resolve;
}
Другие вопросы по тегам