如上所述,预期行为app.Query
只会返回页面上所有可见控件的结果。因此,如果控件不可见,app.Query
不会退货。
检索列表中所有数据的方法是使用后门方法。
Xamarin 有附加文件 https://learn.microsoft.com/appcenter/test-cloud/uitest/working-with-backdoors/?WT.mc_id=none-github-bramin关于如何在 UITest 中使用后门。
示例应用程序
此示例应用程序实现了教程中的片段:https://github.com/brminnick/UITestSampleApp https://github.com/brminnick/UITestSampleApp
Tutorial
1. 创建可序列化对象
由于后门方法仅限于返回字符串,因此我们需要能够序列化我们的对象。
您需要添加Newtonsoft.Json https://www.nuget.org/packages/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
将暴露 UITest 可以利用的 iOS 应用程序后门。
如果您没有 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
类(如果有的话)将暴露 UITest 可以利用的 Android 应用程序的后门。
如果您没有 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);
}