当前位置 博文首页 > 文章内容

    app自动化测试之appium元素定位常用方法

    作者: 栏目:未分类 时间:2020-08-29 15:02:03

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    对于Android而言,查找appUI界面元素属性的工具有三种:appium desktop,uiautomatorviewer.bat,weditor。之前已经介绍过了weditor的使用,这里我将通过使用uiautomatorview工具查看元素的属性值,来介绍Android app元素定位的八种方式。

    一,使用uiautomatorview对app页面截图,查看元素属性

    • 连接Android手机
    • 在Android SDK的目录里的tools文件夹中找到uiautomatorviewer.bat文件,双击启动,会出现如下页面:(未安装Android SDK的请参考Android SDK 安装与配置

    建议创建uiautomatorviewer.bat的快捷方式到桌面,下次使用时就不需要进入到android-sdk/tools里打开。

    • 如下图,1所示位置从左至右依次为:Open(打开之前保存的布局),Device Screenshot(获取详细布局),Device Screenshot -compressed(获取简单布局),Save(保存当前页面的布局);2所示位置展示app当前页面的UI树;3所示位置展示当前app页面被选择元素的属性值。

    • 确认手机连接后,点击页面的Device Screenshot(获取详细布局)按钮,获取app当前页面的截图。此时工具页面可能会报错,请参考以下方法解决:

      1,手机系统为Android 8.0以上版本请参考Android8.0以上版本使用uiautomatorviewer定位报错解决方法,替换SDK中相应的文件。
      2,参考教程替换SDK中相应的文件后,仍然报错。请确认appium是否关闭,appium开启的状态下,uiautomatorviewer会与之冲突。

    • 查看app当前页面的元素及对应的元素属性值。
      以今日头条app为例,Node Detail里展示的便是【发布】按钮的各种属性值,后续在自动化代码中,我们就可以通过查找元素对应的属性来定位该元素并做相关操作。

    二,appium移动端自动化常用的元素定位方法

    appium继承了selenium框架中webdriver提供的元素定位方法,接下介绍几种常用的方法。

    • find_element_by_id()
      如果某个元素的resource-id对应的值在app当前页面是唯一,那么就可以优先通过id定位该元素。以上图中点击【发布】按钮为例,写法如下
    driver.find_element_by_id("com.ss.android.article.news:id/cde").click()
    

    • find_element_by_class_name()
      元素的class属性值唯一,可以通过class name定位。如下图中所指的元素,其class属性值在当前页面唯一
    find_element_by_class_name("android.widget.HorizontalScrollView")
    
    • find_element_by_xpath()
      如果不是原生app,这大概是元素定位过程中用的最多的方法,使用比较灵活。
      1,如果当前页面某元素的text属性值唯一,就可以使用text文本构造xpath,如【发布】按钮
    # "//*[@text='发布']"该字符串表示:当前页面下所有元素里面text='发布'的元素
    drvier.find_element_by_xpath("//*[@text='发布']").click()
    

    2,class唯一的话可以使用find_element_by_class_name()定位,但大部分情况向class都不是唯一的,此时可以用class与其他属性结合构成xpath,如:

    # class与text
    driver.find_element_by_xpath("//android.widget.TextView[@text='消息通知']").click()
    # class、text、resource-id结合,注意text与id之间使用and
    driver.find_element_by_xpath("//android.widget.TextView[@text='消息通知' and @resource-id='com.ss.android.article.news:id/c_3']").click()
    

    3,通过父元素定位子元素
    在实际项目中,我们可能通过UI的层级结果进行定位。如下图,我们要定位【收藏】按钮,除了使用2方外,还可以它的上一级元素定位。

    # 父元素下面有4个class相同的子元素,子元素后面不加索引,则默认定位的是第一个子元素
    driver.find_element_by_xpath("//androidx.recyclerview.widget.RecyclerView/android.widget.RelativeLayout")
    


    子元素有多个,通过class的索引定位

    # 后面的2表示索引,注意uiautomatorviewer里显示的是从0开始的,而xpath里面是从1开始
    driver.find_element_by_xpath("//androidx.recyclerview.widget.RecyclerView/android.widget.RelativeLayout[2]")
    

    4,通过元素子元素定位父元素
    即通过下一级元素定位上一级元素。

    # 后面的/..表示当前级的上一级,此处即整个下载管理按钮区域
    driver.find_element_by_xpath("//android.widget.TextView[@text='下载管理']/..")
    

    同样定位元素的上一级的上一级(孙子定位爷爷),如下

    driver.find_element_by_xpath("//android.widget.TextView[@text='下载管理']/../..")
    

    5,定位兄弟元素
    通过同级元素定位,下面以定位【下载管理】上的图标为例

    # 兄->父->兄
    driver.find_element_by_xpath("//android.widget.TextView[@text='下载管理']/../android.widget.ImageView")
    

    三,总结。

    • 具体使用什么样的方式定位,与app开发框架有关,一般使用id与xpath使用的比较多。需要注意的是,能使用的id定位元素的话就不要使用xpath定位,因为id定位元素方便维护的同时,效率也相对xpath更高。
    • xpath语法的基础知识需要有所了解,这样有助于能更好的理解元素定位。
    • 当然appium还有其他的定位元素方法,这里不做过多的介绍,有兴趣的话可以去百度其他方法。实际使用过程中,常用的就是以上几种方法。