Search code examples
appiumappium-android

Unable to scroll Horizontally in Appium using UiScrollable and TouchActions


I am trying to scroll till the Gift Card option on Make My Trip Home Page and then Click it. So far I have tried below two approaches without success. I am also attaching the screenshot of the App Home Page for clear understanding.

Approach 1 : Using AndroidUIAutomator to scroll to particular element.

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

Result : This does not scroll but clicks on Homestays option on the app.

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

Result : This throws No Such Element Found exception as eleTwo is currently not in frame. I tried to tweak this approach and enter eleTwo as an element which is visible on screen just to see if the scrolling works and it did work. But Somehow I am not sure on how to handle it for elements which are not visible on screen.

I would like to scroll the top options list and then click on GiftCard which is the last option on top widget menu.

I am using AppiumDriver with Java-Client 7.3.0.

IntialPosition ScrollingTillGiftCard


Solution

  • You can try this, With uiAutomator2 (set scrollable as 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();
            }
        }
    

    You can scroll Horizontal and vertical based on screen size with Touch Action. Here is sample code.

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

    I have written one detailed answer to scroll with different approaches. You can check here:

    How to reach the end of a scroll bar in appium?