自动化测试-uiautomatorviewer.bat

目录

          • 一.认识定位控件(元素定位工具)
          • 二.功能及按钮介绍
          • 三.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布局文件的方式,为用户提供控件信息查看服务

  • 获取节点元素相关属性
    自动化测试-uiautomatorviewer.bat_第1张图片

  • 获取点位坐标
    自动化测试-uiautomatorviewer.bat_第2张图片

  • 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自动化测试-uiautomatorviewer.bat_第3张图片

  • 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”))自动化测试-uiautomatorviewer.bat_第4张图片
3.02 name定位

一般text属性认为是name
自动化测试-uiautomatorviewer.bat_第5张图片

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”));自动化测试-uiautomatorviewer.bat_第6张图片
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"))
自动化测试-uiautomatorviewer.bat_第7张图片

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()
    自动化测试-uiautomatorviewer.bat_第8张图片
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包含部分文本的匹配方式;以用来模糊匹配上面的文本属性“退出登录”
自动化测试-uiautomatorviewer.bat_第9张图片

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两个属性
自动化测试-uiautomatorviewer.bat_第10张图片

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不支持的元素定位方式

自动化测试-uiautomatorviewer.bat_第11张图片

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

你可能感兴趣的:(Appium,java,定位,android,selenium)