无法使用UiScrollable和TouchActions在Appium中水平滚动

无法使用UiScrollable和TouchActions在Appium中水平滚动,appium,appium-android,Appium,Appium Android,我正在尝试滚动至“进行我的旅行”主页上的“礼品卡”选项,然后单击它。到目前为止,我已经尝试了以下两种方法,但都没有成功。我还附上了应用程序主页的屏幕截图,以便清楚地理解 方法1:使用AndroidUIAutomator滚动到特定元素 driver.findElement(MobileBy.AndroidUIAutomator("new UiScrollable(new UiSelector()" + ".resourceId(\"com.makemytrip:id

我正在尝试滚动至“进行我的旅行”主页上的“礼品卡”选项,然后单击它。到目前为止,我已经尝试了以下两种方法,但都没有成功。我还附上了应用程序主页的屏幕截图,以便清楚地理解

方法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();
结果:由于eleTwo当前不在帧中,因此不会引发类似的元素发现异常。我试图调整这种方法,并输入eleTwo作为一个元素,它在屏幕上是可见的,只是为了看看滚动是否有效,它是否有效。 但不知何故,我不知道如何处理屏幕上看不到的元素

我想滚动顶部选项列表,然后点击GiftCard,这是顶部小部件菜单上的最后一个选项

我将AppiumDriver与Java客户端7.3.0一起使用


您可以使用uiAutomator2(将scrollable设置为true)尝试此操作:

您可以通过触摸操作根据屏幕大小水平和垂直滚动。下面是示例代码

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();
    }
我已经用不同的方法写了一个详细的答案。您可以在这里查看:


您可以使用uiAutomator2(将scrollable设置为true)尝试此操作:

您可以通过触摸操作根据屏幕大小水平和垂直滚动。下面是示例代码

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();
    }
我已经用不同的方法写了一个详细的答案。您可以在这里查看:


Hi Muzzamil感谢您的回复,但它仍然没有滚动,而是单击了寄宿家庭选项。@KovidMehta,我添加了基于屏幕大小的水平滚动代码。您可以在单击之前调用它。我希望它能在一个函数调用中工作,但如果您觉得需要更多的滚动,只需使用while条件和目标元素的可见性即可。希望能有帮助,但效果不太好。该方法不在屏幕上执行任何操作。我需要更新其中的内容吗?不需要更新。但它应该起作用。您最近是否更新了appium或selenium版本。它是否抛出任何错误?不,它没有抛出任何错误。它可能只是等待几秒钟,然后开始执行下一个命令。Selenium-3.141.59和Appium server v1.13.0Hi Muzzamil感谢您的回复,但它仍然没有滚动,而是单击了寄宿家庭选项。@KovidMehta,我添加了基于屏幕大小的水平滚动代码。您可以在单击之前调用它。我希望它能在一个函数调用中工作,但如果您觉得需要更多的滚动,只需使用while条件和目标元素的可见性即可。希望能有帮助,但效果不太好。该方法不在屏幕上执行任何操作。我需要更新其中的内容吗?不需要更新。但它应该起作用。您最近是否更新了appium或selenium版本。它是否抛出任何错误?不,它没有抛出任何错误。它可能只是等待几秒钟,然后开始执行下一个命令。Selenium-3.141.59和Appium服务器v1.13.0