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
类型,只能 string
、Java.Lang.String
或 void
。参见: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。
我有一个应用程序正在尝试对其进行 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
类型,只能 string
、Java.Lang.String
或 void
。参见: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。