zoukankan      html  css  js  c++  java
  • Appium根据xpath获取控件

    如文章《 Appium基于安卓的各种FindElement的控件定位方法实践 》所述,Appium拥有众多获取控件的方法。其中一种就是根据控件所在页面的XPATH来定位控件。

    本文就是尝试通过自己的试验来尝试对Appium如何用xpath来定位控件做一个阐述,当中如有不对的地方敬请大家指出。

    1. 背景

    本文尝试使用的试验对象是SDK自带的NotePad应用实例,假设已经有两个Notes分别是“note1”和“note2”添加到Notepad上面,我们要做的就是尝试用xpath的方法来定位“note2”这个ListView下面的TextView控件。

    注意界面上有3个TextView类型的控件:

    • 最上面的作为整个ListView的Title文本为“Notes”的TextView,Index为0
    • 中间的文本为“note2”的TextView,Index也是0
    • 最下面的文本为“note1”的TextView,Index是1

    2. xPath获取控件方式

    2.1 通过判断控件属性获取控件

    控件的所有属性都可以用作判断,比如它的text,index,resource-id是否clickable等,例如:

    2.1.1 通过文本查找目标控件

    el = driver.findElementByXPath("//android.widget.TextView[contains(@text,'note2')]");
            assertThat(el.getText(),equalTo("note2"));

    2.1.2 通过index查找目标控件

    如果我们像下面的方式使用index为0来查找控件note2,那么将会失败,因为该xpath只是说“我要查找页面上android.widget.TextView类型的index为0的控件“,但如背景所说我们事实上有3个TextView控件,其中最上面的和中间的控件他们的Index都是0.所以最终获得的控件其实是Appium第一个找到的最上面文本为”Notes“的TextView。
    el = driver.findElementByXPath("//android.widget.TextView[contains(@index,0)]");
            assertThat(el.getText(),equalTo("note2"));
    那么我们就要想办法加多点路径,让xpath能分辨出需要的是下面的index为0的TextView,而不是上面的。观看上图的UIAutomatorViewer控件的分层结构,发现这两个TextView是从LinearLayout开始分叉的,所以我们应该从该路径开始通过数组下标指定我们需要的是”在LinearLayout下面的第二个FrameLayout下面的ListView下面的Index为0的TextView:
    el = driver.findElementByXPath("//android.widget.LinearLayout[1]/android.widget.FrameLayout/android.widget.ListView/android.widget.TextView[contains(@index,0)]");
            assertThat(el.getText(),equalTo("note2"));

    2.1.3 通过其他属性查找目标控件

    TBD

    ,这些就不一一列举了,参照以上两个示例进行实现就可以了

    2.2 通过指定选择集合的位置获得控件

    按照我的实践和理解,通过这种方式获取控件是不靠谱的,起码存在两个问题。

    • 问题1:控件在集合中的位置是不可控的。
    el = driver.findElementByXPath("//android.widget.TextView[1]");
            assertThat(el.getText(),equalTo("note2"));
    以上的例子我原意是想把UIAutomatorViewer里面的上中下3个TextView中的中间那个给找出来,但结果返回来给我的确实最上面的那个“Notes”。
    • 问题2:通过增加路径层数限制查找指定元素集合不起效。
    el = driver.findElementByXPath("//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout/android.widget.ListView/android.widget.TextView[0]");
            assertThat(el.getText(),equalTo("note2"));
    以上例子我本意是想通过增加父路径的限制来表明“我想要的控件是ListView下面的那两个TextView控件中的第一个”,但返回给我的是“An unknown server-side error occurred while processing the command",感觉是越界了的样子。
  • 相关阅读:
    linux软件安装方式
    docker 安装 jenkins touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
    [ERR] Node goodsleep.vip:6379 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
    Linux 常用命令 服务器间scp 用户 export 创建文件、软连接
    redis 安装 集群 主从 哨兵 docker
    WPF密码框中禁止复制、粘贴
    Application 统计在线人数
    【转义字符】HTML 字符实体< &gt: &等
    SQL语句统计每天的数据
    正则表达式计算代码数
  • 原文地址:https://www.cnblogs.com/testlife007/p/4935212.html
Copyright © 2011-2022 走看看