Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >appium 元素定位方法总结(一)

appium 元素定位方法总结(一)

作者头像
赵云龙龙
发布于 2021-04-23 03:15:13
发布于 2021-04-23 03:15:13
4.9K04
代码可运行
举报
文章被收录于专栏:python爱好部落python爱好部落
运行总次数:4
代码可运行

在做UI自动化的时候,有一部分精力是定位元素,元素定位得准不准,直接影响自动化的成败和效率。 mobile和web一样,也是通过driver来定位元素的。selenium有8种定位方法,appium有哪些定位方法呢? 常用的方法有:

  1. 通过id定位元素
  2. 通过class_name定位元素
  3. 通过content-desc定位元素
  4. 通过text定位元素
  5. 通过xpath定位元素
  6. 通过uiautomator定位元素,android独有

一般的元素属性有:

  • 使用uiautomator定位 driver.find_element_by_android_uiautomator(uia_string)
  • 根据 resourceId 属性 定位
  • 根据 text、description、className、index属性定位
  • 根据content-desc定位 driver.find_element_by_accessibility_id()
  • 根据xpath定位 driver.find_element_by_xpath()

元素定位

  • find_element_by_xxx符合条件的第一个元素,找不到抛出异常
  • find_elements_by_xxx符合条件的所有元素的列表,找不到返回空列表
  • 通过WebDriver查找范围是整个界面的树形结构
  • 通过WebElement查找的是该节点的子节点
通过id定位元素find_element_by_id
  • 元素的resource-id
  • 唯一标识该元素的值(id有时候并不唯一) 使用前最好先判断下id是否唯一
  • 一般优先根据id定位
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# resource-id = 'io.manong.developerdaily:id/edt_phone'
driver.find_element_by_id("io.manong.developerdaily:id/edt_phone")

通过class_name定位元素find_element_by_class_name
  • clsaa属性决定了界面元素的类型
  • 如果我们要查找某种类型的界面元素,且该类型界面元素在当前界面中只有一个,则可以使用此方法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
driver.find_element_by_class_name('android.widget.Button')

通过content-desc定位元素find_dlement_by_accessibility_id
  • content-desc属性是用来描述该元素的作用
  • 如果要查询的界面元素的content-desc在当前界面唯一,则可以使用此方法
  • 大部分情况下,该字段为空
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
driver.find_dlement_by_accessibility_id('test')

通过text定位元素driver.find_element_by_android_uiautomator("text('xxx')")
  • 元素id相同时,可以根据text来进行定位
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
driver.find_element_by_android_uiautomator("text('热点')")

通过xpath定位元素
  • xpath定位方法可参考:Selenium学习005-元素选择之xpath
  • 当以上方法都无法定位到具体元素时,可以采用xpath方法定位元素
    1. 通过定位工具发现底部几个栏位是同一个class,只有index和界面图标不同
    2. 首先,根据id定位可唯一判断的元素
    3. 然后,找到此唯一元素下级目录汇总class属相对应元素
    4. 最后,取出列表中自己想要的值 注:index从0开始计算,xpath从1开始计算
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 方法一:xpath
xpath = "//*[@resource-id='io.manong.developerdaily:id/tab_layout']//android.widget.RelativeLayout[2]"
driver.find_element_by_xpath(xpath)

# 方法二:xpath+index
xpath = "//*[@resource-id='io.manong.developerdaily:id/tab_layout']//android.widget.LinearLayout//[@index=1]"
driver.find_element_by_xpath(xpath)

实例代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# coding=utf-8

from appium import webdriver
import time,traceback

desired_caps = {}  # 定义字典:告诉appium我们的一些配置
desired_caps['platformName'] = 'Android'  # 固定值
desired_caps['platformVersion'] = '6'  # android版本
desired_caps['deviceName'] = 'test'  # 连接多个设备时会用到 ?
# desired_caps['app'] = r'/Users/liuhuaiyuan/Downloads/toutiao.apk' # apk在电脑上的路径
desired_caps['appPackage'] = 'io.manong.developerdaily' # apk的package  通过aapt命令查找
desired_caps['appActivity'] = 'io.toutiao.android.ui.activity.LaunchActivity' # 指定apk的启动界面(通常启动界面是唯一的) 通过aapt命令查找
desired_caps['unicodeKeyboard']  = True  # 安装中文输入法,以便于控制,及部分中文的输入
desired_caps['resetKeyboard']  = True  # 针对上一条语句,如果手机还有其他的输入法,还原输入法,便于其他操作
desired_caps['noReset'] = True   # 重要参数,=True 恢复默认值,=False(缺省值) 每次都是从刚安装app的状态进入(格式化状态),可能会显示欢迎页等
desired_caps['newCommandTimeout'] = 6000  # 设置等待时间,当超过这个时间时,将断开与appium的连接。单位是秒
#启动Remote RPC
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps ) # 连接appium,并将参数(字典)传入,执行完此句后,与appium创建一个session
# 0.0.0.0:4723
try:
    driver.implicitly_wait(10)  # 隐式等待,每0.5秒查询一次,直到指定时间,结束。单位是秒

    # 根据id找到元素,并点击,id和 html 元素的id不同
    driver.find_element_by_id("io.manong.developerdaily:id/tab_bar_plus").click()
    time.sleep(1)

    # 定位到密码方式登录
    driver.find_element_by_xpath("//*[@resource-id='io.manong.developerdaily:id/tab_layout']//android.widget.RelativeLayout[2]").click()

    driver.find_element_by_id("io.manong.developerdaily:id/edt_phone").send_keys('xxxxxx')
    driver.find_element_by_id("io.manong.developerdaily:id/edt_password").send_keys('xxxxx')

    time.sleep(2)
    # 点击登录
    driver.find_element_by_id('io.manong.developerdaily:id/btn_login').click()
    pass

except:
    print (traceback.format_exc())

driver.quit(

根据content-desc定位 driver.find_element_by_accessibility_id()

uia_string:uia_string - The element name in the Android UIAutomator library 使用UIAutomator元素属性名称来定位

根据 resourceId 属性 定位

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("%s")')

举例:如下图,点击顶部扫码器:

对应uiautomator名称:“resource-id”:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.rfchina.app.supercommunity:id/square_title_btn_scan")').click()

选择resource-id 定位需要特别注意,界面中 resource-id 不是唯一的,有可能存在很多控件的resource-id是相同的。

根据 text、description、className、index属性定位

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 根据 text 定位
driver.find_element_by_android_uiautomator('new UiSelector().text("%s")')  #对应uiautomator名称:“text”

# 根据 description 定位
driver.find_element_by_android_uiautomator('new UiSelector().description("%s")')  # 对应uiautomator名称:“content-desc”

# 根据 className 定位
driver.find_element_by_android_uiautomator('new UiSelector().className("%s")') # 对应uiautomator名称:“class”

# 根据 index 定位
driver.find_element_by_android_uiautomator('new UiSelector().index("%s")') # 对应uiautomator名称:“index”

选择className 定位需要特别注意,界面中 class 往往都不是唯一的,大量控件的class会一样。

根据xpath定位 driver.find_element_by_xpath()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from appium import webdriver
import time

desired_caps = {
    "appPackage": "com.rfchina.app.supercommunity",
    "appActivity": "com.rfchina.app.supercommunity.client.StartActivity",
    "platformName": "Android",
    "deviceName": "Android Emulator"
}

driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(5)
driver.find_element_by_id("com.rfchina.app.supercommunity:id/img_serivce_communities_layout").click()

xpath是最常见的定位方法,虽然性能可能是最慢的,但是它是最万能的。 我们可以用模糊匹配来查找

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
driver.find_element_by_xpath("//android.widget.TextView[@text='speaking']")

获取toast

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
driver.find_element_by_xpath("//*[contains(@text,‘toast 信息’)]")

这里只介绍了android的定位方法,ios其实也差不多, 其实IOS中的Type, 相当于android中的class, IOS中的name, 相当于android中的text, 其实IOS中的content_desc, 相当于android中的accessbility_id, 这个后面再讲。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python粉丝团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Appium自动化(9) - appium元素定位的快速入门
https://www.cnblogs.com/poloyy/category/1693896.html
小菠萝测试笔记
2020/06/09
1K0
Appium自动化(9) - appium元素定位的快速入门
自动化-Appium-元素定位(Python版)
本章节讲解是指在原生(APP)下进行元素定位,如果是Web(移动端里的浏览器)、混合(APP与WEBVIEW)里含有WEBVIEW页面进行元素定位,元素定位方法同Selenium一致,则可以参考Selenium章节里的元素定位子章节。
wangmcn
2022/07/25
2.3K0
自动化-Appium-元素定位(Python版)
Appium 定位方法例子(4)
这是一个攻坚战,来首战斗音乐助兴 有朋友留言反应定位不到元素,没错,船长也为这个一直在头疼,我用的App是原生安卓+webService+h5类型的,定位虽然没问题,但是在进行操作的时
孟船长
2018/05/18
8340
技术分享 | app自动化测试(Android)--高级定位技巧
通常使用定位器定位页面上的元素会发生一些定位不到元素,或者定位失败的情况。有可能是页面上元素不唯一,有可能是页面发生变化。这节介绍定位元素的高级用法,使用层级关系定位或者多重属性定位的方式来确定元素的唯一性,从而更精准,更稳定的定位到想要的元素。
霍格沃兹测试开发
2022/06/13
1.5K0
Appium+python自动化12-appium元素定位
前言 appium定位app上的元素,可以通过id,name.class这些属性定位到 一、id定位 1.appium的id属性也就是通过UI Automator工具查看的resource-id属性
上海-悠悠
2018/04/08
1.2K0
Appium+python自动化12-appium元素定位
自动化测试之路 —— Appium元素定位
当今社会,人们的生活几乎已经无法离开形形色色的APP了,它提供给我们的便利与服务意义远远超出了其本身的软件价值。作为测试来说移动应用也早已是各大互联网公司的拳头产品,其本身的开发周期短,附属产品价值高等特性决定了今后的主导地位。
Austin_zhai
2022/08/29
1.1K0
自动化测试之路 —— Appium元素定位
appium+python自动化32-android_uiautomator定位进阶版
前言 上一盘介绍uiautomator的定位方式都是类似这种'new UiSelector().xxx("xxx")',看起非常长,我也记不住,这很不python。于是本篇优化了定位方法,去掉该死的'new UiSelector().' 一、组合定位 1.一般组合用id,class,text这三个属性会比较好一点,其次description这个属性也可以一起两两组合 2.id与text属性组合 ``` # 1.id+text id_text = 'resourceId("com.baidu.yuedu:id
上海-悠悠
2018/04/08
1.3K0
appium+python自动化32-android_uiautomator定位进阶版
Appium+python (3) 元素定位(1)
打开问价夹下面的uiautomatorviewer: 夜神模拟器里的App后,回到uiautomatorviewer: 点击左上角的Device Screenshot,这时你的夜神模拟器页面就
孟船长
2018/05/18
2K0
Appium定位 5 ——xpath
今天我们先来和大家说一下appium,上一次说到了定位,不知道大家定位的怎么样了,今天来说如何定位xpath,五分钟即可学会: 例1: 现在我想定位下面这个登录按钮: xpath该怎么写呢? 先不管三
孟船长
2018/05/18
1.2K0
python appium笔记(二):元素定位
#这里的示例是用android来说明的,xpath应该是通用的,resource-id不太清楚,没配过IOS的环境
free赖权华
2018/08/02
1.6K0
python appium笔记(二):元素定位
Appium之「元素定位和UiAutomator表达式」
xpath 相对定位:如果相对定位中这个元素是有 id 的,这个 id 是唯一的,xpath 定位中优先通过 id 来定位。
清菡
2020/10/05
1.8K0
技术分享 | app自动化测试(Android)--高级定位技巧
通常使用定位器定位页面上的元素会发生一些定位不到元素,或者定位失败的情况。有可能是页面上元素不唯一,有可能是页面发生变化。这节介绍定位元素的高级用法,使用层级关系定位或者多重属性定位的方式来确定元素的唯一性,从而更精准,更稳定的定位到想要的元素。
Hogwarts_测试
2022/06/13
9180
Appium自动化(10) - appium高级元素定位方式之 UI Automator API 的详解
https://www.cnblogs.com/poloyy/category/1693896.html
小菠萝测试笔记
2020/06/09
1.5K0
Appium自动化(10) - appium高级元素定位方式之 UI Automator API 的详解
appium+python自动化34-获取元素属性
前言 在做断言的时候,我们往往需要先获取目标元素的某些属性值,拿来判断,比如登录后,如何判断登录成功了呢?可以通过登录后获取账号的名称(元素的text属性)来判断。 一、获取text ``` #
上海-悠悠
2018/04/08
1.5K0
appium+python自动化34-获取元素属性
UIAutomator定位简介
UIAutomator元素定位是 Android 系统原生支持的定位方式,虽然与 xpath 类似,但比它更加好用,且支持元素全部属性定位.定位原理是通过android 自带的android uiautomator的类库去查找元素。 Appium元素定位方法其实也是基于Uiautomator来进行封装的。
清风穆云
2021/08/09
7280
Python Appium 安卓自动化测试 基本使用 - Phone Spider
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用
EXI-小洲
2023/10/16
6230
Python Appium 安卓自动化测试 基本使用 - Phone Spider
App自动化之dom结构和元素定位方式(包含滑动列表定位)
控件的基础知识和selenium一样,appium为移动端抽象出了一个控件模型,称为dom结构;会把所有的控件都理解为xml文件,在xml文件里,每个控件都有自己的类型和属性;
霍格沃兹测试开发
2022/04/24
8210
众里寻他千百度—Appium Android 元素定位方式
与Web自动化测试一样,App自动化测试过程中最重要一个环节就是元素定位,只有准确定位到了元素才能进行相关元素的操作,如输入、点击、拖拽、滑动等。appium提供了许多元素定位的方法,如id定位、name定位、class定位、层级定位等等.... 接下来将会给大家来实践运用这些定位技巧。
清风穆云
2021/08/09
1.1K0
Appium常用操作之「元素定位、swipe 滑屏操作」
建议不用 layui。layui 在有些情况下定位元素是有问题的。在环境基本上是正确的情况下,它截图截不到。所以可以舍弃 layui,直接用自带的 uiautomatorviewer(现在拥有的定位方式,它全部都支持)。
清菡
2020/12/02
3K0
Appium常用操作之「元素定位、swipe 滑屏操作」
Appium+python自动化(九)- 定位元素工具(义结金兰的两位异性兄弟)(超详解)
  环境搭建好了,其他方面的知识也准备的差不多了,那么我们就开始下一步元素定位,元素定位宏哥主要介绍如何使用uiautomatorviewer,通过定位到页面上的元素,然后进行相应的点击等操作. 此外在介绍另一款工具:Inspector。
北京-宏哥
2019/06/25
4.9K0
Appium+python自动化(九)- 定位元素工具(义结金兰的两位异性兄弟)(超详解)
推荐阅读
相关推荐
Appium自动化(9) - appium元素定位的快速入门
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验