4

我开始对 EarlGrey 进行一些试验,现在已经使用 XCUITest 进行了几个月的 UI 测试。我遇到了无法消除系统警报的经典问题,这很奇怪,因为看起来 Google 为系统警报实现了一个匹配器,称为 gray_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 代码基本上完成了我在中断监视器中所做的工作):Xcode 7 UI Testing: how to dismiss a series of system alerts in code

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

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

4

4 回答 4

5

正如 gray_systemAlertViewShown 的文档所指出的那样, gray_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 无法拒绝警告视图。可以关闭应用程序启动的警报视图。常见问题解答中有一个问题表明如果存在模式对话框,EarlGrey 测试将失败。

于 2016-02-24T00:58:06.167 回答
2

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

就像是:

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

在你打电话之前

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

这样,“您要允许推送通知...”警报将不会显示。

于 2017-02-13T20:12:59.493 回答
1

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

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

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

brew tap wix/brew

brew install applesimutils

并授予权限

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


有关更多信息和示例,请参阅

https://github.com/wix/AppleSimulatorUtils

于 2019-09-04T10:52:41.573 回答
0

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

//使用上面的代码它可能对你的问题有用

于 2018-12-07T09:58:55.767 回答