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

Posted

技术标签:

【中文标题】Xamarin.UITests - 在真实设备上进行测试 - iOS - 应用权限弹出窗口问题【英文标题】:Xamarin.UITests - testing on real device - iOS - app permissions popups issue 【发布时间】:2016-06-07 07:26:19 【问题描述】:

我的 ios 应用需要一些权限(GPS、推送通知)。 当应用程序第一次启动时,iOS 会询问用户是否可以将这些权限授予应用程序。 我已经编写了一些 UITests,并希望在本地连接的 iPhone 上自动运行它们。

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

SetUp : System.Exception : 此应用程序包无法在其上运行 一个模拟器。要解决此问题,请确保您的目标设备 是一个模拟器。 DTPlatformName 是“iphoneos”,而不是“iphonesimulator” 应用程序 Info.plist。

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

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

我无法实现的是让 UITests 覆盖真实设备上的权限问题。 有人做过这项工作吗?

最后一件事是我发现在 AppBundle 方法的文档中 “将强制在模拟器上运行” https://developer.xamarin.com/api/member/Xamarin.UITest.Configuration.iOSAppConfigurator.AppBundle/p/System.String/

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

【问题讨论】:

您找到解决方案了吗? 【参考方案1】:

您可以使用 InvokeUIA 通过 UITest 关闭系统对话框。通过点击 iOS 系统警报的“确定”按钮进行以下测试:

[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 中运行您的应用程序时,权限请求会延迟,或者如果特定测试没有明确需要权限,您甚至可以停用它们。此葫芦指南中提供了更多信息: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 时才能继续使用。参考资料:

UITest:https://developer.xamarin.com/guides/testcloud/UITest/xcode7/ 葫芦:https://developer.xamarin.com/guides/testcloud/calabash/xcode7/#Automation_API

【讨论】:

“即使它是 Calabash...” - 有人可以指出 C# 中用于 UITest 的语法是什么吗?【参考方案2】:

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

    
app = ConfigureApp
                    .iOSAppBundle 
                    .StartApp();

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

【讨论】:

【参考方案3】:

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

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

InstalledApp 要求您使用 Debug 构建 IPA 配置和有效的配置文件,并将其预安装在 目标设备。

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");

【讨论】:

以上是关于Xamarin.UITests - 在真实设备上进行测试 - iOS - 应用权限弹出窗口问题的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.UITests ApkFile 或 InstalledApp 尚未在 VS 中配置

Xamarin UITests:Calabash 未链接

运行 Xamarin.UITests 时有没有办法让应用程序选择语言或文化

如何在 Xamarin UITests 获取列表视图项的计数

text 在真实设备上进行离子调试

如何在使用 Xamarin for Visual Studio 的真实 Android 设备上进行调试?