Как запустить системные приложения в тестовом примере 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")
        }
    }
}

Swift 4

let app = XCUIApplication(bundleIdentifier: "com.apple.springboard")

вы ограничены тестов пользовательского интерфейса с приложения и в момент, когда вы нажимаете кнопку Home и выйти из приложения пользовательского интерфейса, вы не можете выполнять операции пользовательского интерфейса приложения переменной в код, указывающий на приложение.

у вас может быть код, например

let app = XCUIApplication()

поэтому вы должны изменить эту строку XCUIApplication ().

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

теперь вы можете выйти из приложения.

согласно моему знанию хорошо иметь и независимый UITestAgent приложение и инициировать его UiTestcases с springboard bundle id, так что вы можете проверить любое приложение с помощью этого приложения не так, как я закодировал некоторый тестовый случай внутри продукта XYZ код базы и для следующего продукта ABC я напишу тесты внутри ABC код базы продукта!