如何滚动到不在 Appium 视口内的元素?

How to scroll to an element which is not inside the viewport in Appium?

我正在使用 appium java 客户端和 uiautomator2 作为 android 的自动化引擎。该应用程序有一个滚动视图,我需要从中获取文本视图中的文本。加载屏幕时,其中一些在视口内,而其中一些在视口外。如何以正确的方式获取节点的文本?现在,我有一个特定的测试设备,我知道在该设备上哪些元素可见,哪些不可见。所以为了后面,我实现了一个scrollTo方法来向下滚动到。

我看到了保持滚动直到元素出现在视口中的解决方案。我不喜欢它,因为它会影响测试的性能。因为在下一次滚动之前测试可能仍在等待一个元素,而那段时间只是浪费了。

有什么更好的策略来处理这个问题?我们正在使用 pagefactory 模式,主要使用 xpath、可访问性标签和 id 来识别元素。如果有帮助,被测应用程序是一个 React Native 应用程序。

我建议为此使用 UiScrollable

如果你使用页面对象模式和@AndroidFindBy注释,你可以简单地输入:

@AndroidFindBy(uiSelector = "UiScrollable(\"className(\"android.widget.ScrollView\")\").scrollIntoView(resourceId(\"id_of_element_to_scroll_to\"))")
private MobileElement buttonOfTheScreen;

这里需要定义两个定位器:

  • 一个用于将被滑动的元素,在上面的例子中我们称之为 swipe base - className(\"android.widget.ScrollView\")
  • 第二个定位器用于屏幕外的元素 - resourceId(\"id_of_element_to_scroll_to\")

不需要额外的操作。一旦你需要与你的元素交互,例如getText()click(),uiautomator 会自动滑动到它。

或者,您可以使用:

String locator = "UiScrollable(\"className(\"android.widget.ScrollView\")\").scrollIntoView(resourceId(\"id_of_element_to_scroll_to\"))";
driver.findElement(MobileBy.AndroidUIAutomator(locator)).click();

注意:只有当您要查找的元素位于屏幕底部边缘时,此方法才有效。