目录
- 一.认识定位控件(元素定位工具)
- 二.功能及按钮介绍
- 三.Appuim支持的定位方式
- 3.01 id定位
- 3.02 name定位
- 3.03 className定位
- 3.04 classNameMatches定位
- 3.05 textMatches 正则匹配查找
- 3.06 textStartsWith定位
- 3.07 class_name定位
- 3.08父子关系、兄弟关系定位
- 3.09 滚动查找
- 3.10 Accessibility_id定位
- 3.11 XPath定位
- 3.12 contains模糊定位
- 3.13 AndroidUiAutomator定位元素
- 3.14 resourceID定位
- 3.15 resourceIDMatches 定位
- 3.16组合定位
- 3.17 Android UIAutomator定位
- 3.18 支持层级定位
- 3.19 支持部分定位
- 3.20 Android原生支持元素定位方式
- 3.21Appium不支持的元素定位方式
- 3.22 appium与selenium元素定位之比较
一.认识定位控件(元素定位工具)
- 该工具位于
android-sdk-windows\tools\uiautomatorviewer.bat
双击即可启动,启动过程中组件所打开的CMD
窗口不用关闭;手机开启USB调试,或打开模拟器即可使用 - 在使用
Appium
的时候,需要填写Desired Capabilities
,这里使用Android SDK
自带的uiautomatorviewer.bat
控件可以便捷的获取所需信息
二.功能及按钮介绍
- 通过截屏并分析XML布局文件的方式,为用户提供控件信息查看服务
- 获取节点元素相关属性
- 获取点位坐标
- The first button:Open:
Screenshot;UI XML Dump
打开本地截图和打开.uix格式文件(uix文件需安装Binary Data
打开) - Second button:Device Screenshot(uiautomator dump)设备屏幕截图(uiautomator转储)
- Third button:Device Screenshot with Compressed Hierarchy(uiautomator dump --compressed)具有压缩层次结构的设备屏幕截图
- Save:保存至本地指定位置
- 在Android Studio中可以通过Android Device Monitor 调用UI Automator Viewer
- First button on the right:
+
Expand All-全部展开 - Second button on the right:Toggle NAF Nodes-切换NAF节点,点击后展示不可被识别的控件
- Third button on the right:Clear search results-清除搜索结果
三.Appuim支持的定位方式
3.01 id定位
- 通过uiautomatorviewer.bat 工具可以查看对象的id属性;
- 如果目标设备的API Level低于18则UIAutomatorViewer不能获得对应的Resource ID,只有等于大于18的时候才能使用;
- resource-id 就是的id属性;
- 使用方法(未验证):driver.find_element_by_id(‘android:id/text1’).click();driver.findElement(By.id(“com.android.calculator2:id/formula”))
3.02 name定位
一般text属性认为是name
3.03 className定位
通过调用android uiautomator使用className进行定位
ele = self.driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.EditText")')
ele.send_keys('132')
3.04 classNameMatches定位
通过className正则匹配进行定位
ele = self.driver.find_element_by_android_uiautomator('new UiSelector().classNameMatches (".*EditText")')
ele.send_keys('132')
3.05 textMatches 正则匹配查找
textMatches故名思义就是通过正则的来进行查找定位,他也是通过text的属性来进行正则匹配
ele = self.driver.find_element_by_android_uiautomator('new UiSelector().textMatches("^请输入手.*")')
ele.send_keys("123")
3.06 textStartsWith定位
driver.find_element_by_android_uiautomator('new UiSelector().textStartsWith("请输入")')
3.07 class_name定位
- 定位一个控件class就是class_name ,一般获得的view都不止一个,所以应该需要遍历一遍得到的views,然后缩小搜索条件来获得目标控件;如果多个只操作第一个
driver.find_element_by_class_name("com.jingdong.app.mall:id/ic").click()
- 定位组控件,例如:
com.jingdong.app.mall:id/ic
;driver.find_elements_by_class_name("com.jingdong.app.mall:id/ic")[1].click()
,或WebElement button = driver.findElement(By.className(“com.jingdong.app.mall:id/ic”));
3.08父子关系、兄弟关系定位
self.driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.xueqiu.android:id/title_container").childSelector(text("密码"))')
self.driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.xueqiu.android:id/title_container").fromParent(text("密码"))')
3.09 滚动查找
self.driver.find_element_by_android_uiautomator('new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().text("查找的元素文本").instance(0));')
3.10 Accessibility_id定位
参数取content-desc的值:driver.find_element_by_accessibility_id('Accessibility').click()
或findElement(By.AccessibilityId("sharebutton"))
3.11 XPath定位
- Appium对于xpath定位执行效率是比较低的,也就是说遇到xpath的定位代码的时候,执行比较慢;迫不得已的情况下尽量不用这个定位方式
(参数取text的值)driver.find_element_by_xpath('//*[@text="Accessibility"]').click()
(参数取resource-id的值)driver.find_element_by_xpath('//*[@resource-id="android:id/text1"]').click()
参数格式:
1)//class
2)//class[n]
3)//class[@属性=“属性值”]
4)//class[@属性=“属性值” and @属性=“属性值”]
5)//*[@属性=“属性值”]
例如:com.jingdong.app.mall:id/ic
driver.findElement(By.xpath("//com.jingdong.app.mall:id/ic"))
driver.find_element_by_xpath('//*[@resource-id="android:id/text1"]').click()
agree_continue_xpath = "//*[@text='退出登录']"
WebDriverWait(driver, 10, 1).until(EC.visibility_of_element_located((MobileBy.XPATH, agree_continue_xpath)))
driver.find_element_by_xpath(agree_continue_xpath).click()
3.12 contains模糊定位
用于获取toast时,toast文本内容较长,可采用contains
包含部分文本的匹配方式;以用来模糊匹配上面的文本属性“退出登录”
agree_continue_xpath = "//android.widget.Button[contains(@text, '退出')]"
WebDriverWait(driver, 10, 1).until(EC.visibility_of_element_located((MobileBy.XPATH, agree_continue_xpath)))
driver.find_element_by_xpath(agree_continue_xpath).click()
3.13 AndroidUiAutomator定位元素
AndroidUIAutomator是一个强有力的元素定位方式,它是通过Android UIAutomator类库去找元素,定位方式:findElement(By.AndroidUIAutomator(String UIAuto));
可以选择id,nameclassName,description作为传入的字符串
WebElement el =
driver.findElementByAndroidUIAutomator("new UiSelector().resourceId(\"com.tencent.mm:id/do\")");
3.14 resourceID定位
resourceld定位和appium封装好的id定位一样,差别在写法变成了uiautomator的写法
ele = self.driver.find_element_by_android_uiautomator('new UiSelector().resourceId("cn.com.open.mooc:id/et_phone_edit")')
ele.send_keys('234')
3.15 resourceIDMatches 定位
通过id进行正则匹配定位
ele = self.driver.find_element_by_android_uiautomator('new UiSelector().resourceIdMatches(".+et_phone_edit")')
ele.send_keys('123')
3.16组合定位
xpath中同时包含class和text两个属性
agree_continue_xpath = "//*[@class='android.widget.TextView' and @text='退出登录']"
WebDriverWait(driver, 10, 1).until(EC.visibility_of_element_located((MobileBy.XPATH, agree_continue_xpath)))
driver.find_element_by_xpath(agree_continue_xpath).click()
3.17 Android UIAutomator定位
android uiautomator原理是通过android 自带的android uiautomator的类库去查找元素,其实和appium的定位一样,或者说他比appium的定位方式更佳多以及更佳适用,它也支持id、className、text、模糊匹配等进行定位
3.18 支持层级定位
1.driver.find_element_by_xpath("//android.widget.ListView/android.widget.TextView").click()
2.driver.find_element_by_xpath("//android.widget.ListView/*[1]").click()
3.driver.find_element_by_xpath('//*[@resource-id="android:id/list"]/*[1]').click()
在父元素API Demos下,Accessibility是第1个子元素;xpath的索引从1开始
4.driver.find_element_by_xpath('//*[@resource-id="android:id/list"]/*[@resource-id="android:id/text1"]').click()
5.driver.find_element_by_xpath('//android.widget.TextView[contains(@text,"Acce")]').click()
- 参数格式:
//class[@属性=“属性值”]/class[]/class
3.19 支持部分定位
driver.find_element_by_xpath('//android.widget.TextView[contains(@text,"Acce")]').click()
3.20 Android原生支持元素定位方式
①(参数取resource-id的值)driver.find_element_by_android_uiautomator('new UiSelector().resourceId("android:id/text1")').click()
简化(默认是UiSelector对象):driver.find_element_by_android_uiautomator('.resourceId("android:id/text1")').click()
例如:WebElement element = driver.findElement(By.id("com.tencent.mm:id/do"));
或driver.findElementById("com.tencent.mm:id/do")
②(参数取class的值)driver.find_element_by_android_uiautomator('.className("android.widget.TextView")').click()
③(参数取text的值)driver.find_element_by_android_uiautomator('.text("Accessibility")').click()
3.21Appium不支持的元素定位方式
3.22 appium与selenium元素定位之比较
appium是app端,用appium需导出selenium包
selenium是web端
frame | Element positioning method | remarks |
appium | id, className, AccessibilityId, xpath, AndroidUIAutomator | for H5,Same support selenium name,link,text,css |
selenium | id, className, name, tag name, link text, paratial link text, xpath ,css |