Xamarin UI test не может нажать на кнопку - PullRequest
0 голосов
/ 18 мая 2018

Я обнаружил очень странное поведение в тесте пользовательского интерфейса 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] [
  {

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

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

0 голосов
/ 16 января 2019

Из документации: 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"

0 голосов
/ 18 мая 2018

Это обычная практика с тестами 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"));

Я бы посоветовал начать с «сна», повышая его.с шагом 500 до тех пор, пока тест не станет стабильным.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...