Appium не может прокручиваться в приложении для Android при запуске кликабельного элемента

Моя ситуация

Я хочу написать UI-тесты для Android-приложения, поэтому мне нужно прокрутить некоторые фрагменты приложения. Тесты написаны на Kotlin, версия Appium v1.15.1.

Моя проблема

Я использую стандартный подход для прокрутки (см. ниже), и он работает нормально, пока координаты моей начальной точки не попадают на кликабельный элемент. Я также наблюдал такое поведение при навигации по приложению с помощью инспектора Appium Desktop.

Мой текущий подход

PlatformTouchAction(driver as AppiumDriver)
            .press(PointOption.point(100, 500))
            .waitAction(WaitOptions.waitOptions(Duration.ofMillis(1000)))
            .moveTo(PointOption.point(100, 100))
            .waitAction(WaitOptions.waitOptions(Duration.ofMillis(1000)))
            .release()
            .perform()

Как упоминалось ранее, это работает, если начальная точка (100 500) не находится на кликабельном элементе.
Если, например, кнопка находится на (100 500), прокрутка /swipe не выполняется, но на самом деле прослушиватели прокрутки все еще вызываются.


person Erik Schmidt    schedule 06.02.2020    source источник


Ответы (1)


Вы можете прокручивать с помощью идентификатора ресурса элемента. Это может быть достигнуто с помощью UiAutomator2 как automation engine. Вам нужно использовать имя автоматизации как UiAutomator2 в возможностях желаний.

Добавьте желаемую возможность UiAutomator2, если вы используете appium в качестве механизма автоматизации.

capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, "UiAutomator2");

Теперь используйте функции ниже, если у вас есть идентификатор ресурса элемента, и индексируйте как 0, если на странице есть один элемент.

public void scrollByID(String Id, int index) {

        try {

             driver.findElement(MobileBy.AndroidUIAutomator("new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().resourceId(\""+Id+"\").instance("+index+"));")); 

        } catch (Exception e) {
           e.printStackTrace();
        }
    }

Это динамический подход, он будет прокручиваться до тех пор, пока элемент не станет видимым.

person Muzzamil    schedule 06.02.2020
comment
Прежде всего, большое спасибо за быстрый ответ!! Я сделал, как было предложено, и это работает, но несколько раз прокручивается вверх и вниз, прежде чем найти и щелкнуть нужный элемент. В любом случае, я бы предпочел сделать больше логики в тестовом проекте (Kotlin), чем выполнять такую ​​​​длинную задачу на стороне сервера (я имею в виду длинную команду java, которую мы передаем как параметр String). Думаю, поэтому мне пришлось импортировать какую-то библиотеку UIAutomator2, чтобы иметь доступ к классу UiSelector и т. д. Есть ли такая библиотека? - person Erik Schmidt; 10.02.2020
comment
@ErikSchmidt, это встроенная функция UiAutomator2. Поскольку мы не сообщаем движку uiAutomator2, какой прямой элемент может быть (вверх и вниз), он заставит его прокручивать вверх и вниз для поиска элемента. Поскольку я использую его, я могу сказать, что это самая стабильная функция в библиотеке Appium для прокрутки. у нас есть опция прокрутки с классом сенсорного действия, но тогда мы должны зациклить ее для прокрутки и использовать условие видимости элемента для каждой прокрутки, и это было бы невозможным решением, поскольку оно увеличивает сложность. - person Muzzamil; 10.02.2020
comment
Я думаю ты прав. Я буду использовать вашу реализацию и надеюсь, что UIAnimator2 будет отражен в java-клиенте appium в тот же день, чтобы я мог вызывать функции напрямую, а не отправлять строку, которая позже выполняется как строка java-кода. Еще раз большое спасибо! - person Erik Schmidt; 10.02.2020