Python+Appium自动化测试之appium元素定位常用方法

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

一,使用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还有其他的定位元素方法,这里不做过多的介绍,有兴趣的话可以去百度其他方法。实际使用过程中,常用的就是以上几种方法。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351