Xamarin 表单的后门(Android)
BackDoor for Xamarin Forms(Android)
我使用 Xamarin Forms(Android) 创建了应用程序。我创建了 xamarin ui 测试项目(Xamarin.UiTest = 1.3.7)。我需要使用后门。这是我的代码:
public class MainActivity : FormsApplicationActivity
{
....
[Java.Interop.Export("Test")]
public void Test() { }
}
是单元测试中的调用方法
app.Invoke("Test");
我得到这个异常:
20-04-2016 12:02:36.805 +03:00 - 72182 - Error while performing Invoke("Test", null)
Exception: System.Exception: Invoke for StartActivityTwo failed with outcome: ERROR
No such method found: Test()
in Xamarin.UITest.Android.AndroidGestures.Invoke(String methodName, Object[] arguments)
in Xamarin.UITest.Utils.ErrorReporting.With[T](Func`1 func, Object[] args, String memberName)
对于 Xamarin Android 项目,它的代码是有效的。
如何在 xamarin ui 测试 xamarin 表单项目时使用后门方法?是my test project on git.
在我们的 Xamarin.Forms
解决方案中工作正常,我会仔细检查您是否在 MainActivity
中导出方法(这是基于 Xamarin.Forms
的 Android 项目,你可以添加 casbash 后门)并执行 casbah WaitForElement
以确保在 Backdoor
调用发生之前主要 activity 是 运行。
使用基于 Default/Template 的快速测试 Forms
solution/project.
在Android(基于Xamarin.Forms`)项目:
复制树:
[[object CalabashRootView] > PhoneWindow$DecorView]
[ActionBarOverlayLayout] id: "decor_content_parent"
[FrameLayout > ... > LabelRenderer] id: "content"
[FormsTextView] text: "Welcome to Xamarin Forms!"
内 MainActivity
class:
[Activity (Label = "UITestBackDoorForms.Droid", Icon = "@drawable/icon", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
后门导出方法:
[Export("MyBackdoorMethod")]
public void MyBackdoorMethod()
{
System.Diagnostics.Debug.WriteLine("In through the backdoor - do some work");
}
在测试项目中:
[Test]
public void InvokeBackdoor()
{
// Wait for the Activity to load
app.WaitForElement(c => c.Marked("decor_content_parent"));
// Invoke the backdoor method MainActivity.MyBackDoorMethod
app.Invoke("MyBackdoorMethod");
}
LogCat 输出:
I/System.out( 5754): params: {json={"query":"* marked:'decor_content_parent'","operation":{"method_name":"query","arguments":[]}}
I/System.out( 5754): }
~~~
I/System.out( 5754): URI: /backdoor
I/System.out( 5754): params: {json={"method_name":"MyBackdoorMethod","arguments":[]}
I/System.out( 5754): }
~~~
I/mono-stdout( 5754): In through the backdoor - do some work
Xamarin Test Cloud Agent 将尝试按以下顺序查找方法:
后门程序
参考:https://developer.xamarin.com/guides/testcloud/uitest/working-with/backdoors/
The Xamarin Test Cloud Agent will try to locate the method in the following order:
- Android.App.Application子class.
- 当前activity.
- 根视图的上下文。
更新(用户提供的代码):
之前的测试代码:
[Test]
public void AppLaunches()
{
app.Repl();
//app.Screenshot("First screen.");
//Assert.IsTrue(true);
app.WaitForElement(c => c.Marked("action_bar_overlay_layout"));
app.Invoke("Test");
}
回复输出:
>>> tree
[[object CalabashRootView] > PhoneWindow$DecorView]
[ActionBarOverlayLayout] id: "decor_content_parent"
[FrameLayout > ... > Platform_DefaultRenderer] id: "content"
[ButtonRenderer]
[Button] text: "Test1"
[ButtonRenderer]
[Button] text: "Test2"
[ButtonRenderer]
[Button] text: "Test3"
问题:
1) 您正在等待一个名为 "action_bar_overlay_layout" 的元素,有一个名为 "decor_content_parent" 的 Activity 您可以等待。我倾向于使用通过 Repl 树的顶层输出显示的内容,它最容易匹配并让其他人跟随。
2) 您试图调用导出为 Test
的方法,但在 MainActivity.as
中它被标记为 [Export("MyBackdoorMethod")]
.
之后的代码更改:
[Test]
public void AppLaunches()
{
app.Repl();
app.WaitForElement(c => c.Marked("decor_content_parent"));
app.Invoke("MyBackdoorMethod");
}
运行再次测试成功,你的调试输出被写入logcat
.
Logcat:
I/mono-stdout( 8641): In through the backdoor - do some work
我使用 Xamarin Forms(Android) 创建了应用程序。我创建了 xamarin ui 测试项目(Xamarin.UiTest = 1.3.7)。我需要使用后门。这是我的代码:
public class MainActivity : FormsApplicationActivity
{
....
[Java.Interop.Export("Test")]
public void Test() { }
}
是单元测试中的调用方法
app.Invoke("Test");
我得到这个异常:
20-04-2016 12:02:36.805 +03:00 - 72182 - Error while performing Invoke("Test", null)
Exception: System.Exception: Invoke for StartActivityTwo failed with outcome: ERROR
No such method found: Test()
in Xamarin.UITest.Android.AndroidGestures.Invoke(String methodName, Object[] arguments)
in Xamarin.UITest.Utils.ErrorReporting.With[T](Func`1 func, Object[] args, String memberName)
对于 Xamarin Android 项目,它的代码是有效的。
如何在 xamarin ui 测试 xamarin 表单项目时使用后门方法?是my test project on git.
在我们的 Xamarin.Forms
解决方案中工作正常,我会仔细检查您是否在 MainActivity
中导出方法(这是基于 Xamarin.Forms
的 Android 项目,你可以添加 casbash 后门)并执行 casbah WaitForElement
以确保在 Backdoor
调用发生之前主要 activity 是 运行。
使用基于 Default/Template 的快速测试 Forms
solution/project.
在Android(基于Xamarin.Forms`)项目:
复制树:
[[object CalabashRootView] > PhoneWindow$DecorView]
[ActionBarOverlayLayout] id: "decor_content_parent"
[FrameLayout > ... > LabelRenderer] id: "content"
[FormsTextView] text: "Welcome to Xamarin Forms!"
内 MainActivity
class:
[Activity (Label = "UITestBackDoorForms.Droid", Icon = "@drawable/icon", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
后门导出方法:
[Export("MyBackdoorMethod")]
public void MyBackdoorMethod()
{
System.Diagnostics.Debug.WriteLine("In through the backdoor - do some work");
}
在测试项目中:
[Test]
public void InvokeBackdoor()
{
// Wait for the Activity to load
app.WaitForElement(c => c.Marked("decor_content_parent"));
// Invoke the backdoor method MainActivity.MyBackDoorMethod
app.Invoke("MyBackdoorMethod");
}
LogCat 输出:
I/System.out( 5754): params: {json={"query":"* marked:'decor_content_parent'","operation":{"method_name":"query","arguments":[]}}
I/System.out( 5754): }
~~~
I/System.out( 5754): URI: /backdoor
I/System.out( 5754): params: {json={"method_name":"MyBackdoorMethod","arguments":[]}
I/System.out( 5754): }
~~~
I/mono-stdout( 5754): In through the backdoor - do some work
Xamarin Test Cloud Agent 将尝试按以下顺序查找方法:
后门程序
参考:https://developer.xamarin.com/guides/testcloud/uitest/working-with/backdoors/
The Xamarin Test Cloud Agent will try to locate the method in the following order:
- Android.App.Application子class.
- 当前activity.
- 根视图的上下文。
更新(用户提供的代码):
之前的测试代码:
[Test]
public void AppLaunches()
{
app.Repl();
//app.Screenshot("First screen.");
//Assert.IsTrue(true);
app.WaitForElement(c => c.Marked("action_bar_overlay_layout"));
app.Invoke("Test");
}
回复输出:
>>> tree
[[object CalabashRootView] > PhoneWindow$DecorView]
[ActionBarOverlayLayout] id: "decor_content_parent"
[FrameLayout > ... > Platform_DefaultRenderer] id: "content"
[ButtonRenderer]
[Button] text: "Test1"
[ButtonRenderer]
[Button] text: "Test2"
[ButtonRenderer]
[Button] text: "Test3"
问题:
1) 您正在等待一个名为 "action_bar_overlay_layout" 的元素,有一个名为 "decor_content_parent" 的 Activity 您可以等待。我倾向于使用通过 Repl 树的顶层输出显示的内容,它最容易匹配并让其他人跟随。
2) 您试图调用导出为 Test
的方法,但在 MainActivity.as
中它被标记为 [Export("MyBackdoorMethod")]
.
之后的代码更改:
[Test]
public void AppLaunches()
{
app.Repl();
app.WaitForElement(c => c.Marked("decor_content_parent"));
app.Invoke("MyBackdoorMethod");
}
运行再次测试成功,你的调试输出被写入logcat
.
Logcat:
I/mono-stdout( 8641): In through the backdoor - do some work