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;
}