Appium中RecyclerView元素列表始终为空问题求助
问题分析与解决建议
我来帮你拆解下为什么listOfElements始终为空,以及对应的修复方案:
核心问题1:构造函数覆盖了PageFactory初始化的列表
你在DealsListLayout的构造函数里,先调用init()让PageFactory帮你初始化listOfElements,但紧接着又执行了listOfElements = new ArrayList<>();——这相当于把PageFactory刚初始化好的列表直接替换成了一个空的新列表,所以打印出来的size自然是0。这是最直接的原因。
核心问题2:DealsItem里的定位符格式错误
看DealsItem中dealName的@FindBy注解:
@FindBy(id = "com.deals.test/deals_item_asset_name_textview")
这里用了斜杠/分隔包名和资源ID,但Android的资源ID正确格式是用冒号:id/,也就是应该写成com.deals.test:id/deals_item_asset_name_textview,和dealStartTime的格式保持一致。这个错误会导致PageFactory无法正确识别元素,进而无法创建有效的DealsItem实例。
核心问题3:DealsItem的手动初始化画蛇添足
当PageFactory处理List<DealsItem>时,它会自动为每个找到的父元素创建DealsItem实例,并绑定内部的子元素。你在DealsItem的构造函数里手动调用init(),反而可能打乱PageFactory的初始化逻辑,甚至导致上下文错误。
具体修复步骤
- 修复DealsListLayout的构造函数
删掉覆盖列表的那行代码,让PageFactory初始化的列表保留下来:
public class DealsListLayout { private Waiter waiter; @FindBy(id = "com.deals.test:id/deals_item_content_view") private List<DealsItem> listOfElements; public DealsListLayout() { waiter = new Waiter(); init(); printInfo("Size " + listOfElements.size()); } private void init() { PageFactory.initElements(new AppiumFieldDecorator(driver), this); } }
- 修正DealsItem的定位符
把dealName的ID格式改对:
public class DealsItem { @FindBy(id = "com.deals.test:id/deals_item_asset_name_textview") private MobileElement dealName; @FindBy(id = "com.deals.test:id/deals_item_time_open_textview") private MobileElement dealStartTime; // 保留空构造函数即可,PageFactory会自动处理初始化 public DealsItem() {} }
- 添加显式等待(可选但推荐)
为了确保页面加载完成后再获取列表,可以在init()方法里加上显式等待:
private void init() { PageFactory.initElements(new AppiumFieldDecorator(driver), this); // 等待列表元素可见,超时时间根据实际情况调整 waiter.until(ExpectedConditions.visibilityOfAllElements(listOfElements)); }
做完这些修改后,listOfElements应该就能正确获取到屏幕上的2个元素了。
内容的提问来源于stack exchange,提问作者k.nadonenko
相关产品推荐
相关产品推荐

