Appium在Java中定位具有特定值的子元素

时间:2016-08-08 11:17:11

标签: java android xpath appium

我正在努力使用原生Android应用上的导航抽屉。

因此,抽屉中有11个元素,其中9个是可见的,其余部分则需要向下滚动。

Appium Inspector view

这些元素包含2个子元素,第一个 - imageView,第二个 - textView元素。

Appium Inspector view

我想要做的是创建一个方法来迭代可见的抽屉元素以搜索具有特定名称的元素,然后点击它,如果元素不可见,我将向下/向上滚动抽屉然后重复迭代。

所以我需要一个for循环遍历textView元素,使用text属性找到我需要的那个,然后点击这个textView的父元素。

然而,我正在努力使用xpath正确定位元素,而Appium似乎无法找到它们。

任何人都可以帮助我理解如何动态指定xpath所以我可以迭代元素吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以尝试下面的内容。这使用了PageObject模型,以及Selenium和Appium。它利用了uiAutomator,而不是Xpath。

public class PageObjectXYZ {

    private AndroidDriver driver;

    @AndroidFindBy(uiAutomator = "new UiSelector().className("android.widget.TextView")")
    private List<MobileElements> someTextViews;

    public PageObjectXYZ(AndroidDriver driver) {
        this.driver = driver;
        PageFactory.initElements(new AppiumFieldDecorator(driver), this);
    }

    public void clickTheOneIWant(String option){
        for(MobileElement me: someTextViews){
            if(me.getAttribute("text").equals(option)){
                this.driver.tap(1, me, 1000);
                break;
            }
        }
    }
}

如果你只是想使用xpath快速和脏,那么可能需要(某些程序集可能需要):

String x = "//RecyclerView/RelativeLayout/RelativeLayout/TextView";
String y = "//RecyclerView/RelativeLayout/RelativeLayout";

Android driver = new AndroidDriver(new URL("http://localhost:4723/wd/hub"), desiredCapabilities);

Arraylist<MobileElements> arrayTextViews = driver.findElementsByXpath(x);
Arraylist<MobileElements> arrayParentElements = driver.findElementsByXpath(y);

for(int i = 0; i < arrayTextViews.size(); i++){
    if(arrayTextViews.get(i).getText().equals("text I want")){
        arrayParentElements.get(i).click();
    }
}