Xamarin UI test не может нажать на кнопку

Я обнаружил очень странное поведение в тесте пользовательского интерфейса Xamarin. Вопрос в том, frameworkне может нажать на некоторые отмеченные элементы. Это абсолютно случайная проблема. Проблема может появиться на физическом устройстве или симуляторе, Android или iOS. Старые или новые ОС системы. Мой тестовый сценарий:

app.WaitForElement(x => x.Marked("IDTransHistory"));
app.Tap(x => x.Marked("IDTransHistory"));
try
        {
            app.WaitForElement(x => x.Marked("Filter"));
            app.Tap(x => x.Marked("Filter"));
        }
        catch (Exception)
        {
            try
            {
                app.Tap(x => x.Marked("Button.Home"));
                app.Tap(x => x.Marked("IDTransHistory"));
            }
            catch (Exception)
            {
                try
                {
                    app.Tap(x => x.Marked("Button.Home"));
                    app.Tap(x => x.Marked("IDTransHistory"));
                }
                catch (Exception)
                {
                    app.Tap(x => x.Marked("Button.Home"));
                    app.Tap(x => x.Marked("IDTransHistory"));
                }
            }
        }

Журнал VS:

[5/18/2018 12:57:16 PM Informational] ------ Run test started ------
[5/18/2018 12:57:16 PM Informational] NUnit VS Adapter 2.0.0.0 executing tests is started
...
[5/18/2018 12:57:56 PM Informational] Waiting for element matching Marked("IDTransHistory").
[5/18/2018 12:58:03 PM Informational] Using element matching Marked("IDTransHistory").
[5/18/2018 12:58:04 PM Informational] Tapping coordinates [ 532, 1114 ].
[5/18/2018 12:58:05 PM Informational] Waiting for element matching Marked("Filter").
[5/18/2018 12:58:08 PM Informational] Using element matching Marked("Filter").
[5/18/2018 12:58:08 PM Informational] Tapping coordinates [ 684, 96 ].
[5/18/2018 12:58:24 PM Informational] Error while performing Tap(Marked("Date.Start"))
Exception: System.Exception: Unable to find element. Query for Marked("Date.Start") gave no results.
   at Xamarin.UITest.SharedApp.FirstWithLog[T](T[] results, ITokenContainer tokenContainer)
   at Xamarin.UITest.Android.AndroidApp.<Tap>c__AnonStoreyB.<>m__0()
   at Xamarin.UITest.Utils.ErrorReporting.With(Action func, Object[] args, String memberName)
[5/18/2018 12:58:24 PM Informational] Waiting for element matching Marked("Filter").
[5/18/2018 12:58:28 PM Informational] Using element matching Marked("Filter").
[5/18/2018 12:58:28 PM Informational] Tapping coordinates [ 684, 96 ].
[5/18/2018 12:58:32 PM Informational] Using element matching Marked("Date.Start").
[5/18/2018 12:58:32 PM Informational] Tapping coordinates [ 71, 298 ].
[5/18/2018 12:58:35 PM Informational] Using element matching Text("2018").
[5/18/2018 12:58:35 PM Informational] Tapping coordinates [ 139, 228 ].

Хорошо, как вы можете видеть элемент отмечен Filter использовал -> постукивание по координатам [ 684, 96 ]. Это означает, что этот элемент существует на мониторе. Но впервые это не сработало. Я использую Nunit 3.10 и Xamarin UI Test 2.24. Эта проблема может возникнуть на случайном устройстве - iOS или Android, эмуляторе или физическом устройстве. Текущий тест был на Samsung sm a310f. Я не знаю, является ли это ошибкой теста пользовательского интерфейса Xamarin или может быть Calabash.

UPD:

Код -

app.ScrollDownTo(x => x.Marked("IDTransHistory"));
app.Tap(x => x.Marked("IDTransHistory"));
app.WaitForElement(x => x.Marked("Filter"));
app.Tap(x => x.Marked("Filter"));
app.WaitForElement(x=>x.Marked("Date.Start"));
app.Tap(x => x.Marked("Date.Start"));

Журнал -

[5/21/2018 3:05:00 PM Informational] Skipping installation: Already installed.
----
[5/21/2018 3:05:34 PM Informational] Scrolling down to Marked("IDTransHistory")
[5/21/2018 3:05:37 PM Informational] Using element matching Marked("IDTransHistory").
[5/21/2018 3:05:37 PM Informational] Tapping coordinates [ 533, 1114 ].
[5/21/2018 3:05:38 PM Informational] Waiting for element matching Marked("Filter").
[5/21/2018 3:05:40 PM Informational] Using element matching Marked("Filter").
[5/21/2018 3:05:40 PM Informational] Tapping coordinates [ 684, 96 ].
[5/21/2018 3:05:41 PM Informational] Waiting for element matching Marked("Date.Start").
[5/21/2018 3:05:56 PM Informational] Error while performing WaitForElement(Marked("Date.Start"), "Timed out waiting for element...", null, null, null)
Exception: System.TimeoutException: Timed out waiting for element...
   at Xamarin.UITest.Shared.WaitForHelper.WaitForAny[T](Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout)
   at Xamarin.UITest.Android.AndroidApp.<WaitForElement>c__AnonStorey31.<>m__0()
   at Xamarin.UITest.Utils.ErrorReporting.With[T](Func`1 func, Object[] args, String memberName)
[5/21/2018 3:05:57 PM Informational] Query for * gave 46 results.
[5/21/2018 3:05:57 PM Informational] [
  {

4 ответа

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

Например, я бы написал ваш пример так:

app.WaitForElement(x => x.Marked("IDTransHistory"));
app.Tap(x => x.Marked("IDTransHistory"));
app.WaitForElement(x => x.Marked("Button.Home"));
app.Tap(x => x.Marked("Button.Home"));
app.WaitForElement(x => x.Marked("IDTransHistory"));
app.Tap(x => x.Marked("IDTransHistory"));

Таким образом, вы ждете, пока элемент появится на экране, прежде чем пытаться нажать на него (на некоторых устройствах это важнее, чем на других, потому что анимация перехода экрана может занять некоторое время) - также может случиться так, что элемент помечается как имеющий координаты, когда он еще не готов к принятию жестов - поэтому, если вышеприведенное не работает, вы можете попробовать добавить Thread.Sleep перед Tap дать пользовательскому интерфейсу время быть готовым - это может помочь стабилизировать ваш тест.

Если это станет необходимым, вы получите тестовый код, похожий на этот:

app.WaitForElement(x => x.Marked("IDTransHistory"));
Thread.Sleep(500);
app.Tap(x => x.Marked("IDTransHistory"));
app.WaitForElement(x => x.Marked("Button.Home"));
Thread.Sleep(500);
app.Tap(x => x.Marked("Button.Home"));
app.WaitForElement(x => x.Marked("IDTransHistory"));
Thread.Sleep(500);
app.Tap(x => x.Marked("IDTransHistory"));

Я бы посоветовал начинать с Sleep 500, увеличивая его с шагом 500, пока тест не станет стабильным.

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

Также стоит отметить (хотя на основании вашего описания это не ваша проблема), что в iOS 11 - Apple внесла некоторые изменения в то, как элементы (или нет) Marked поэтому некоторые ранее работающие тесты могут перестать работать, потому что пользовательский интерфейс больше не распознает их как Marked таким же образом. Лучший способ решить эту проблему - снова опросить приложение, используя Repl,

Бежать app.Repl(); и введите дерево. Вы найдете список видимого кода пользовательского интерфейса, попробуйте там один раз с вашим кодом. Если он работает нормально, либо используйте Class и имя класса вместо помеченного текстом в пользовательском интерфейсе. Например:-app.Tap( a => a.Class("classs-name")); // если вы используете то же имя класса, используйте для этого индекс app.Tap( a => a.Class("classs-name").index(value));

Из документации: https://docs.microsoft.com/en-us/appcenter/test-cloud/uitest/

Xamarin.UITest требует NUnit 2.6.3 или 2.6.4 для запуска тестов. Xamarin.UITest не совместим с NUnit 3.x.

Это может быть вашей проблемой.

Я также проверил бы:

  1. Нажатие на "Фильтр" - не вызывает никаких изменений макета (например, анимации) -> пауза может помочь в этом случае.

  2. Изменен идентификатор элемента с "Date.Start" на что-то без точки (.), Например "StartDate"

Я столкнулся с этой проблемой при использовании симулятора касания ipod, когда я перешел на симулятор iPhone, он работает должным образом.

Другие вопросы по тегам