是否可以使用 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"
更多信息和例子请参考
我开始对 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"
更多信息和例子请参考