我有500个元素的列表,当我在页面上使用app.Query
时,Xamarin.UITest仅给我6个元素,因为UI中只有6个元素可见。
如何从UITest内的列表中检索所有500个元素?
最佳答案
如上所述,app.Query
的预期行为将仅返回页面上所有可见控件的结果。因此,如果控件不可见,app.Query
将不会返回它。
检索列表中所有数据的方法是使用后门方法。
Xamarin有关如何在UITest中使用后门的内容additional documentation。
示例应用
此示例应用程序实现了教程中的片段:
https://github.com/brminnick/UITestSampleApp
讲解
1.创建一个可序列化的对象
由于后门方法仅限于返回字符串,因此我们需要能够序列化我们的对象。
您将需要将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<T>(string value)
{
return JsonConvert.DeserializeObject<T>(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.将Backdoor方法添加到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 dataAsBase64String = ConverterHelpers.SerializeObject(data);
return dataAsBase64String;
}
5.创建静态方法以从UITest调用后门
在UITest项目中创建一个静态方法,以从UITest调用后门方法。
internal static List<DataModel> GetListData(IApp app)
{
string dataAsString;
if (app is iOSApp)
dataAsString = app.Invoke("getDataAsString:", "").ToString();
else
dataAsString = app.Invoke("GetDataAsString").ToString();
return ConverterHelpers.DeserializeObject<List<DataModel>>(dataAsString);
}
6.从UITest调用后门
在UITest测试方法中,实现静态方法以检索数据。
[Test]
public void VerifyData()
{
Assert.IsTrue(GetListData(app).Count == 500);
}