2

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

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

4

2 回答 2

8

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

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

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

示例应用

此示例应用程序实现了教程中的片段: 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会暴露一个 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类中添加Backdoor Method

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);
}
于 2016-12-30T19:22:37.760 回答
0

对于仍然在问这个问题的任何人,现在有一个AppQuery.All可以更改查询以返回所有元素,而不仅仅是可见的元素。

于 2019-07-31T12:17:29.957 回答