Appium中ListView滚动及指定元素选择问题:滚动缓慢且无法触达末尾元素
解决UiScrollable滚动慢及无法滚至末尾的问题
嘿,针对你遇到的滚动速度慢、还滚不到列表最后一个元素的问题,我给你几个实用的优化方案:
问题根源分析
你原来的代码里,UiScrollable的基础选择器用了className("android.widget.CheckedTextView").clickable(true).index(6)——这相当于把滚动范围限制在了第6个CheckedTextView元素的范围内,而不是整个可滚动列表容器,自然没法滚到后面的元素;另外默认的滚动时长偏长,导致速度慢。
具体解决方案
- 修改滚动容器选择器:把基础选择器换成整个可滚动列表的容器(比如ListView、RecyclerView),这样滚动范围覆盖整个列表,就能滚到底了。
- 加快滚动速度:用
setScrollDuration()方法缩短单次滚动的时长,数值越小滚动越快(比如设为100毫秒)。 - 优化元素定位逻辑:优先基于容器滚动,再定位目标元素,避免范围限制。
修改后的代码示例
方案一:用UiScrollable对象操作(更灵活)
// 打开项目选择列表 driver.findElement(By.id("co.nworks.leaveapp:id/txt_select_project")).click(); // 初始化针对整个列表容器的UiScrollable(注意替换成你实际的容器类,比如RecyclerView) UiScrollable scrollableList = new UiScrollable(new UiSelector() .className("android.widget.ListView") .scrollable(true)); // 设置滚动速度,缩短单次滚动时长 scrollableList.setScrollDuration(100); // 滚动到目标元素并获取它 MobileElement targetElement = (MobileElement) scrollableList.getChildByText( new UiSelector().className("android.widget.CheckedTextView").clickable(true), "Phantom Hydraulics Hub(20170817-001)", true); // true表示如果元素不在当前视图,就滚动查找 targetElement.click();
方案二:整合到AndroidUIAutomator脚本里
driver.findElement(By.id("co.nworks.leaveapp:id/txt_select_project")).click(); // 优化后的滚动定位脚本 MobileElement element = (MobileElement) driver.findElement(MobileBy.AndroidUIAutomator( "new UiScrollable(new UiSelector().className(\"android.widget.ListView\").scrollable(true))" + ".setScrollDuration(100)" + // 加快滚动速度 ".scrollIntoView(new UiSelector().text(\"Phantom Hydraulics Hub(20170817-001)\"))")); element.click();
注意事项
- 一定要替换代码里的
android.widget.ListView为你实际app中列表的容器类,比如如果是RecyclerView,就改成androidx.recyclerview.widget.RecyclerView或者android.support.v7.widget.RecyclerView(可以用uiautomatorviewer查看布局)。 - 如果还是滚不到底,可以尝试先调用
scrollableList.scrollToEnd(10, 50),先把列表滚到底,再定位元素,这样更稳妥。
内容的提问来源于stack exchange,提问作者Geeta
相关产品推荐
相关产品推荐

