【问题标题】:Appium can't scroll in Android App when starting on clickable element在可点击元素上启动时,Appium 无法在 Android App 中滚动
【发布时间】:2020-05-22 16:30:54
【问题描述】:

我的情况

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

我的问题

我使用标准滚动方法(见下文),只要我的 起点 的坐标不落在可点击元素上,它就可以正常工作。在使用 Appium 桌面 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),则不会执行滚动/滑动,但实际上仍然会调用滚动监听器。

【问题讨论】:

    标签: appium-android android-scroll appium-desktop


    【解决方案1】:

    您可以在元素的资源 ID 的帮助下滚动。这可以通过 UiAutomator2 as automation engine. 来实现,您需要在需要的功能中使用自动化名称作为 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();
            }
        }
    

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

    【讨论】:

    • 首先非常感谢您的快速回复!!我按照建议做了,它可以工作,但是在找到并单击所需元素之前它会上下滚动几次。无论如何,我宁愿在测试项目(Kotlin)中做更多的逻辑,而不是在服务器端执行如此长的任务(我的意思是我们作为字符串参数传递的长 java 命令)。我想因此我必须导入某种 UIAutomator2 库才能访问 UiSelector 类等......那里有这样的库吗?
    • @ErikSchmidt,这是 UiAutomator2 的原生功能。由于我们没有告诉 uiAutomator2 引擎哪个直接元素可以是(向上和向下),因此它将使其向上和向下滚动以搜索元素。当我使用它时,我可以说它是 Appium 库中最稳定的滚动功能。我们有带有触摸动作类的选项滚动,但是我们必须循环它以进行滚动并使用 if 条件来确定每个滚动元素的可见性,并且由于它增加了复杂性,这不是可行的解决方案。
    • 我认为你是对的。我将使用您的实现,并希望 UIAnimator2 将在当天镜像到 appium java-client 中,这样我就可以直接调用这些函数,而不是发送一个稍后作为一行 java 代码执行的 String。再次感谢您!
    猜你喜欢
    • 2018-11-17
    • 2019-02-07
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 2015-10-03
    相关资源
    最近更新 更多