Xamarin.UITest: как получить все элементы в списке

У меня есть список из 500 элементов, и когда я использую app.Query на странице, Xamarin.UITest дает мне только 6 элементов, поскольку только 6 элементов видны в пользовательском интерфейсе.

Как я могу получить все 500 элементов из списка внутри моего UITest?


person Brandon Minnick    schedule 30.12.2016    source источник


Ответы (2)


Как описано выше, ожидаемое поведение app.Query будет возвращать только результаты всех видимых элементов управления на странице. Таким образом, если элемент управления не виден, app.Query не вернет его.

Чтобы получить все данные в списке, нужно использовать бэкдор-метод.

В Xamarin есть дополнительный документация о том, как использовать бэкдоры в UITest.

Пример приложения

В этом примере приложения реализованы фрагменты из руководства: https://github.com/brminnick/UITestSampleApp.

Руководство

1. Создайте сериализуемый объект

Поскольку методы Backdoor ограничены возвратом строки, нам нужно будет иметь возможность сериализовать наш объект.

Вам потребуется добавить пакет NuGet Newtonsoft.Json в каждый из ваших проектов; то есть добавьте 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);
}
person Brandon Minnick    schedule 30.12.2016

Для тех, кто все еще задает этот вопрос, теперь есть AppQuery.All, который изменяет запрос, возвращая все элементы, а не только видимые.

person Zebrastian    schedule 31.07.2019
comment
Я пробовал только на Android, но у меня никогда не работал All() - он возвращает только видимые элементы, но дублированные. Это действительно работает для вас? - person Cocowalla; 27.11.2019