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
一起使用时,它正在启动(仍在请求权限)。
但是当我使用DeviceIdentifier
和AppBundle
时,出现了与上述相同的错误。
我的测试在 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 时有没有办法让应用程序选择语言或文化