Как стать автором
Обновить

SwiftUI not supported adjusting picker wheel value

xcode 13.2.1/swift 5.5.2

custom solution
custom solution

Исторически

для ленивых просто перейти к «Как это работает?»

Всем привет, наверное многие из вас сталкивались с этой проблемой, когда настройки Picker Wheel не работают должным образом или вообще не работают (полностью мертвы для UI Automation Testing). Наиболее распространенная причина — начать использовать SwiftUI вместо UIKit.

Копаем в проблеме

1. Ошибка сообщает нам «“Unsupported picker wheel…..”. ». Итак, давайте проверим, правильный ли путь к элементу (очевидно, так как ошибка говорит об элементе), попробуйте настроить из debugger и посмотрите лог.

Шаг 2. Попробуем найти любое другое решение для обхода: swipeUp() и swipeDown(), пока условие будет истинным, и это 100% плохое решение. Задать в кодовой базе параметры, чтобы настроить или подумать об API, но под капотом ничего не достижимо, так как UIDatePicker был запрограммирован не для этого.

Решение: было очевидно для тех, кто знаком с Appium или любыми другими кросс платформенными инструментами для мобильного тестирования. Мы будем вращать колесо по координатам..

This is gitHub link for project with two DatePickers with 2 and 3 wheels and solution for adjusting them.

Как это работает?

Шаг 1. Давайте создадим расширение для XCUIElemet. Затем нам понадобятся 2 функции currentPosition() для возврата значения текущей позиции средства выбора в виде строки, а ядром идеи настройки является функция rotateUp().

В разных источниках я находил: высота каждой выемки колеса около 30 пикселей, поэтому нажатие y — 30 поворачивает вверх. y + 30 вращается вниз. НО в моем случае 20 был размер.

Шаг 2. Ядром функции AdjustPickerWheelValueTo(value: String, WheelNumberIs: Int) является цикл while. Интересный момент здесь заключается в том, чтобы убедиться, что условие будет выполнено успешно, вам нужно дождаться завершения вращения и сравнить с XCUIElement, сравнение со значением FAIL, только после включения XCUIElement и .waitForExistence(timeout: 1) --> цикл начинает работать правильно. Это была действительно БОЛЬНАЯ ТОЧКА!

Также вы не хотите оставлять цикл while без перерыва на всю ночь (CI tool is not trust guy, it can take your while loop and make it crazy), поэтому secureRotateCount прервет цикл while после 100 итерации.

Также вы можете передать весь элемент вместо Int

Шаг 3. В моем случае у меня есть приложение с одним представлением и двумя средствами выбора даты (технически одно средство выбора даты), у одного из них 2 колеса, у другого 3 колеса.s.

Для двух колес, передаю год и месяц как строку, и (в данном случае) жестко закодированное колесо по индексу 0 или 1 (лучше хранить элемент в переменной)

adjust date picker with 2 wheels
adjust date picker with 2 wheels
Test class
Test class

Для 3 колес, передаю часы, минуты, дневное время в виде строки и (в данном случае) жестко закодированное колесо по индексу 0, 1, 2 (лучше хранить элемент в переменной))

Примечания: лучший способ установить значение datePicker — использовать класс Date для любых случаев.

adjust date picker with 3 wheels
adjust date picker with 3 wheels

В тестовом классе не все тесты настраивают все 3 колеса, только test4()

Test class
Test class

That’s all from my side.

I hope it was helpful!

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.