我有一个应用程序,我正在尝试放置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}
}
}
但是,它在我的启动画面中触发,我需要它获得对我实际主活动的引用,而不是我的启动活动。如何在后门方法中获取对主活动的引用?
Xamarin 后门文档:https://developer.xamarin.com/recipes/testcloud/start-activity-with-backdoor/https://developer.xamarin.com/guides/testcloud/uitest/working-with/backdoors/
根据 Android 后门方法指南,它不能返回object
类型,只能返回 string
、 Java.Lang.String
或 void
。请参阅:https://developer.xamarin.com/guides/testcloud/uitest/working-with/backdoors/
您不想像指南中那样从后门开始下一个活动吗?如果是这样,只需按照您更紧密链接的指南进行操作即可。
此外,只需仔细检查并从BackDoor
方法返回object
在生成时失败,并带有 NullReferenceException。但是,对于"{魔术代码获取对 MainActivity 实例的引用到此处}",您可以执行以下操作:
ActivityManager am = (ActivityManager)this.GetSystemService(Context.ActivityService);
var myActivity = am.GetRunningTasks(1)[0].TopActivity;
myActivity
将是对最顶级活动的引用,但无论如何都无法从 BackDoor 方法返回它。当然,您可以返回字符串描述。我不知道为什么你需要在测试代码中引用该活动,因为在测试代码中你可以用它做很多事情。
如何检索当前活动
要检索MainActivity
,您可以使用@JamesMontemagno的CurrentActivityPlugin。
将当前活动 NuGet 包添加到 Xamarin.Android 项目中,然后在 Xamarin.Android 项目中,可以使用以下代码行检索当前活动并检查它是否为 MainActivity。
Activity currentActivity = Plugin.CurrentActivity.CrossCurrentActivity.Current.Activity as MainActivity;
if (!(currentActivity is MainActivity))
throw new System.Exception("Current Activity is not MainActivity");
这个插件在 GitHub 上是开源的。