我使用appium java客户端和uiautomator2作为Android的自动化引擎。应用程序有一个滚动视图,我需要从TextView中获取文本。当屏幕加载时,其中一些在视口内,而一些在视口外。我怎样才能以正确的方式获取节点的文本?现在,我有一个特定的测试设备,我知道哪些元素是可见的,哪些不是。所以对于后面的元素,我已经实现了一个滚动到的方法来向下滚动。
我已经看到了保持滚动直到元素进入视口的解决方案。我不喜欢这种方法,因为它会影响测试的性能,因为测试可能在滚动之前仍然在等待一个元素,而这些时间只是被浪费了。
有什么更好的策略来处理这个问题?我们使用的是pagefactory模式,主要使用xpath、accessibility label和id来识别元素。如果有帮助的话,测试中的应用是一个react native应用。
我建议使用 UiScrollable 的。
如果您使用页面对象模式和 @AndroidFindBy
注解,你可以简单地把。
@AndroidFindBy(uiSelector = "UiScrollable(\"className(\"android.widget.ScrollView\")\").scrollIntoView(resourceId(\"id_of_element_to_scroll_to\"))")
private MobileElement buttonOfTheScreen;
这里你需要定义两个定位器:
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();
注意: 只有当你要找的元素在屏幕底部边缘下时,这种方法才有效。