我有一个带有层次结构的列表视图,理论上我不知道。我试图接受一个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();
}
}
我认为这样做的正确方法与我实施的方式完全不同。
我的列表层次结构类似于以下内容;我的终点可能因我下来的分支而异:
答案 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();
}
}
}