在可点击元素上启动时,Appium 无法在 Android 应用程序中滚动

Appium can't scroll in Android App when starting on clickable element

我的情况

我想为 Android 应用程序编写 UI 测试,因此我需要 滚动 应用程序的某些片段。测试用 Kotlin 编写,Appium 版本是 v1.15.1 .

我的问题

我使用标准的滚动方法(见下文)并且它工作正常,只要我的起点的坐标不落在可点击的元素上。我在使用 Appium Desktop Inspector 浏览应用程序时也观察到了这种行为。

我目前的做法

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),则不会执行 scroll/swipe,但实际上仍会调用滚动侦听器。

您可以借助元素的资源 ID 进行滚动。这可以通过 UiAutomator2 as automation engine. 来实现您需要使用自动化名称 as UiAutomator2 在期望的功能中。

如果您使用 appium 作为自动化引擎,请添加所需的功能UiAutomator2

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

如果您有元素的资源 ID,现在使用以下函数,如果页面上有一个元素,则索引为 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();
        }
    }

这是动态方法,它将滚动直到元素不可见。