Java Appium:如何迭代未知长度的listview?
我有一个列表视图,它的层次结构理论上我一无所知。我试图接受一个字符串数组并为其中的每个字符串创建MobileElement,但由于我通过注释自动定义元素的PageFactory方式,它们无法使用变量。我也不知道在方法中定义我的注释是否有效或合适 我编写的代码显然没有编译,如下所示:Java Appium:如何迭代未知长度的listview?,java,appium,appium-ios,Java,Appium,Appium Ios,我有一个列表视图,它的层次结构理论上我一无所知。我试图接受一个字符串数组并为其中的每个字符串创建MobileElement,但由于我通过注释自动定义元素的PageFactory方式,它们无法使用变量。我也不知道在方法中定义我的注释是否有效或合适 我编写的代码显然没有编译,如下所示: public void selectLocation(String[] location) { List<MobileElement> locationsList = new ArrayList
public void selectLocation(String[] location) {
List<MobileElement> locationsList = new ArrayList<>();
for(int i = 0; i < location.length; i++) {
@iOSFindBy(accessibility = location[i])
@AndroidFindBy(xpath = "//android.widget.TextView[@text='" + location[i] + "']")
locationsList.add(i);
}
for (int i = 0; i < location.length; i++) {
locationsList.get(i).click();
}
}
我假设正确的方法与我实现的方法完全不同
我的列表层次结构类似于以下内容:;我的终点可能因我所走的分支而异:
大陆1
城市1
1号房间
2号房间
城市2
1号楼
1号房间
2号房间
2号楼
1号房间
2号房间
最后,我使用FindsBys函数创建了一个包含所有匹配元素的数组。然后,我在这些元素中循环寻找与我的一个字符串匹配的元素
@AndroidFindBys({@AndroidFindBy(xpath = "//android.widget.TextView")})
@iOSFindBys({@iOSFindBy(xpath = "//XCUIElementTypeStaticText")})
private List<MobileElement> locationsList;
...
public void selectLocation(String[] location)
{
for(int i = 0; i < locationsList.size(); i++)
for(int p = 0; p < location.length; p++) {
if (locationsList.get(i).getText().equals(location[p])) {
locationsList.get(i).click();
}
}
}
如果在层次结构的不同级别上有重复的字符串,这并不是万无一失的,您可能会遇到问题,但它适用于我的用例,应该能够指导任何人寻找更强大的解决方案。我最终使用findsby函数创建了一个包含所有匹配元素的数组。然后,我在这些元素中循环寻找与我的一个字符串匹配的元素
@AndroidFindBys({@AndroidFindBy(xpath = "//android.widget.TextView")})
@iOSFindBys({@iOSFindBy(xpath = "//XCUIElementTypeStaticText")})
private List<MobileElement> locationsList;
...
public void selectLocation(String[] location)
{
for(int i = 0; i < locationsList.size(); i++)
for(int p = 0; p < location.length; p++) {
if (locationsList.get(i).getText().equals(location[p])) {
locationsList.get(i).click();
}
}
}
如果您在层次结构的不同级别上有重复的字符串,这并不是万无一失的,您可能会遇到问题,但它适用于我的用例,应该能够指导任何人寻找更强大的解决方案。您可以在元素本身上循环
您可以在元素本身上循环
我现在寻找一个匹配的元素。如果找不到它,我会进一步浏览列表。如果元素不存在,我显然会遇到问题,但在我的情况下,这不是一个真正的问题,因为那将是一个失败的测试
while (!driver.findElementById(currentLocation).isDisplayed()) {
driver.swipe(startX, startY, startX, endY, 100);
}
driver.findElementById(currentLocation).click();
是的,我也意识到。虽然不推荐使用刷卡,但它对我来说仍然有效,我不希望在必要时用TouchActions重写所有代码。我现在寻找匹配的元素。如果找不到它,我会进一步浏览列表。如果元素不存在,我显然会遇到问题,但在我的情况下,这不是一个真正的问题,因为那将是一个失败的测试
while (!driver.findElementById(currentLocation).isDisplayed()) {
driver.swipe(startX, startY, startX, endY, 100);
}
driver.findElementById(currentLocation).click();
是的,我也意识到了。虽然刷卡已被弃用,但它仍然适用于我,我不想在必要时用TouchActions重写所有代码。你说得对。我不得不这样写,因为我通过Xpath构建的列表比预期的要大,因为找到了我不想要的元素。在这方面工作了几个月并学习了Appium之后,我完全重构了代码并将其扔掉了:你是对的。我不得不这样写,因为我通过Xpath构建的列表比预期的要大,因为找到了我不想要的元素。在这方面工作了几个月并学习了Appium之后,我已经完全重构了代码并将其扔掉了:我会的,但这是一个糟糕的答案,因为它没有考虑需要滚动以查看元素的列表视图。我会,但这是一个错误的答案,因为它没有考虑需要滚动以查看元素的ListView。