本文说明的是在APP的原生页码中进行元素定位。

如果页面是Web(移动端里的浏览器)、混合(APP与WEBVIEW)里含有WEBVIEW页面进行元素定位,元素定位方法同Selenium WebDriver一致,则可以参考Selenium部分的笔记进行参考。

元素定位工具

  • Android使用Android SDK里的uiautomatorviewer工具。
  • IOS使用Appium Desktop里的Appium Inspector检查器。

1、by_id定位

通过id属性定位元素,IOS应用上的元素没有这个属性,所以仅支持Android。

代码如下:

# 单数
driver.find_element_by_id("id属性值") # 复数
driver.find_elements_by_id("id属性值")

如下图所示:利用uiautomatorviewer工具查看元素信息,resource-id属性就是元素的id属性。

练习:

开启Appium服务,执行如下代码:

"""
1.学习目标
必须掌握appium中元素定位基本方法(这些方法我们在Selenium中学习过) 练习目标:掌握元素定位方式 id定位
2.操作步骤
id定位
只适用于Android,IOS不支持,id并不是唯一属性标识
driver.find_element_by_id("id属性值") # 单数
driver.find_elements_by_id("id属性值") # 复数
id属性 resource-id表示
3.需求
在设置APP中使用id属性定位“显示”
""" # 1.导入appium
import time
from appium import webdriver # 2.创建Desired capabilities对象,添加启动参数
desired_caps = {
"platformName": "Android", # 系统名称
"platformVersion": "7.1.2", # 系统版本
"deviceName": "127.0.0.1:21503", # 设备名称
"appPackage": "com.android.settings", # APP包名
"appActivity": ".Settings" # APP启动名
} # 3.启动APP
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps) # 4.定位元素
# 在移动端,元素的id不再是唯一的,
# 我们可以在uiautomatorviewer工具查看到,一个页面中类似元素的id都是相同的。
# 这个时候我们就要用driver.find_elements_by_id来定位元素
# 对应的字段resource-id属性值。
# 4.1 定位设置app界面中的所有标题
id_elements = driver.find_elements_by_id("android:id/title") # 4.2 查看一共获取了多少标题title
print("元素数量:" + str(len(id_elements))) # 4.3 遍历获取标题对应的文本
for element in id_elements:
print(element.text) # 遍历打印所有元素的text值 # 5.关闭APP
time.sleep(3)
driver.quit()

输出结果如下:

元素数量:12
建议
设置屏幕锁定
无线和网络
WLAN
蓝牙
更多
设备
显示
通知
声音
应用
存储

2、by_name定位

Appium版本在1.5之后,Android就不再支持name的元素定位方法。

Android如果使用name方法,则报如下错误:

selenium.common.exceptions.InvalidSelectorException:

Message: Locator Strategy 'name' is not supported for this session

IOS可以正常使用name元素定位。

代码如下:

# 单数
driver.find_element_by_name("name") # 复数
driver.find_elements_by_name("name")

如图所示:利用Appium Inspector检查器,name属性指的是name属性。

使用命令:driver.find_element_by_name("3个月")

这里我们就不做演示了。

3、by_class_name定位

通过class_name属性定位元素。

代码如下:

# 单数
driver.find_element_by_class_name("class值") # 复数
driver.find_elements_by_class_name("class值")

1)Android:

如图所示:利用uiautomatorviewer工具查看,class_name属性指的是class属性。

2)IOS:

如图所示:利用Appium Inspector检查器,class_name属性指的是type属性。

使用命令:driver.find_element_by_class_name("XCUIElementTypeStaticText")

练习:

"""
1.学习目标
必须掌握appium中元素定位基本方法(这些方法我们在Selenium中学习过) 练习目标:掌握元素定位方式 class_name定位
2.操作步骤
class_name定位
Android和IOS都适用
Android 是 class属性
IOS 是 type属性
driver.find_element_by_class_name("class属性值") # 单数
driver.find_elements_by_class_name("class属性值") # 复数
3.需求
在设置APP中使用class_name定位“显示”标题
""" # 1.导入appium
import time
from appium import webdriver # 2.创建Desired capabilities对象,添加启动参数
desired_caps = {
"platformName": "Android", # 系统名称
"platformVersion": "7.1.2", # 系统版本
"deviceName": "127.0.0.1:21503", # 设备名称
"appPackage": "com.android.settings", # APP包名
"appActivity": ".Settings" # APP启动名
} # 3.启动APP
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps) # 4.定位元素
# 在移动端,一个页面中的很多元素的class_name属性值是相同的,
# 我们可以通过uiautomatorviewer工具查看到,例如设置app的首页面。
# 这个时候我们就要用driver.find_elements_by_class_name来定位元素
# 对应的字段class属性值。
# 4.1 使用class_name属性定位设置app界面中的所有标题
class_elements = driver.find_elements_by_class_name("android.widget.TextView") # 4.2 查看一共获取了多少标题title
print("元素数量:" + str(len(class_elements))) # 4.3 遍历获取标题对应的文本
for element in class_elements:
print(element.text) # 遍历打印所有元素的text值 # 5.关闭APP
time.sleep(3)
driver.quit()

运行结果:

元素数量:23
设置 建议 设置屏幕锁定
保护您的设备
无线和网络
WLAN
"hghtsj2650"
蓝牙
已停用
更多
设备
显示
自动调节亮度功能已关闭
通知
已允许所有应用发送通知
声音
铃声音量为 71%
应用
已安装 14 个应用
存储
已使用 58.44 GB(共 64.51 GB)

4、by_xpath定位

通过xpath定位元素,这样就可以在页面中定位一个单个的元素了。

(如果一个元素的id属性或者class_name属性也是唯一的,我们也可以通过id属性或者class_name属性进行定位。)

代码如下:

# 单数
driver.find_element_by_xpath("xpath") # 复数
driver.find_elements_by_xpath("xpath")

在移动端xpath用法与Web Selenium中的用法一致,在移动端自动化测试中使用xpath定位元素是比较多的。

练习:

"""
1.学习目标
必须掌握appium中元素定位基本方法(这些方法我们在Selenium中学习过) 练习目标:掌握元素定位方式 xpath定位
2.操作步骤
Android和IOS都适用,使用方式和selenium没有区别
driver.find_element_by_xpath("xpath表达式") # 单数
driver.find_elements_by_xpath("xpath表达式") # 复数
3.需求
在设置APP中使用xpath定位“显示”标题
""" # 1.导入appium
import time
from appium import webdriver # 2.创建Desired capabilities对象,添加启动参数
desired_caps = {
"platformName": "Android", # 系统名称
"platformVersion": "7.1.2", # 系统版本
"deviceName": "127.0.0.1:21503", # 设备名称
"appPackage": "com.android.settings", # APP包名
"appActivity": ".Settings" # APP启动名
} # 3.启动APP
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps) # 4.定位元素
# 4.1 xpath定位 “显示”按钮
more = driver.find_element_by_xpath("//*[@text='显示']") # 4.2 点击“显示”元素,进入显示页面。
more.click() # 5.关闭APP
time.sleep(3)
driver.quit()

5、by_accessibility_id定位

通过accessibility_id属性查找元素。(移动端特有)

表示附加到给定元素的辅助功能标识或标签的字符串。

针对IOS的辅助功能标识符和针对Android的内容描述。

代码如下:

# 单数
driver.find_element_by_accessibility_id("accessibility_id") # 复数
driver.find_elements_by_accessibility_id("accessibility_id")

1)Android:

如图所示:利用uiautomatorviewer工具查看,accessibility_id属性指的是content-desc属性。

练习:

"""
1.学习目标
掌握appium中accessibility_id元素定位方法
2.操作步骤
使用方法:
driver.find_element_by_accessibility_id("content-desc属性值")
3.需求
在设置APP中使用accessibility_id方法定位搜索按钮
""" # 1.导入appium
import time
from appium import webdriver # 2.创建Desired capabilities对象,添加启动参数
desired_caps = {
"platformName": "Android", # 系统名称
"platformVersion": "7.1.2", # 系统版本
"deviceName": "127.0.0.1:21503", # 设备名称
"appPackage": "com.android.settings", # APP包名
"appActivity": ".Settings" # APP启动名
} # 3.启动APP
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps) # 4.定位元素
# 4.1 定位搜索按钮,通过accessibility_id方法
search = driver.find_element_by_accessibility_id("搜索设置") # 4.2 点击搜索按钮
search.click() # 5.关闭APP
time.sleep(3)
driver.quit()

2)IOS:

如图所示:利用Appium Inspector检查器,accessibility_id指的是accessibility id属性或name属性或label属性。

使用方法:driver.find_element_by_accessibility_id("More Info")

6、by_android_uiautomator定位

通过Android UIAutomator搜索查找元素。(Android系统特有)

这允许使用UIAutomator库,使用递归元素搜索来找到Android应用程序中的元素。

代码如下:

# 单数
driver.find_element_by_android_uiautomator("android_uiautomator") # 复数
driver.find_elements_by_android_uiautomator("android_uiautomator")

可以利用uiautomatorviewer工具查看元素属性信息。

UiSelector工具类介绍

1)text属性的方法(text指的是text属性)

text指的是text属性)

  • 完全匹配。

    driver.find_element_by_android_uiautomator('new UiSelector().text("AndroidUI")')
  • 包含匹配(模糊定位)。

    driver.find_element_by_android_uiautomator('new UiSelector().textContains("Android")')
  • 以什么内容开始匹配。

    driver.find_element_by_android_uiautomator('new UiSelector().textStartsWith("AndroidUI")')
  • 正则匹配查找。

    driver.find_element_by_android_uiautomator('new UiSelector().textMatches("^Android.*")')

2)className属性的方法

className指的是class属性)

  • 完全匹配

    driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.TextView").text("AndroidUI")')
  • 正则匹配查找

    driver.find_element_by_android_uiautomator('new UiSelector().classNameMatches(".*TextView$").text("AndroidUI")')

3)xpath方法定位

driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.TextView").childSelector(new UiSelector().text("AndroidUI"))')

4)resourceId属性的方法

resourceId指的是resource-id属性)

  • driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.android.calculator2:id/op_add")')
  • driver.find_element_by_android_uiautomator('new UiSelector().resourceIdMatches(".*id/op_add$")')

5)description属性的方法

description指的是content-desc属性)

  • driver.find_element_by_android_uiautomator('new UiSelector().description("加")')

  • driver.find_element_by_android_uiautomator('new UiSelector().descriptionStartsWith("加")')

  • driver.find_element_by_android_uiautomator('new UiSelector().descriptionMatches("^加.*")')

UiSelector类中还支持其他一些方法,比如根据控件属性是否可点击可聚焦可长按等来缩小要定位的控件的范围,具体使用方法不一一列举了。

练习:

"""
1.学习目标
了解appium中元素定位Android专用方法 Android_UIautomator
2.操作步骤
使用方法:
driver.find_element_by_android_uiautomator("java代码")
java代码中使用 UiSelector类来处理元素的定位
new UiSelector().text("文本内容")
3.需求
在设置APP中使用Android专用的定位方法 """
# 1.导入appium
import time
from appium import webdriver # 2.创建Desired capabilities对象,添加启动参数
desired_caps = {
"platformName": "Android", # 系统名称
"platformVersion": "7.1.2", # 系统版本
"deviceName": "127.0.0.1:21503", # 设备名称
"appPackage": "com.android.settings", # APP包名
"appActivity": ".Settings" # APP启动名
} # 3.启动APP
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps) # 4.定位元素
# 4.1 定位蓝牙,通过Android_UIautomator方法
# 单引号里面是Java代码,使用`UiSelector`这个类来定位元素。
blue_tooth = driver.find_element_by_android_uiautomator('new UiSelector().text("蓝牙")')
# 注意:
# 上面'new UiSelector().text("蓝牙")'中,一定是外单引号,里边双引号
# 因为这是一段Java代码,而text()方法中要传入一个string类型的参数
# Java中String类型的参数是加双引号的,所以必须是外单内双
# 否则会报错。 # 4.2 点击搜索按钮
blue_tooth.click() # 5.关闭APP
time.sleep(3)
driver.quit()

『与善仁』Appium基础 — 20、Appium元素定位的更多相关文章

  1. 『动善时』JMeter基础 — 20、JMeter配置元件【HTTP Cookie管理器】详细介绍

    目录 1.HTTP Cookie管理器介绍 2.HTTP Cookie管理器界面详解 3.JMeter中对Cookie的管理 (1)Cookie的存储 (2)Cookie的管理策略 4.补充:Cook ...

  2. 『与善仁』Appium基础 — 27、模拟手势点击坐标

    目录 1.模拟手势点击坐标 2.tap()用法 3.练习 4.弊端 1.模拟手势点击坐标 在定位元素的时候,你使出了十八班武艺还是定位不到,怎么办呢?(面试经常会问) 那就拿出绝招:点击元素所在位置的 ...

  3. 『与善仁』Appium基础 — 10、Appium基本原理

    目录 1.Appium自动化测试架构 2.Appium架构图 3.Session说明 4.Desired Capabilities说明 5.Appium Server说明 6.Appium Clien ...

  4. 『与善仁』Appium基础 — 12、Appium的安装详解

    目录 (一)Appium server安装 方式一:(桌面方式:推荐) 1.Appium Desktop下载 2.Appium Desktop安装 3.Appium Desktop使用 方式二:(No ...

  5. 『与善仁』Appium基础 — 14、Appium测试环境搭建

    目录 1.Appium测试环境搭建整体思路 (1)Android测试环境搭建 (2)Appium测试环境搭建 (3)测试脚本语言的环境搭建 2.Appium在Android端和IOS端的工作流程 (1 ...

  6. 『与善仁』Appium基础 — 15、使用Appium的第一个Demo

    我们使用Python语言作为测试脚本的编写语言. 执行脚本前提: Android模拟器或者手机是开机状态. 使用确保电脑和Android设备进行了链接. 也就是使用ADB命令adb connect链接 ...

  7. 『与善仁』Appium基础 — 17、元素定位工具(一)

    目录 1.uiautomatorviewer介绍 2.uiautomatorviewer工具打开方式 3.uiautomatorviewer布局介绍 4.uiautomatorviewer工具的使用 ...

  8. 『与善仁』Appium基础 — 18、元素定位工具(二)

    目录 1.Appium Inspector介绍 2.Appium Inspector打开方式 3.Appium Inspector布局介绍 4.Appium Inspector工具的配置 5.Appi ...

  9. 『与善仁』Appium基础 — 19、元素定位工具(三)

    目录 1.Chrome Inspect介绍 2.Chrome Inspect打开方式 3.Chrome Inspect工具的使用 (1)Chrome Inspect工作前提 (2)Chrome Ins ...

随机推荐

  1. Part 29 AngularJS intellisense in visual studio

    In the previous videos if you have noticed as we were typing the angular code in Script.js file we w ...

  2. C# 获取PDF中的数字签名证书

    PDF中的加数字签名是对文档权威性的有效证明.我们在向PDF文档添加签名时,需要准备可信任的签名证书.同时,对已有的签名,可验证签名是否有效,也可以获取文档中的签名证书信息.下面,以C#代码示例展示如 ...

  3. [nowcoder5668H]Sort the Strings Revision

    考虑对于$p_{i}=0$,那么可以快速比较出$s_{0},s_{1},...,s_{i-1}$与$s_{i},s_{i+1},...,s_{n}$之间的大小关系,然后对两边分别找到最小的$p_{i} ...

  4. uniapp中vuex的基本使用

    1. 创建一个uniapp项目 2. 在项目目录下用npm安装 vuex npm install vuex --save 3. 在项目根目录下创建 store文件夹,在store文件夹中创建 inde ...

  5. Neville 插值方法

    简介 wikipedia: Neville's method 在数学上,Neville 算法是一种计算插值多项式方法,由数学家Eric Harold Neville提出.由给定的n+1个节点,存在一个 ...

  6. Python通过subprocess.Popen.poll控制流程

    python写流程控制的时候,有时需要等待运行结果完成才能进行下一步.有几个想法: 一是反复循环判断直到生成结果文件(且文件中有预期结果),低效易出错: 二是用subprocess模块来判断进程结果, ...

  7. 如何鉴定全基因组加倍事件(WGD)

    目前鉴定全基因组加倍(whole-genome duplication events)有3种 通过染色体共线性(synteny) 方法是比较两个基因组的序列,并将同源序列的位置绘制成点状图,如果能在点 ...

  8. 毕业设计之zabbix 之mysql主从状态的监控

    建立监控脚本在自定义的位置 /usr/local/zabbix/script/ [root@mysql.quan.bbs script]$pwd /usr/local/zabbix/script [r ...

  9. Hi3516开发笔记(六):通过HiTools使用USB/串口将uboot、kernel、roofts和userdata按照分区表烧写镜像

    若该文为原创文章,转载请注明原文出处本文章博客地址:https://hpzwl.blog.csdn.net/article/details/121706033红胖子(红模仿)的博文大全:开发技术集合( ...

  10. linux系统中安装MySQL

    linux系统中安装MySQL 检查原来linux系统中安装的版本 rpm -qa | grep mysql 将其卸载掉 以 mysql-libs-5.1.71-1.el6.x86_64 版本为例 r ...