【2024软件测试面试必会技能】Appium自动化(6):原生app元素定位方法

元素定位方法介绍及应用:

Appium方法定位原生app元素:

通过appium inspector工具,可以获取元素的相关信息;在appium中提供了一系列的元素定位API,通过在这些API中输入指定的元素信息,就能完成元素定位,定位元素后就进行对元素进行自动操作。

appium中识别元素的方式有两种写法

方式一:driver.find_element_by_id(" ")

方式二:driver.find_element(By.ID," ")    -----推荐使用

基本元素定位如下:

前置条件

代码示例:

复制代码

from appium import webdriver  # 导入appium 驱动包
from appium.webdriver.webdriver import By   # 导入appium 定位的方法包


# 1、定义一个DesiredCapabilities配置的字典
des = {
    'platformName':'Android',
    'platformVersion':'6.0.1',  # 填写android虚拟机/真机的系统版本号
    'deviceName':'MuMu',      # 填写安卓虚拟机/真机的设备名称
    'appPackage':'com.sky.jisuanji',    # 填写被测app包名
    'appActivity':'.JisuanjizixieActivity',    # 填写被测app的入口
    'udid':'127.0.0.1:7555',    # 填写通过命令行 adb devices 查看到的udid
    'noReset':True,               # 重置APP
    'unicodeKeyboard':True,       # 支持中文输入
    'resetKeyboard':True,         # 支持重置键盘
    'newCommandTimeout':30        # 30秒没发送新命令就断开连接
       }

# 2、把配置的字典作为请求参数发送给appium服务器
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',des)

复制代码

1、ID定位(取resource-id、id、name)

driver.find_element(By.ID," ")

代码示例:

# ID 定位(取resource-id、id、name)
driver.find_element(By.ID,'com.sky.jisuanji:id/btn6').click()

2、class定位(取class)

driver.find_element(By.CLASS_NAME," ")

代码示例:

# class定位(取class)
driver.find_element(By.CLASS_NAME,'android.widget.Button').click()

注:class有时不是唯一的值,如计算器的数字按键6和9,它们的class都是相同的值,故class定位一般不推荐使用!

3、AccessibilityId定位(取content-desc)注:有些元素是没有content-desc的属性的

driver.find_element_by_accessibility_id('')    注:driver.find_element(By. )  新定位方法By已经没有accessibility_id的方法了

代码示例:

# AccessibilityId定位(取content-desc)
driver.find_element_by_accessibility_id('').click()

备注:其中name方式(取text)已不支持

Xpath定位方法:

xpath ==> XPATH 是一门标记语言 作用是在XML、XHTML 文档中查找元素

selenium xpath是1.0版本语法                           appium xpath是2.0版本语法

1、绝对路径:

绝对路径 xpath 绝对路径  /开头 从根节点直接一层一层定位找到元素;元素的全路径,包含了全部节点。这种方法写起来很长,效率不高;另一方面由于涉及到太多层,一旦中间任何一层有变动,那元素就定位不到了

 

代码示例:通过绝对路径知道计算机的数字按键 5 并点击

# xpath 绝对路径定位/开头 从根节点直接一层一层定位找到元素 遇到同层级相同的元素,用下标区分,下标从1开始
driver.find_element(By.XPATH,'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout[2]/android.widget.LinearLayout/android.widget.TableLayout/android.widget.LinearLayout[2]/android.widget.Button[2]').click

2、使用属性定位  

注:

appium中xpath属性定位格式:driver.find_element(By.XPATH,'//类名[@text="text值"]')

网页中xpath属性定位格式:driver.find_element(By.XPATH,'//标签[@id="id值"]')

text属性:
driver.find_element(By.XPATH,'//类名[@text="text值"]')
resource-id属性:
driver.find_element(By.XPATH,'//类名[@resource-id="属性值"]')
content-desc属性:
driver.find_element(By.XPATH,'//类名[@content-desc="属性值"]')
class属性:
driver.find_element(By.XPATH,'//类名')
多属性:
and表示并且 or表示或者
driver.find_element(By.XPATH,'//类名[@属性名="属性值" and @属性名="属性值"]')
driver.find_element(By.XPATH,'//类名[@属性名="属性值" or @属性名="属性值"]')

代码示例:

复制代码

# 使用属性 定位 //类名[@属性名="属性值"]
driver.find_element(By.XPATH,'//android.widget.Button[@resource-id="com.sky.jisuanji:id/btn8"]').click()
driver.find_element(By.XPATH,'//android.widget.Button[@text="8"]').click()
# 扩展:and/or
# //类名[@属性名1=“属性值1” and @属性名2=“属性值2”]
# //类名[@属性名1=“属性值1” or @属性名2=“属性值2”]
driver.find_element(By.XPATH,'//android.widget.Button[@text="8" and @resource-id="com.sky.jisuanji:id/btn8"]').click()
driver.find_element(By.XPATH,'//android.widget.Button[@text="8" or @bounds="sss"]').click()
# find_elements() 把满足条件的所有元素按匹配顺序放入列表 所以是先匹配到8 然后到9
els = driver.find_elements(By.XPATH,'//android.widget.Button[@text="9" or @text="8"]')
els[0].click()
els[1].click()

复制代码

备注:
1、所有元素的属性都可以进行定位,但必须该属性的值是界面上唯一的
2、xpath支持*代表任意个字符,比如find_element(By.XPATH,'//*[@text=text值]'),这种用法容易同时识别多个元素

3、使用部分属性值定位

当元素的属性值过长或者元素属性值内容中存在动态变化的情况下,可以使用该方法。

starts-with()   contains()    ends-with()--ends-with

起始位置匹配:starts-with()

driver.find_element(By.XPATH,'//类名[starts-with(@属性名,"部分属性值")]')

包含匹配:contains()

driver.find_element(By.XPATH,'//类名[contains(@属性名,"部分属性值")]')

末尾位置匹配:ends-with()   

driver.find_element(By.XPATH,'//类名[ends-with(@属性名,"部分属性值")]')

注:在selenium中没有该方法,ends-with()字符串结尾比对 ,是xpath2.0的函数库和语法,而xpath1.0不存在该函数,selenium中的xpath语法使用的是1.0语法,但是appium是使用xpath2.0及以上的语法

 代码示例:

复制代码

# 部分属性值定位  
# 1、元素属性过长 使用ends-with()方法
driver.find_element(By.XPATH,'//android.widget.Button[ends-with(@resource-id,"btn8")]').click()
# 2、动态元素  第一次打开 text="id_9" 第二次打开text="id_10" 第三次打开text="id_11"
# starts-with(@text,"id_")
driver.find_element(By.XPATH,'//android.widget.Button[starts-with(@text,"id_")]').click()

复制代码

uiautomator方法定位原生app元素:

appium在android端是调用其底层的UIAutomator2自动化测试框架去驱动自动化,在定位元素的时候,可以借助UIAutomator2的语法来实现定位。在代码实现上提供的API是find_element_by_android_uiautomator;利用android_uiautomator进行定位,语法必须属性值是双引号

1、根据text定位:

find_element_by_android_uiautomator('text("值")')
find_element_by_android_uiautomator('newUiSelector().text("值")')    # 'newUiSelector()'推荐使用

代码示例:

# 通过text定位
driver.find_element_by_android_uiautomator('text("5")').click()
# 推荐使用正规方法
driver.find_element_by_android_uiautomator('new UiSelector().text("5")').click()

text定位相关函数:
textContains:模糊匹配文本
textStartsWith:以某个文本开头来匹配
textMatches:正则匹配

代码示例:

复制代码

# text定位相关函数:
# textContains:模糊匹配文本
driver.find_element_by_android_uiautomator('new UiSelector().textContains("...")')
# textStartsWith:以某个文本开头来匹配
driver.find_element_by_android_uiautomator('new UiSelector().textStartsWith("...")')
# textMatches:正则匹配
driver.find_element_by_android_uiautomator('new UiSelector().textMatches("...")')

复制代码

2、根据resourceId定位:

find_element_by_android_uiautomator('resourceId("值")')
find_element_by_android_uiautomator('newUiSelector().resourceId("值")')

代码示例:

# 根据resourceId定位:
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("...")').click()

3、根据className定位:关键字className

代码示例:

# 根据className定位:关键字className
driver.find_element_by_android_uiautomator('new UiSelector().className("...")').click()

4、根据contenet-des定位:关键字description

代码示例:

# 根据contenet-des定位:关键字description
driver.find_element_by_android_uiautomator('new UiSelector().description("...")').click()

5、组合定位(类名和文本)

newUiSelector().className("类名").text("值")其它组合定位方式类推

代码示例:

# 组合定位(类名和文本):
driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.Button").text("7")').click()
driver.find_element_by_android_uiautomator('new UiSelector().text("8").className("android.widget.Button")').click()

6、根据元素关系定位

1)后代元素定位:
使用条件:子元素属性不定,不唯一,只能通过父元素来定位
newUiSelector().resourceId("值").childSelector(className("值").instance(数字))
其中childSelector可以传入resourceId、description等方法
instance表示匹配的结果所有元素里面的第几个元素,从0开始计数

代码示例:

# 后代元素定位
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.sky.jisuanji:id/tablelayout").childSelector(className("android.widget.Button").instance(3))').click()

2)兄弟元素定位
通过子元素找到父元素,然后通过父元素再去找兄弟元素
newUiSelector().resourceId("值").fromParent(text("值"))
fromParent()表示从元素的父元素下查找

代码示例:

# 兄弟元素定位
driver.find_element_by_android_uiautomator('new UiSelector().text("7").fromParent(text("9"))').click()
ends_with()字符串结尾比对 == 是xpath2.0的函数库、语法 而xpath1.0不存在该函数

元素定位方法介绍及应用:

Appium方法定位原生app元素:

通过appium inspector工具,可以获取元素的相关信息;在appium中提供了一系列的元素定位API,通过在这些API中输入指定的元素信息,就能完成元素定位,定位元素后就进行对元素进行自动操作。

appium中识别元素的方式有两种写法

方式一:driver.find_element_by_id(" ")

方式二:driver.find_element(By.ID," ")    -----推荐使用

基本元素定位如下:

前置条件

代码示例:

复制代码

from appium import webdriver  # 导入appium 驱动包
from appium.webdriver.webdriver import By   # 导入appium 定位的方法包


# 1、定义一个DesiredCapabilities配置的字典
des = {
    'platformName':'Android',
    'platformVersion':'6.0.1',  # 填写android虚拟机/真机的系统版本号
    'deviceName':'MuMu',      # 填写安卓虚拟机/真机的设备名称
    'appPackage':'com.sky.jisuanji',    # 填写被测app包名
    'appActivity':'.JisuanjizixieActivity',    # 填写被测app的入口
    'udid':'127.0.0.1:7555',    # 填写通过命令行 adb devices 查看到的udid
    'noReset':True,               # 重置APP
    'unicodeKeyboard':True,       # 支持中文输入
    'resetKeyboard':True,         # 支持重置键盘
    'newCommandTimeout':30        # 30秒没发送新命令就断开连接
       }

# 2、把配置的字典作为请求参数发送给appium服务器
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',des)

复制代码

1、ID定位(取resource-id、id、name)

driver.find_element(By.ID," ")

代码示例:

# ID 定位(取resource-id、id、name)
driver.find_element(By.ID,'com.sky.jisuanji:id/btn6').click()

2、class定位(取class)

driver.find_element(By.CLASS_NAME," ")

代码示例:

# class定位(取class)
driver.find_element(By.CLASS_NAME,'android.widget.Button').click()

注:class有时不是唯一的值,如计算器的数字按键6和9,它们的class都是相同的值,故class定位一般不推荐使用!

3、AccessibilityId定位(取content-desc)注:有些元素是没有content-desc的属性的

driver.find_element_by_accessibility_id('')    注:driver.find_element(By. )  新定位方法By已经没有accessibility_id的方法了

代码示例:

# AccessibilityId定位(取content-desc)
driver.find_element_by_accessibility_id('').click()

备注:其中name方式(取text)已不支持

Xpath定位方法:

xpath ==> XPATH 是一门标记语言 作用是在XML、XHTML 文档中查找元素

selenium xpath是1.0版本语法                           appium xpath是2.0版本语法

1、绝对路径:

绝对路径 xpath 绝对路径  /开头 从根节点直接一层一层定位找到元素;元素的全路径,包含了全部节点。这种方法写起来很长,效率不高;另一方面由于涉及到太多层,一旦中间任何一层有变动,那元素就定位不到了

 

代码示例:通过绝对路径知道计算机的数字按键 5 并点击

# xpath 绝对路径定位/开头 从根节点直接一层一层定位找到元素 遇到同层级相同的元素,用下标区分,下标从1开始
driver.find_element(By.XPATH,'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout[2]/android.widget.LinearLayout/android.widget.TableLayout/android.widget.LinearLayout[2]/android.widget.Button[2]').click

2、使用属性定位  

注:

appium中xpath属性定位格式:driver.find_element(By.XPATH,'//类名[@text="text值"]')

网页中xpath属性定位格式:driver.find_element(By.XPATH,'//标签[@id="id值"]')

text属性:
driver.find_element(By.XPATH,'//类名[@text="text值"]')
resource-id属性:
driver.find_element(By.XPATH,'//类名[@resource-id="属性值"]')
content-desc属性:
driver.find_element(By.XPATH,'//类名[@content-desc="属性值"]')
class属性:
driver.find_element(By.XPATH,'//类名')
多属性:
and表示并且 or表示或者
driver.find_element(By.XPATH,'//类名[@属性名="属性值" and @属性名="属性值"]')
driver.find_element(By.XPATH,'//类名[@属性名="属性值" or @属性名="属性值"]')

代码示例:

复制代码

# 使用属性 定位 //类名[@属性名="属性值"]
driver.find_element(By.XPATH,'//android.widget.Button[@resource-id="com.sky.jisuanji:id/btn8"]').click()
driver.find_element(By.XPATH,'//android.widget.Button[@text="8"]').click()
# 扩展:and/or
# //类名[@属性名1=“属性值1” and @属性名2=“属性值2”]
# //类名[@属性名1=“属性值1” or @属性名2=“属性值2”]
driver.find_element(By.XPATH,'//android.widget.Button[@text="8" and @resource-id="com.sky.jisuanji:id/btn8"]').click()
driver.find_element(By.XPATH,'//android.widget.Button[@text="8" or @bounds="sss"]').click()
# find_elements() 把满足条件的所有元素按匹配顺序放入列表 所以是先匹配到8 然后到9
els = driver.find_elements(By.XPATH,'//android.widget.Button[@text="9" or @text="8"]')
els[0].click()
els[1].click()

复制代码

备注:
1、所有元素的属性都可以进行定位,但必须该属性的值是界面上唯一的
2、xpath支持*代表任意个字符,比如find_element(By.XPATH,'//*[@text=text值]'),这种用法容易同时识别多个元素

3、使用部分属性值定位

当元素的属性值过长或者元素属性值内容中存在动态变化的情况下,可以使用该方法。

starts-with()   contains()    ends-with()--ends-with

起始位置匹配:starts-with()

driver.find_element(By.XPATH,'//类名[starts-with(@属性名,"部分属性值")]')

包含匹配:contains()

driver.find_element(By.XPATH,'//类名[contains(@属性名,"部分属性值")]')

末尾位置匹配:ends-with()   

driver.find_element(By.XPATH,'//类名[ends-with(@属性名,"部分属性值")]')

注:在selenium中没有该方法,ends-with()字符串结尾比对 ,是xpath2.0的函数库和语法,而xpath1.0不存在该函数,selenium中的xpath语法使用的是1.0语法,但是appium是使用xpath2.0及以上的语法

 代码示例:

复制代码

# 部分属性值定位  
# 1、元素属性过长 使用ends-with()方法
driver.find_element(By.XPATH,'//android.widget.Button[ends-with(@resource-id,"btn8")]').click()
# 2、动态元素  第一次打开 text="id_9" 第二次打开text="id_10" 第三次打开text="id_11"
# starts-with(@text,"id_")
driver.find_element(By.XPATH,'//android.widget.Button[starts-with(@text,"id_")]').click()

复制代码

uiautomator方法定位原生app元素:

appium在android端是调用其底层的UIAutomator2自动化测试框架去驱动自动化,在定位元素的时候,可以借助UIAutomator2的语法来实现定位。在代码实现上提供的API是find_element_by_android_uiautomator;利用android_uiautomator进行定位,语法必须属性值是双引号

1、根据text定位:

find_element_by_android_uiautomator('text("值")')
find_element_by_android_uiautomator('newUiSelector().text("值")')    # 'newUiSelector()'推荐使用

代码示例:

# 通过text定位
driver.find_element_by_android_uiautomator('text("5")').click()
# 推荐使用正规方法
driver.find_element_by_android_uiautomator('new UiSelector().text("5")').click()

text定位相关函数:
textContains:模糊匹配文本
textStartsWith:以某个文本开头来匹配
textMatches:正则匹配

代码示例:

复制代码

# text定位相关函数:
# textContains:模糊匹配文本
driver.find_element_by_android_uiautomator('new UiSelector().textContains("...")')
# textStartsWith:以某个文本开头来匹配
driver.find_element_by_android_uiautomator('new UiSelector().textStartsWith("...")')
# textMatches:正则匹配
driver.find_element_by_android_uiautomator('new UiSelector().textMatches("...")')

复制代码

2、根据resourceId定位:

find_element_by_android_uiautomator('resourceId("值")')
find_element_by_android_uiautomator('newUiSelector().resourceId("值")')

代码示例:

# 根据resourceId定位:
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("...")').click()

3、根据className定位:关键字className

代码示例:

# 根据className定位:关键字className
driver.find_element_by_android_uiautomator('new UiSelector().className("...")').click()

4、根据contenet-des定位:关键字description

代码示例:

# 根据contenet-des定位:关键字description
driver.find_element_by_android_uiautomator('new UiSelector().description("...")').click()

5、组合定位(类名和文本)

newUiSelector().className("类名").text("值")其它组合定位方式类推

代码示例:

# 组合定位(类名和文本):
driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.Button").text("7")').click()
driver.find_element_by_android_uiautomator('new UiSelector().text("8").className("android.widget.Button")').click()

6、根据元素关系定位

1)后代元素定位:
使用条件:子元素属性不定,不唯一,只能通过父元素来定位
newUiSelector().resourceId("值").childSelector(className("值").instance(数字))
其中childSelector可以传入resourceId、description等方法
instance表示匹配的结果所有元素里面的第几个元素,从0开始计数

代码示例:

# 后代元素定位
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.sky.jisuanji:id/tablelayout").childSelector(className("android.widget.Button").instance(3))').click()

2)兄弟元素定位
通过子元素找到父元素,然后通过父元素再去找兄弟元素
newUiSelector().resourceId("值").fromParent(text("值"))
fromParent()表示从元素的父元素下查找

代码示例:

# 兄弟元素定位
driver.find_element_by_android_uiautomator('new UiSelector().text("7").fromParent(text("9"))').click()
ends_with()字符串结尾比对 == 是xpath2.0的函数库、语法 而xpath1.0不存在该函数

 总结

如果你对此文有任何疑问,如果你也需要接口项目实战,如果你对软件测试、接口测试、自动化测试、面试经验交流感兴趣欢迎加入我们,加入方式在文章的最后面

  自动化测试相关教程推荐:

2023最新自动化测试自学教程新手小白26天入门最详细教程,目前已有300多人通过学习这套教程入职大厂!!_哔哩哔哩_bilibili

2023最新合集Python自动化测试开发框架【全栈/实战/教程】合集精华,学完年薪40W+_哔哩哔哩_bilibili

测试开发相关教程推荐

2023全网最牛,字节测试开发大佬现场教学,从零开始教你成为年薪百万的测试开发工程师_哔哩哔哩_bilibili

postman/jmeter/fiddler测试工具类教程推荐

讲的最详细JMeter接口测试/接口自动化测试项目实战合集教程,学jmeter接口测试一套教程就够了!!_哔哩哔哩_bilibili

2023自学fiddler抓包,请一定要看完【如何1天学会fiddler抓包】的全网最详细视频教程!!_哔哩哔哩_bilibili

2023全网封神,B站讲的最详细的Postman接口测试实战教学,小白都能学会_哔哩哔哩_bilibili

  总结:

 光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

​​​

​​​

如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。

如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步

在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。

我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,

测试开发视频教程、学习笔记领取传送门!!

  • 19
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值