我的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/
所以我可能注定要完成任务,但也许有人知道解决方法?
答案 0 :(得分:6)
您可以使用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中运行应用程序时,权限请求被延迟,或者如果特定测试未明确需要,您甚至可以停用它们。有关更多信息,请参阅此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删除了UIAutomation,因此只有在使用Xcode 7和iOS 7-9时才能继续使用InvokeUIA解决方法。参考文献:
答案 1 :(得分:0)
对于真实设备,您不需要任何这些设备。
{
app = ConfigureApp
.iOSAppBundle
.StartApp();
}
这段代码足够好,如果你将真实设备连接到系统,那么在运行前选择它。