Невозможно прокрутить по горизонтали в Appium с помощью UiScrollable и TouchActions

Я пытаюсь прокрутить до опции «Подарочная карта» на домашней странице «Сделать мою поездку», а затем щелкнуть ее. До сих пор я пробовал ниже два подхода без успеха. Я также прилагаю скриншот домашней страницы приложения для ясности.

Подход 1: использование AndroidUIAutomator для прокрутки до определенного элемента.

driver.findElement(MobileBy.AndroidUIAutomator("new UiScrollable(new UiSelector()"
                + ".resourceId(\"com.makemytrip:id/rvHomePageIcon\"))"
                + ".scrollIntoView(new UiSelector().textMatches(\"Gift Cards\")"
                + ".instance(0));"));

Результат: Это не прокручивается, а нажимает на опцию «Проживание в семье» в приложении.

Подход 2:

WebElement eleOne = driver.findElement(By.xpath("//*[@text='Flights']"));
WebElement eleTwo = driver.findElement(By.xpath("//*[@text='Gift Cards']"));
TouchAction t = new TouchAction(driver);
t.longPress(longPressOptions().withElement(element(eleOne))
                .withDuration(ofSeconds(8))).moveTo(element(eleTwo))
                    .release().perform();

Результат: Это выдает исключение Nosuch Element Found, так как eleTwo в данный момент не находится в кадре. Я попытался изменить этот подход и ввести eleTwo как элемент, видимый на экране, просто чтобы посмотреть, работает ли прокрутка, и она действительно работает. Но почему-то я не уверен, как обращаться с элементами, которые не видны на экране.

Я хотел бы прокрутить список основных опций, а затем щелкнуть GiftCard, которая является последней опцией в верхнем меню виджетов.

Я использую AppiumDriver с Java-клиентом 7.3.0.

IntialPosition ScrollingTillGiftCard


person Kovid Mehta    schedule 12.12.2019    source источник


Ответы (1)


Вы можете попробовать это с помощью uiAutomator2 (установите для прокрутки значение true):

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();
        }
    }

Вы можете прокручивать по горизонтали и вертикали в зависимости от размера экрана с помощью Touch Action. Вот пример кода.

public void scrollHorizontally() {

      int  y = driver.manage().window().getSize().height / 2;
      int start_x = (int) (driver.manage().window().getSize().width * 0.2);
      int end_x = (int) (driver.manage().window().getSize().width * 0.8);
        TouchAction dragNDrop = new TouchAction(driver)
                        .press(PointOption.point(start_x, y)).waitAction(WaitOptions.waitOptions(Duration.ofMillis(500)))
                        .moveTo(PointOption.point(end_x, y))
                        .release();
        dragNDrop.perform();
    }

Я написал один подробный ответ для прокрутки с разными подходами. Вы можете проверить здесь:

Как добраться до конца полоса прокрутки в appium?

person Muzzamil    schedule 13.12.2019
comment
Привет, Муззамил, спасибо за ваш ответ, но вместо прокрутки он по-прежнему выбирает вариант проживания в семье. - person Kovid Mehta; 13.12.2019
comment
@KovidMehta, я добавил код для горизонтальной прокрутки в зависимости от размера экрана. вы можете вызвать его перед щелчком. Я надеюсь, что это будет работать в одном вызове функции, но если вы чувствуете, что вам нужно больше прокрутки, просто используйте условие while с видимостью целевого элемента. Надеюсь, это поможет. - person Muzzamil; 13.12.2019
comment
Это тоже не работает. Метод ничего не делает на экране. Нужно ли что-то в нем обновлять? - person Kovid Mehta; 13.12.2019
comment
Обновление не требуется. Но это должно работать. Вы недавно обновили версию appium или selenium. Выдает какую-то ошибку? - person Muzzamil; 13.12.2019
comment
Нет, никаких ошибок не выдает. Он просто ждет несколько секунд, может быть, а затем переходит к выполнению следующей команды. Selenium — 3.141.59 и сервер Appium v1.13.0 - person Kovid Mehta; 13.12.2019
comment
Версия зависимостей Appium? - person Muzzamil; 13.12.2019
comment
Версия зависимостей Appium — 7.3.0 - person Kovid Mehta; 13.12.2019
comment
Проверьте с селеном (3.14.0) и аппием (6.1.0) - person Muzzamil; 13.12.2019
comment
Привет Muzzamil, я смог решить эту проблему с помощью вышеуказанного метода. Я думаю, что проблема заключалась в том, что координаты, о которых я говорил, были неправильными. Я использовал приведенную ниже строку кода, чтобы заставить его работать. В случае горизонтальной прокрутки важно, чтобы координата Y была постоянной, и наоборот для вертикальной прокрутки. t.press(PointOption.point(x, y)).waitAction().moveTo(PointOption.point(x, y)).release().perform(); - person Kovid Mehta; 06.01.2020
comment
Да. Поскольку мы прокручиваем по ширине, координата x будет изменена. - person Muzzamil; 06.01.2020