Как запустить системные приложения в тестовом примере iOS Xcode UI
у меня есть приложение, основной целью которого является ввод данных в аптечку. Я хотел бы написать несколько тестов Xcode UI, чтобы убедиться, что он успешно пишет эти данные, но у меня возникли некоторые трудности с проверкой данных в приложении Health.
когда я первоначально записал свой тест, он пропустил мою имитацию нажатия кнопки "Домой", но он записывался, когда я перешел на первый домашний экран и перешел в приложение "Здоровье", чтобы показать точки данных.
Я искал как нажмите кнопку "Домой" и найдите это (что работает):
XCUIDevice.sharedDevice().pressButton(.Home)
однако ни один из других вызовов, записанных на самом деле не работает для навигации за пределами приложения. Записанный код для прокрутки на главном экране явно выглядит неправильно, а также не работает, когда я заменяю tap()
С swipeRight()
или swipeLeft()
:
app.childrenMatchingType(.Window).elementBoundByIndex(1).childrenMatchingType(.Other).elementBoundByIndex(1).childrenMatchingType(.Other).element.childrenMatchingType(.Other).element.childrenMatchingType(.Other).elementBoundByIndex(0).childrenMatchingType(.ScrollView).element.tap()
следующие несколько строк, для запуска приложения на главном экране, даже не работают для значка приложения, который в настоящее время виден страница:
let elementsQuery = app.scrollViews.otherElements
elementsQuery.icons["Health"].tap()
есть ли способ достичь того, что я пытаюсь сделать, или мне нужно подождать, чтобы проверить сквозное тестирование, пока я не добавлю возможность чтения из HealthKit в мое приложение?
3 ответов
Xcode 9
вот решение с использованием Xcode 9
let messageApp = XCUIApplication(bundleIdentifier: "com.apple.MobileSMS")
messageApp.activate()
вы можете найти список идентификаторов пакетов для системных приложений в этот пост
Xcode 8
для Xcode 8 это немного сложнее Для запуска приложения с трамплина необходимо импортировать следующее заголовки
https://github.com/facebook/WebDriverAgent/blob/master/PrivateHeaders/XCTest/XCUIElement.h https://github.com/facebook/WebDriverAgent/blob/master/PrivateHeaders/XCTest/XCUIApplication.h
затем используйте следующее (например, со здоровьем)
С
@interface Springboard : NSObject
+ (void)launchHealth;
@end
@implementation Springboard
+ (void)launchHealth
{
XCUIApplication *springboard = [[XCUIApplication alloc] initPrivateWithPath:nil bundleID:@"com.apple.springboard"];
[springboard resolve];
XCUIElement *icon = springboard.icons[@"Health"];
if (icon.exists) {
[icon tap];
// To query elements in the Health app
XCUIApplication *health = [[XCUIApplication alloc] initPrivateWithPath:nil bundleID:@"com.apple.Health"];
}
}
@end
Свифт
class Springboard {
static let springboard = XCUIApplication(privateWithPath: nil, bundleID: "com.apple.springboard")
class func launchHealth() {
springboard.resolve()
let icon = springboard.icons["Health"]
if icon.exists {
icon.tap()
// To query elements in the Health app
let health = XCUIApplication(privateWithPath: nil, bundleID: "com.apple.Health")
}
}
}
вы ограничены тестов пользовательского интерфейса с приложения и в момент, когда вы нажимаете кнопку Home и выйти из приложения пользовательского интерфейса, вы не можете выполнять операции пользовательского интерфейса приложения переменной в код, указывающий на приложение.
у вас может быть код, например
let app = XCUIApplication()
поэтому вы должны изменить эту строку XCUIApplication ().
let app = XCUIApplication(privateWithPath: nil, bundleID: "com.apple.springboard")
теперь вы можете выйти из приложения.
согласно моему знанию хорошо иметь и независимый UITestAgent приложение и инициировать его UiTestcases с springboard bundle id, так что вы можете проверить любое приложение с помощью этого приложения не так, как я закодировал некоторый тестовый случай внутри продукта XYZ код базы и для следующего продукта ABC я напишу тесты внутри ABC код базы продукта!