【问题标题】:Appium locating child element with specific value in JavaAppium在Java中定位具有特定值的子元素
【发布时间】:2016-12-14 03:34:13
【问题描述】:

我正在为原生 Android 应用上的导航抽屉苦苦挣扎。

所以抽屉里有 11 个元素,其中 9 个是可见的,其余的你必须向下滚动。

Appium Inspector view

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

Appium Inspector view

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

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

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

谁能帮助我了解如何动态指定 xpath 以便我可以遍历元素?

谢谢。

【问题讨论】:

    标签: java android xpath appium


    【解决方案1】:

    你可以试试我下面的方法。这使用 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();
        }
    }
    

    【讨论】:

    • 关于动态理解 xpath,
    • , "//" 表示从 xml 中的任何位置开始。如果要使用根元素的静态路径,请以“/”开头。您想指定首先导航到哪个元素,在您的示例中,我看不到最高的根元素,可能是“/DrawerLayout”。您可以通过使用“//RecyclerView”启动 xpath 来进一步进入文档。然后,使用“/”来降低元素。 "//RecyclerView/RelativeLayout[1] 将返回第一个 RelativeLayout 元素。您可以随时添加您想要的参数。例如 //TextView[text()='foo']
    • 谢谢,这很有帮助。我在哪里可以阅读更多关于向 xpath 添加参数的信息,例如 //TextView[text()='foo'] ?还有一种方法可以使用 xpath 或任何其他定位器来定位子元素的父元素吗?
    • 至于您的示例,我不确定如何使用 uiAutomator 定位器。我试过用谷歌搜索它,但没有找到关于定位器使用的有用信息,我尝试使用 uiAutomator 查找元素没有成功。您的示例很好,但是缺少我需要的一件事,即如果找不到该元素则向下滚动。但是,我几乎自己解决了这个问题。你知道我在哪里可以了解使用 uiAutomator 定位器等吗?会很有帮助,我读过它们非常强大,并且提供了很多用于定位元素的选项。
    • 你不应该在定位器中为引号使用转义字符:@AndroidFindBy(uiAutomator = "new UiSelector().className("android.widget.TextView")") 吗?对于类名
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    相关资源
    最近更新 更多