Xamarin.UITest:如何检索列表中的所有元素

我有一个500个元素的列表,当我在页面上使用app.Query时,Xamarin.UITest只给了我6个元素,因为在UI中只能看到6个元素。

如何从UITest内的列表中检索所有500个元素?

如上所述, app.Query的预期行为将仅返回页面上所有可见控件的结果。 因此,如果控件不可见, app.Query将不会返回它。

检索列表中所有数据的方法是使用后门方法。

Xamarin有关于如何在UITest中使用后门的附加文档 。

示例应用程序

此示例应用程序实现了教程中的代码段: https : //github.com/brminnick/UITestSampleApp

教程

1.创建可序列化对象

因为Backdoor方法仅限于返回一个字符串,所以我们需要能够序列化我们的对象。

您需要将Newtonsoft.Json NuGet包添加到每个项目中; 即将Newtonsoft.Json NuGet添加到.NET Standard项目,iOS项目,Android项目和UITest项目。

2.创建静态方法以序列化对象

这些方法将用于序列化和反序列化对象。

 using Newtonsoft.Json; public static class ConverterHelpers { public static string SerializeObject(object value) { return JsonConvert.SerializeObject(value); } public static T DeserializeObject(string value) { return JsonConvert.DeserializeObject(value); } } 

3.向AppDelegate添加后门方法

AppDelegate中的此方法将从您的iOS应用程序中公开UITest可以使用的后门。

如果您没有iOS应用程序,请跳过此步骤。

 [Export("getDataAsString:")] public NSString GetDataAsString(NSString noValue) { var data = [Add code here to retrieve the data from your app] var dataAsString = ConverterHelpers.SerializeObject(data); return new NSString(dataAsString); } 

4.将后门方法添加到MainActivity或Application类

MainActivity中的此方法(或Application类,如果有的话)将从您的Android应用程序中公开UITest可以使用的后门。

如果您没有Android应用,请跳过此步骤。

 [Export("GetDataAsString")] public string GetDataAsString() { var data = [Add code here to retrieve the data from your app] var listPageDataAsBase64String = ConverterHelpers.SerializeObject(data); return dataAsBase64String; } 

5.创建静态方法以从UITest调用后门

在UITest项目中创建一个静态方法,以从UITest调用后门方法。

 internal static List GetListData(IApp app) { string dataAsString; if (app is iOSApp) dataAsString = app.Invoke("getDataAsString:", "").ToString(); else dataAsString = app.Invoke("GetDataAsString").ToString(); return ConverterHelpers.DeserializeObject>(dataAsString); } 

6.从UITest调用后门

在UITest测试方法中,实现静态方法来检索数据。

 [Test] public void VerifyData() { Assert.IsTrue(GetListData(app).Count == 500); }