You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 09:51:17