Xamarin.UITest 带有启动画面的后门

Xamarin.UITest Backdoor with Splash Screen

我有一个应用程序正在尝试对其进行 Xamarin UI 测试。我需要后门应用程序以绕过我的登录过程。 我的后门方法可以正常运行。

[Activity(Label = "AppName", Icon = "@drawable/icon", Theme = "@style/Theme.Splash", MainLauncher = true, NoHistory = true)]
public class SplashActivity : Activity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        StartActivity(typeof(MainActivity));
    }

    [Java.Interop.Export("BackDoor")] 
    public void BackDoor()
    {
        var myActivity = {Magic code to get reference to the the instance of MainActivity goes here} 


    }

}

但是它在我的初始屏幕中触发,我需要它获得对我的实际 MainActivity 而不是我的 SplashActivity 的引用。如何在我的 BackDoor 方法中获取对 MainActivity 的引用?

Xamarin 后门文档: https://developer.xamarin.com/recipes/testcloud/start-activity-with-backdoor/ https://developer.xamarin.com/guides/testcloud/uitest/working-with/backdoors/

根据 Android 的后门方法指南,它不能 return object 类型,只能 stringJava.Lang.Stringvoid。参见:https://developer.xamarin.com/guides/testcloud/uitest/working-with/backdoors/

你不想像指南中那样从后门开始下一个 Activity 吗?如果是这样,请按照您更紧密链接的指南进行操作。

此外,只需仔细检查并从 BackDoor 方法 returning object 构建失败并出现 NullReferenceException。但是,对于“{获取对 MainActivity 实例的引用的魔术代码在此处}”,您可以这样做:

ActivityManager am = (ActivityManager)this.GetSystemService(Context.ActivityService);
var myActivity = am.GetRunningTasks(1)[0].TopActivity;

myActivity 将是对最顶层 activity 的引用,但无论如何您不能从 BackDoor 方法中 return 它。您当然可以 return 字符串描述。我不知道为什么您需要在测试代码中引用 activity,因为在测试代码中您无能为力。

如何检索当前 Activity

要检索 MainActivity,您可以使用 @JamesMontemagno 的 CurrentActivity 插件。

Current Activity NuGet Package 添加到您的 Xamarin.Android 项目中,然后,在您的 Xamarin.Android 项目中,您可以使用以下代码行来检索当前的 activity并检查它是 MainActivity.

Activity currentActivity = Plugin.CurrentActivity.CrossCurrentActivity.Current.Activity as MainActivity;

if (!(currentActivity is MainActivity))
    throw new System.Exception("Current Activity is not MainActivity");

这个插件是open-sourced on GitHub