Подтвердить что ты не робот

Можно ли перенести приложение из фона на передний план?

При запуске теста XCT UI можно проверить приложение в фоновом режиме на:

XCUIDevice().pressButton(XCUIDeviceButton.Home)

Возможно ли каким-либо образом вернуть приложение на передний план (активное состояние) без перезапуска приложения?

4b9b3361

Ответ 1

Обновление для Xcode 9: Начиная с Xcode 9, теперь вы можете просто вызывать activ activate() в любом приложении XCUIA.

let myApp = XCUIApplication()
myApp.activate() // bring to foreground

https://developer.apple.com/documentation/xctest/xcuiapplication/2873317-activate


Да, это. Но вам понадобятся частные заголовки XCUIElement (которые доступны через дамп заголовка с Facebook здесь). Для того, чтобы сделать приложение приоритетным, вам нужно вызвать метод resolve, который, как я считаю, разрешает запрос элемента (что для приложений означает приоритет приложения).

Для Swift вам придется импортировать XCUIElement.h в заголовок моста. Для Objective-C вам просто нужно импортировать XCUIElement.h.

С приложением в фоновом режиме:

Swift:

XCUIApplication().resolve()

Objective-C

[[XCUIApplication new] resolve];

Если это единственная необходимая вам функциональность, вы можете просто написать краткую категорию ObjC.

@interface XCUIElement (Tests)
- (void) resolve;
@end

Если вам нужно запустить/разрешить другое приложение. У Facebook есть пример этого, пройдя через трамплин.

Ответ 2

Как и в Xcode 8.3 и iOS 10.3, вы можете выполнить это с помощью Siri:

XCUIDevice.shared().press(XCUIDeviceButton.home)
XCUIDevice.shared().siriService.activate(voiceRecognitionText: "Open {appName}")

Включите @available(iOS 10.3, *) вверху файла вашего тестового набора, и вам должно быть хорошо идти!

Ответ 3

Если кому-то нужно просто переместить приложение обратно из фона, я написал (на основе ответа выше) категорию, которая действительно работает (большое спасибо, указав на FB git)

@implementation XCUIApplication(SpringBoard)

+ (instancetype)springBoard
{
    XCUIApplication * springboard  = [[XCUIApplication alloc] performSelector:@selector(initPrivateWithPath:bundleID:)
                                                                   withObject:nil
                                                                   withObject:@"com.apple.springboard"];




    [springboard performSelector:@selector(resolve) ];
    return springboard;
}

- (void)tapApplicationWithIdentifier:(NSString *)identifier
{
    XCUIElement *appElement = [[self descendantsMatchingType:XCUIElementTypeAny]
                           elementMatchingPredicate:[NSPredicate predicateWithFormat:@"identifier = %@", identifier]
                           ];
    [appElement tap];
}
@end

Ответ 4

Это то, что у меня есть в моем XCUITest, и оно работает как шарм (xcode 10.1 и тестовое устройство iPhone X 11.0)

func testWhwhat() {

//Вы тестируете шаги до тех пор, пока вам не понадобится фоновый фон для запуска

XCUIDevice.shared.press(XCUIDevice.Button.home)//Чтобы создать фоновое приложение XCUIApplication(). Activ()//Чтобы вернуть приложение обратно

//Вы продолжаете тестирование после того, как фоновый передний план был сделан. }

Ответ 5

Для Swift вам нужно объявить интерфейс закрытых методов XCUIApplication в Bridging-Header.h следующим образом:

@interface XCUIApplication (Private)
- (id)initPrivateWithPath:(NSString *)path bundleID:(NSString *)bundleID;
- (void)resolve;
@end

Затем вызовите resol() в ваших тестовых случаях, чтобы вернуть приложение:

XCUIApplication().resolve()