Java Appium:如何迭代未知长度的listview?

Java Appium:如何迭代未知长度的listview?,java,appium,appium-ios,Java,Appium,Appium Ios,我有一个列表视图,它的层次结构理论上我一无所知。我试图接受一个字符串数组并为其中的每个字符串创建MobileElement,但由于我通过注释自动定义元素的PageFactory方式,它们无法使用变量。我也不知道在方法中定义我的注释是否有效或合适 我编写的代码显然没有编译,如下所示: public void selectLocation(String[] location) { List<MobileElement> locationsList = new ArrayList

我有一个列表视图,它的层次结构理论上我一无所知。我试图接受一个字符串数组并为其中的每个字符串创建MobileElement,但由于我通过注释自动定义元素的PageFactory方式,它们无法使用变量。我也不知道在方法中定义我的注释是否有效或合适

我编写的代码显然没有编译,如下所示:

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。