Xamarin.UITest: как приостановить этап теста

У меня есть UITest, написанный на C#/Xamarin, и тест выполняется слишком быстро, что приводит к его сбою. Мне нужен тест, чтобы дождаться появления изображения на экране перед выполнением следующего шага.

Как я могу приостановить Xamarin UITest и заставить его ждать загрузки изображения на экране, прежде чем перейти к следующему шагу?


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


Ответы (3)


По моему опыту, есть несколько способов приостановить или замедлить работу Xamarin.UITest.

Лучший способ

Используйте WaitForElement API.

Например, здесь я жду кнопку с именем imageButton.

app.WaitForElement(x => x.Marked("imageButton"));

В приведенном выше примере ожидание появления элемента imageButton перед выполнением следующего шага.

Другой путь

Если вы не знаете, с каким элементом хотите взаимодействовать, или просто хотите приостановить Xamarin.UITest, вы можете использовать Thread.Sleep:

Thread.Sleep(8000);

Здесь я приостанавливаю Xamarin.UITest на 8 секунд. Важно отметить, что вам нужно будет добавить эту библиотеку для использования Thread.Sleep:

using System.Threading;

Надеюсь это поможет!

person June    schedule 08.12.2016
comment
Вы пропустили заключительную ) в app.WaitForElement(x => x.Marked("imageButton"); - person user62171; 06.01.2017
comment
Спасибо, Кент! Исправлено. - person June; 26.01.2017

Проблема с "приостановкой" UITest

Ты спросил:

«Как я могу приостановить Xamarin.UITest и дождаться загрузки изображения на экране, прежде чем перейти к следующему шагу?»

Возможно приостановить Xamarin.UITest, используя что-то вроде Thread.Sleep(), на любой требуемый период времени. Однако проблема в том, что Thread.Sleep () негибко останавливает тестовый прогон. Например, если вы установите Thread.Sleep (10000), то поток будет приостановлен ровно на 10 секунд, независимо от того, сколько времени на самом деле требуется вашему приложению для загрузки нужного элемента.

Если ваше изображение загружается всего за 1 секунду на более быстрых устройствах, то при использовании Thread.Sleep(10000) ваш тест всегда будет занимать минимум 10 секунд. Что еще хуже, если вы используете этот подход и Thread.Sleep недостаточно долго, тест все равно не пройдет; поэтому вы должны каждый раз заставлять свои тесты работать так же медленно, как ваш «наихудший сценарий». Дополнительная информация: Thread.Sleep документация< /а>

Решение путем ожидания элемента пользовательского интерфейса без «приостановки» выполнения

Xamarin.UITest содержит IPp.WaitForElement и API IAp.WaitForNoElement для обработки этих сценарии. Эти API превосходят Thread.Sleep, потому что вы можете настроить условия, при которых он возобновляется, помимо ожидания в течение заданного периода времени.

Пример

Этот пример фрагмента кода будет ждать 90 секунд, пока появится элемент, который либо помечен, либо имеет идентификатор "myButton".

    // Wait up to 90 seconds for myButton to appear             
    app.WaitForElement(c=>c.Marked("myButton"), "Could not find myButton", new TimeSpan(0,0,0,90,0));

Если для загрузки элемента требуется всего 30 секунд, то в этом примере app.WaitForElement будет продолжаться через 30 секунд, он выдаст ошибку «Не удалось найти myButton», если после ожидания полных 90 секунд элемент все еще не появился.

Простой запрос с использованием таймаутов по умолчанию и сообщений об ошибках

Вы также можете использовать любой из этих вызовов API, не определяя длину времени ожидания, и в этом случае для локальных тестов UITests время ожидания истекает через 15 секунд, или при запуске в Xamarin Test Cloud время ожидания истекает через 1 минуту. Источник: Руководство Xamarin.UITest "Timeouts & Waiting"

Это простейшая возможная форма приведенного выше запроса, использующая таймауты по умолчанию и сообщение об ошибке по умолчанию «Время ожидания элемента истекло...»:

    app.WaitForElement (x => x.Marked ("myButton"));
person user62171    schedule 06.01.2017

Это решение работает, если вы не ждете определенного элемента пользовательского интерфейса и не хотите засыпать текущий поток:

public static void WaitForTimeSpan(IApp app, TimeSpan timeSpan)
{
    try
    {
        app.WaitForElement(c => c.Text("BLAH BLAH BLAH"), "Waiting for something, killing time", timeSpan);
    }
    catch (Exception)
    {
        //do nothing we just wanted to kill some time
    }
}
person Jared    schedule 09.07.2018
comment
Это будет работать, однако обратите внимание, что в любом случае в журнале вывода будет сообщение об ошибке. Хотя тест не провалится. - person bcr; 30.06.2020