При запуске теста XCT UI можно проверить приложение в фоновом режиме на:
XCUIDevice().pressButton(XCUIDeviceButton.Home)
Возможно ли каким-либо образом вернуть приложение на передний план (активное состояние) без перезапуска приложения?
При запуске теста XCT UI можно проверить приложение в фоновом режиме на:
XCUIDevice().pressButton(XCUIDeviceButton.Home)
Возможно ли каким-либо образом вернуть приложение на передний план (активное состояние) без перезапуска приложения?
Обновление для 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 есть пример этого, пройдя через трамплин.
Как и в Xcode 8.3 и iOS 10.3, вы можете выполнить это с помощью Siri:
XCUIDevice.shared().press(XCUIDeviceButton.home)
XCUIDevice.shared().siriService.activate(voiceRecognitionText: "Open {appName}")
Включите @available(iOS 10.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
Это то, что у меня есть в моем XCUITest, и оно работает как шарм (xcode 10.1 и тестовое устройство iPhone X 11.0)
func testWhwhat() {
//Вы тестируете шаги до тех пор, пока вам не понадобится фоновый фон для запуска
XCUIDevice.shared.press(XCUIDevice.Button.home)//Чтобы создать фоновое приложение XCUIApplication(). Activ()//Чтобы вернуть приложение обратно
//Вы продолжаете тестирование после того, как фоновый передний план был сделан. }
Для Swift вам нужно объявить интерфейс закрытых методов XCUIApplication в Bridging-Header.h следующим образом:
@interface XCUIApplication (Private)
- (id)initPrivateWithPath:(NSString *)path bundleID:(NSString *)bundleID;
- (void)resolve;
@end
Затем вызовите resol() в ваших тестовых случаях, чтобы вернуть приложение:
XCUIApplication().resolve()