it-roy-ru.com

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

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

XCUIDevice().pressButton(XCUIDeviceButton.Home)

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

13
PistolPete

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

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

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


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

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

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

Swift:

XCUIApplication().resolve()

Objective-C

[[XCUIApplication new] resolve];

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

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

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

4
Chase Holland

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

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

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

4
brandenbyers

Если кому-то нужно просто вернуть приложение из фона, я написал (основываясь на ответе выше) категорию, которая действительно работает (большое спасибо за указание на 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
1
alexdmukh

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

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

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

XCUIApplication().resolve()
0
Alex Bin Zhao