Xamarin.UITests - 在真实设备上测试 - iOS - 应用权限弹出窗口问题

Xamarin.UITests - testing on real device - iOS - app permissions popups issue

我的 iOS 应用需要一些权限(GPS、推送通知)。 当应用程序首次启动时 iOS 询问用户是否可以将这些权限授予应用程序。 我已经编写了一些 UI 测试,并希望在本地连接 iPhone.

上自动执行 运行 测试

问题是我无法覆盖权限问题并且我的测试失败了。 我发现由 IDE (Xamarin Studio) 部署的应用程序会请求权限,但通过 UITests 部署的应用程序不会。 所以我尝试使用 .AppBundle(path_to_app) 但它说这仅对部署到模拟器有效。

SetUp : System.Exception : This app bundle is not valid for running on a simulator. To fix this issue please ensure that your target device is a simulator. DTPlatformName is 'iphoneos', not 'iphonesimulator' in the apps Info.plist.

就像它正在尝试将 iPhone 应用程序部署到模拟器。但是 Xamarin Studio 中的 Target 设置为真实设备。 我尝试添加 .DeviceIdentifier。当与 .InstalledApp 一起使用时,它正在启动(仍在请求权限)。 但是当我使用 DeviceIdentifierAppBundle 时,出现了与上面相同的错误。

我的测试在测试云上运行良好。他们在模拟器上运行良好。 当我手动部署到设备、启动应用程序并批准权限然后 运行 UI 测试时,它们工作正常。

我无法实现的是UI测试覆盖真实设备上的权限问题。 有人做过这个吗?

最后一件事是我在 AppBundle 方法的文档中找到的 "Will force a run on simulator" https://developer.xamarin.com/api/member/Xamarin.UITest.Configuration.iOSAppConfigurator.AppBundle/p/System.String/

所以我可能注定无法完成这项任务,但也许有人知道解决方法?

对于真实设备,您不需要任何这些。

    {
app = ConfigureApp
                    .iOSAppBundle 
                    .StartApp();
}

这段代码已经足够好了,如果你是将真实设备连接到系统,那么select之前运行。

您可以使用 InvokeUIA 关闭带有 UITest 的系统对话框。下面的测试通过点击 iOS 系统警报的 "OK" 按钮进行:

[Test]
public void AppLaunches ()
{
    app.Screenshot ("First screen.");
    app.InvokeUia ("uia.query('[:view {:marked \"OK\"}]')"); 
    app.InvokeUia ("uia.tapMark(\"OK\")"); 
}

此处还提供了一个可用的示例应用程序和 UITest: https://github.com/King-of-Spades/InvokeUia-for-System-Dialogs

有关 Test Cloud 中系统对话框的警告

您在 Test Cloud 中没有看到此问题的原因是因为 Test Cloud 自动消除了系统警报;所以通常你不必担心它。但是,如果您的警报启动得太早;以便它在自动化完全启动您的应用程序之前出现,然后它将无法检测并关闭警报并导致您的测试失败。

因此,您要确保当 运行 您的应用程序在 Test Cloud 中时,权限请求被延迟,或者如果特定测试没有明确需要它们,您甚至可以停用它们。本 Calabash 指南中提供了更多信息:https://github.com/calabash/calabash-ios/wiki/Managing-Privacy-Alerts%3A--Location-Services%2C-APNS%2C-Contacts

(即使是 Calabash,您也可以在 UITest 中使用相同的策略;尽管使用的是 C# 语法。)

更新 Xcode 8 / iOS 10

Xcode 8 / iOS 10 删除了 UIAutomation,因此 InvokeUIA 解决方法只有在您使用 Xcode 7 和 iOS 7- 9.参考文献:

我们使用它在 iPhone 上执行 UI 测试:

ConfigureApp.iOS.InstalledApp("com.appcenter.UITestDemo").StartApp();

InstalledApp requires you to build an IPA using the Debug configuration & a valid provisioning profile, and preinstalling it on the target device.

https://github.com/microsoft/appcenter-Xamarin.UITest-Demo/blob/main/UITestDemo.UITest/AppInitializer.cs

我们使用这个来确认系统对话框:

 private Query ConfirmLocalNetworkPermissionDialogButton
            => AppInitializer.Platform == Platform.iOS
             ? new Query(x => x.ClassFull("_UIAlertControllerActionView").Marked("OK"))
             : x => x.Class("AppCompatButton").Marked("button1");