4

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

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

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

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

ответ

3

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

Вот 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], а не сдвиг кадра или пикселя. Нажатие самого элемента на координате тоже не работает, поэтому вы должны нажать на уровне надстройки/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; 
}