App主动化测试|原生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(')
driver.find_element(By.ID," ")
代码示例:
1 # ID 定位(取resource-id、id、name)
2 driver.find_element(By.ID,'com.sky.jisuanqi:id/btn6').click()
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定位一般不选举利用
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 是一门标识表记标帜语言 感化是在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 然后到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值]'),那种用法随便同时识别多个元素
利用部门属性值定位
当元素的属性值过长或者元素属性值内容中存在动态改变的情状下,能够利用该办法。
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()