写点什么

App 自动化测试|原生 app 元素定位方法

  • 2023-07-23
    北京
  • 本文字数:2529 字

    阅读完需:约 8 分钟

元素定位方法介绍及应用

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," ")


代码示例:


1 # ID 定位(取resource-id、id、name)2 driver.find_element(By.ID,'com.sky.jisuanqi:id/btn6').click()
复制代码


  1. class 定位(取 class)


driver.find_element(By.CLASS_NAME," ")


代码示例:


1 # class定位(取class)2 driver.find_element(By.CLASS_NAME,'android.widget.Button').click()
复制代码


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



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


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


代码示例:


1 # AccessibilityId定位(取content-desc)2 driver.find_element_by_accessibility_id('').click()
复制代码


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


  1. Xpath 定位方法


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


  • 绝对路径


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



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


1 # xpath 绝对路径定位/开头 从根节点直接一层一层定位找到元素 遇到同层级相同的元素,用下标区分,下标从1开始2 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()
复制代码


  • 使用属性定位


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 然后到9els = 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 值]'),这种用法容易同时识别多个元素


  • 使用部分属性值定位


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


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(@属性名,"部分属性值")]')


# 部分属性值定位# 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()
复制代码


获取更多技术资料,请点击!

用户头像

社区:ceshiren.com 微信:ceshiren2021 2019-10-23 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料,实时更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬。

评论

发布
暂无评论
App自动化测试|原生app元素定位方法_霍格沃兹测试开发学社_InfoQ写作社区