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

Bra*_*ick 2 c# xamarin.ios xamarin.android xamarin xamarin.uitest

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

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

Bra*_*ick 7

如上所述,预期的行为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<T>(string value)
    {
        return JsonConvert.DeserializeObject<T>(value);
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

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 dataAsBase64String = ConverterHelpers.SerializeObject(data);

    return dataAsBase64String;
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

6.从UITest调用后门

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

[Test]
public void VerifyData()
{
    Assert.IsTrue(GetListData(app).Count == 500);
}
Run Code Online (Sandbox Code Playgroud)