Xamarin UI Test单元测试点击按钮时应用闪退问题求助
问题现象
通过Visual Studio启动应用调试时,应用会被部署到路径 android/data/com.myapk.android 下,此时无论是手动点击安卓设备上的应用图标启动,还是通过调试模式在设备上启动应用,应用内所有按钮均可正常工作。
但通过Xamarin UITest启动同一应用、用单元测试模拟点击按钮操作时,应用会直接关闭;通过单元测试向文本框输入文本时应用不会出现关闭情况,无法定位问题产生原因。
相关代码
AppInitializer.cs
using System; using Xamarin.UITest; using Xamarin.UITest.Queries; namespace UITestSerio { public class AppInitializer { public static IApp StartApp(Platform platform) { if (platform == Platform.Android) { return ConfigureApp .Android .InstalledApp("XamarinNoapelReader.Android") //.ApkFile("C:/Users/a.butnaru/Documents/APK/XamarinNoapelReader.Android-Signed.apk") //.ConnectToApp(); .DeviceSerial("18261B2271") .StartApp(); } return ConfigureApp .iOS .StartApp(); } } }
Tests.cs
using System; using System.IO; using System.Linq; using NUnit.Framework; using Xamarin.UITest; using Xamarin.UITest.Queries; namespace UITestSerio { [TestFixture(Platform.Android)] public class Tests { IApp app; Platform platform; public Tests(Platform platform) //costruttore { this.platform = platform; } [SetUp] public void InizializzaApp() { app = AppInitializer.StartApp(platform); } [Test] public void OpenRepl() { app.Repl(); } [Test] public void PrintTextTest() { var device = app.Device; Assert.True(device.DeviceIdentifier == "18261B2271"); app.Tap("entryTest"); app.EnterText("lol asd asd"); app.DismissKeyboard(); app.WaitForElement(x => x.Marked("addLogo")); app.Tap(x => x.Marked("addLogo")); //app.TapCoordinates(360, 812); //app.TapCoordinates(360, 1136); app.Tap(x => x.Marked("addText")); /* app.Tap("addText"); app.Tap("getPrinted"); */ } } }
排查方案
- 修正包名配置:
InstalledApp()方法需要传入安卓应用的实际包名,格式一般为com.xxx.xxx,当前传入的XamarinNoapelReader.Android是项目名并非正式包名,会导致UITest关联应用进程失败、应用启动上下文异常,涉及组件跳转、资源访问的按钮点击时就会触发闪退。可以打开安卓项目下的AndroidManifest.xml文件,查看package属性值拿到正确包名替换即可。 - 提前授予运行时权限:UITest默认冷启动应用时不会自动授予运行时权限,代码中点击的
addLogo按钮一般对应选择本地图片/拍照功能,会触发存储、相机权限申请,权限校验不通过就会直接崩溃;文本输入不涉及权限调用,所以不会触发闪退。可以在StartApp()调用后加上app.GrantPermissions(),提前授予所有运行时权限再执行后续用例。 - 直接抓取崩溃日志定位:测试运行时执行
adb logcat *:E AndroidRuntime:E命令过滤系统错误日志,点击按钮应用关闭时会直接打印完整异常栈,能直接定位到触发崩溃的具体业务代码,排查效率远高于盲测。 - 确认测试包版本正确:Release版本默认关闭调试支持、本地网络权限(UITest依赖本地端口和应用建立通信),会导致测试框架注入异常,交互操作时触发崩溃。如果
InstalledApp启动方式不稳定,可以取消注释ApkFile配置项,直接指定Debug编译出的APK路径,让UITest自动安装正确版本的应用后再启动测试。
内容的提问来源于stack exchange,提问作者MrDra_
相关产品推荐
相关产品推荐

