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
一起使用时,它正在启动(仍在请求权限)。
但是当我使用 DeviceIdentifier
和 AppBundle
时,出现了与上面相同的错误。
我的测试在测试云上运行良好。他们在模拟器上运行良好。
当我手动部署到设备、启动应用程序并批准权限然后 运行 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.
我们使用这个来确认系统对话框:
private Query ConfirmLocalNetworkPermissionDialogButton
=> AppInitializer.Platform == Platform.iOS
? new Query(x => x.ClassFull("_UIAlertControllerActionView").Marked("OK"))
: x => x.Class("AppCompatButton").Marked("button1");
我的 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
一起使用时,它正在启动(仍在请求权限)。
但是当我使用 DeviceIdentifier
和 AppBundle
时,出现了与上面相同的错误。
我的测试在测试云上运行良好。他们在模拟器上运行良好。 当我手动部署到设备、启动应用程序并批准权限然后 运行 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.
我们使用这个来确认系统对话框:
private Query ConfirmLocalNetworkPermissionDialogButton
=> AppInitializer.Platform == Platform.iOS
? new Query(x => x.ClassFull("_UIAlertControllerActionView").Marked("OK"))
: x => x.Class("AppCompatButton").Marked("button1");