是否可以使用 EarlGrey(iOS UI 测试)关闭系统警报?

Is it possible to dismiss System Alerts using EarlGrey (iOS UI Testing)?

我开始对 EarlGrey 进行一些试验,现在已经使用 XCUITest 进行了 UI 测试几个月了。我 运行 遇到了无法关闭系统警报的经典问题,这很奇怪,因为它看起来好像 Google 实现了一个名为 grey_systemAlertViewShown() 的系统警报匹配器。我正在尝试使用 GREYCondition 检测系统警报。这是我尝试过的:

    - (void)waitForAndDismissSystemAlertForSeconds:(NSInteger)seconds {
    GREYCondition *interactableCondition = [GREYCondition conditionWithName:@"isInteractable" block:^BOOL{
        // Fails if element is not interactable
        NSError *error;
        [[EarlGrey selectElementWithMatcher:grey_systemAlertViewShown()] assertWithMatcher:grey_interactable() error:&error];

        if (error) {
            return NO;
        } else {
            NSError *allowButtonError;
            [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@"Allow")] assertWithMatcher:grey_notNil() error:&allowButtonError];
            if (!allowButtonError) {
                [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@"Allow")] performAction:grey_tap()];
               }

        return YES;
    }];

    [interactableCondition waitWithTimeout:seconds];
}

我也试过使用 addUIInterruptionMonitorWithDescription ,如这里所述(但使用 EarlGrey 代码来基本上完成我在中断监视器中所做的事情):

这两种方法都不起作用。对于我的 GREYCondition 中的非错误情况,断点不会触发,中断监视器也不会解除我的警报。

有人知道 EarlGrey 是否支持关闭系统警报吗?

由于 grey_systemAlertViewShown indicate 的文档,grey_systemAlertViewShown 仅检查是否显示系统警报视图。 API 的更好用法是断言未显示系统警报(可能是因为测试应用程序模拟了导致系统警报的代码)。

Code that taps a button that requests causes system alert to be shown (for ex: requests user's geo location) comes here...
// Assert that in the test app system alert view is not shown because we have mocked out the part of code that requests user location.
[[EarlGrey selectElementWithMatcher:grey_anything()] assertWithMatcher:grey_not(grey_systemAlertViewShown())];

在撰写本文时,EarlGrey 无法消除系统警报视图。应用程序启动的警报视图可以被关闭。 FAQ 有一个问题表明,如果模式对话框存在,EarlGrey 测试将失败。

我们发现解决此问题的最佳方法是包含用于测试的启动参数,在该参数中我们不会注册应用程序以获取通知。

类似于:

if [[[NSProcessInfo processInfo] arguments] containsObject:argument] { return; }

在你打电话之前

[[UIApplication sharedApplication] registerUserNotificationSettings:settings]; [[UIApplication sharedApplication] registerForRemoteNotifications];

这样,"Do you want to allow push notifications..." 警报将不会显示。

EarlGreyImpl.invoked(fromFile: #file, lineNumber: #line).selectElement(with: grey_text("Click")).perform(grey_tap())

//使用上面的代码可能会解决你的问题

可以使用 AppleSimulatorUtils 实用程序授予所有必需的权限。

这种方法消除了关闭警报的需要并节省了时间。

通过在终端应用程序中输入下一个命令来安装实用程序

brew tap wix/brew

brew install applesimutils

并授予

权限

applesimutils --byId <simulator UDID> --bundle <bundle identifier> --setPermissions "notifications=YES"


更多信息和例子请参考

https://github.com/wix/AppleSimulatorUtils