Appium⾃动化(6):原⽣app元素定位⽅法
元素定位⽅法介绍及应⽤:
Appium⽅法定位原⽣app元素:
通过appium inspector⼯具,可以获取元素的相关信息;在appium中提供了⼀系列的元素定位API,通过在这些API中输⼊指定的元素信息,就能完成元素定位,定位元素后就进⾏对元素进⾏⾃动操作。
appium中识别元素的⽅式有两种写法
⽅式⼀:driver.find_element_by_id(" ")
⽅式⼆:driver.find_element(By.ID," ") -----推荐使⽤
基本元素定位如下:
前置条件
代码⽰例:
1from appium import webdriver # 导⼊appium 驱动包
2from appium.webdriver.webdriver import By # 导⼊appium 定位的⽅法包
3
4
5# 1、定义⼀个DesiredCapabilities配置的字典
6 des = {
7'platformName':'Android',
8'platformVersion':'6.0.1', # 填写android虚拟机/真机的系统版本号
9'deviceName':'MuMu', # 填写安卓虚拟机/真机的设备名称
10'appPackage':'com.sky.jisuanji', # 填写被测app包名
11'appActivity':'.JisuanjizixieActivity', # 填写被测app的⼊⼝
12'udid':'127.0.0.1:7555', # 填写通过命令⾏ adb devices 查看到的udid
13'noReset':True, # 重置APP
14'unicodeKeyboard':True, # ⽀持中⽂输⼊
15'resetKeyboard':True, # ⽀持重置键盘
16'newCommandTimeout':30 # 30秒没发送新命令就断开连接
17 }
18
19# 2、把配置的字典作为请求参数发送给appium服务器
20 driver = webdriver.Remote('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.jisuanji:id/btn6').click()
2、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定位⼀般不推荐使⽤!
3、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)已不⽀持
Xpath定位⽅法:
xpath ==> XPATH 是⼀门标记语⾔作⽤是在XML、XHTML ⽂档中查元素
selenium xpath是1.0版本语法 appium xpath是2.0版本语法
1、绝对路径:
绝对路径 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] 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 @属性名="属性值"]')
代码⽰例:
1# 使⽤属性定位 //类名[@属性名="属性值"]
2 driver.find_element(By.XPATH,'//android.widget.Button[@resource-id="com.sky.jisuanji:id/btn8"]').click()
3 driver.find_element(By.XPATH,'//android.widget.Button[@text="8"]').click()
4# 扩展:and/or
5# //类名[@属性名1=“属性值1” and @属性名2=“属性值2”]
6# //类名[@属性名1=“属性值1” or @属性名2=“属性值2”]
7 driver.find_element(By.XPATH,'//android.widget.Button[@text="8" and @resource-id="com.sky.jisuanji:id/btn8"]').click()
8 driver.find_element(By.XPATH,'//android.widget.Button[@text="8" or @bounds="sss"]').click()
9# find_elements() 把满⾜条件的所有元素按匹配顺序放⼊列表所以是先匹配到8 然后到9
10 els = driver.find_elements(By.XPATH,'//android.widget.Button[@text="9" or @text="8"]')
11 els[0].click()
12 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# 部分属性值定位
2# 1、元素属性过长使⽤ends-with()⽅法
3 driver.find_element(By.XPATH,'//android.widget.Button[ends-with(@resource-id,"btn8")]').click()
4# 2、动态元素第⼀次打开 text="id_9" 第⼆次打开text="id_10" 第三次打开text="id_11"
5# starts-with(@text,"id_")
6 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定位:
unicode keyboard downloadfind_element_by_android_uiautomator('text("值")')
find_element_by_android_uiautomator('newUiSelector().text("值")') # 'newUiSelector()'推荐使⽤
代码⽰例:
1# 通过text定位
2 driver.find_element_by_android_uiautomator('text("5")').click()
3# 推荐使⽤正规⽅法
4 driver.find_element_by_android_uiautomator('new UiSelector().text("5")').click()
text定位相关函数:
textContains:模糊匹配⽂本
textStartsWith:以某个⽂本开头来匹配
textMatches:正则匹配
代码⽰例:
1# text定位相关函数:
2# textContains:模糊匹配⽂本
3 driver.find_element_by_android_uiautomator('new UiSelector().textContains("...")')
4# textStartsWith:以某个⽂本开头来匹配
5 driver.find_element_by_android_uiautomator('new UiSelector().textStartsWith("...")')
6# textMatches:正则匹配
7 driver.find_element_by_android_uiautomator('new UiSelector().textMatches("...")')
2、根据resourceId定位:
find_element_by_android_uiautomator('resourceId("值")')
find_element_by_android_uiautomator('newUiSelector().resourceId("值")')
代码⽰例:
1# 根据resourceId定位:
2 driver.find_element_by_android_uiautomator('new UiSelector().resourceId("...")').click()
3、根据className定位:关键字className
代码⽰例:
1# 根据className定位:关键字className
2 driver.find_element_by_android_uiautomator('new UiSelector().className("...")').click()
4、根据contenet-des定位:关键字description
代码⽰例:
1# 根据contenet-des定位:关键字description
2 driver.find_element_by_android_uiautomator('new UiSelector().description("...")').click()
5、组合定位(类名和⽂本)
newUiSelector().className("类名").text("值")其它组合定位⽅式类推
代码⽰例:
1# 组合定位(类名和⽂本):
2 driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.Button").text("7")').click()
3 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开始计数
代码⽰例:
1# 后代元素定位
2 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()表⽰从元素的⽗元素下查
代码⽰例:
1# 兄弟元素定位
2 driver.find_element_by_android_uiautomator('new UiSelector().text("7").fromParent(text("9"))').click()
ends_with()字符串结尾⽐对 == 是xpath2.0的函数库、语法⽽xpath1.0不存在该函数
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论