Appium:如何迭代未知长度的列表视图?

时间:2017-07-24 21:09:46

标签: java appium appium-ios

我有一个带有层次结构的列表视图,理论上我不知道。我试图接受一个String数组并为其中的每个字符串创建MobileElements,但由于我通过注释自动(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号房间
      • Room 2
    • 城市2
      • 1号楼
        • 1号房间
        • Room 2
      • 2号楼
        • 1号房间
        • Room 2

3 个答案:

答案 0 :(得分:2)

我现在寻找匹配的元素。如果我找不到它,我会进一步滑入列表。如果元素不存在,我显然会遇到问题,但在我的情况下并不是真正的问题,因为这是一个失败的测试。

while (!driver.findElementById(currentLocation).isDisplayed()) {
   driver.swipe(startX, startY, startX, endY, 100);
}
driver.findElementById(currentLocation).click();

是的,我也意识到.swipe()已被弃用,但它仍然适用于我,我宁愿在必要时不用TouchActions重写我的所有代码。

答案 1 :(得分:1)

我最终使用“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();
            }
        }
}

这不是万无一失的(如果你的层次结构的不同级别有重复的字符串,你可能遇到问题),但它适用于我的用例,应该能够引导任何寻求更强大解决方案的人。

答案 2 :(得分:1)

你可以自己循环遍历元素。

...

for(MobileElement location: locationsList) {
    for(int p = 0; p < location.length; p++) {
        if (location.getText().equals(location[p])) {
            location.click();
        }
    }
}