实验简介

  做过UI自动化(web自动化, 移动自动化)的同学都会知道, 除去框架的选型和搭建以外, 落到实处的对元素进行定位就成了最重要的技能.

  做过UI自动化的同学会知道, 对页面元素的定位方式有8种: id, name, xpath, class, link text, partial link text, tag name, css selector, 使用手法, 优先级的选择以及效率稍有不同, 但是殊途同归, 目标就是要找到元素本身.

  同样, 要做Native APP的自动化, 在元素定位上也大同小异, web 元素通用的方式, Appuim也适用, 甚至它还有一些个性化的方式.  但是对于Web View容器下的元素识别, 和web driver并无太多差异

实验目的

  1. 练习使用工具uiautomatorviewer对元素进行定位

  2. 熟悉元素定位的方法

  3. 编写自动化测试用例 - 添加联系人

实验流程

  1. 首先来看一下测试对象, 一个添加联系人的app, 功能页面如下图排序.

  2. 在apk/tools下, 找到uiautomatorviewer.bat

    

    点击如下图标, 同步App页面元素详细信息

    

    3. 从目前的页面上, 我们可以得到一些属性, 其对应关系如下图:

    

    4. 了解了这些基本属性, 其实就可以完成代码的编写了, 如下

#coding=utf-
from appium import webdriver
import time
from selenium.webdriver.common.by import By desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = ''
desired_caps['deviceName'] = 'Android Emulator'
desired_caps['appPackage'] = 'com.example.android.contactmanager'
desired_caps['appActivity'] = '.ContactManager' driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
# 点击Add Contact
driver.find_element_by_name('Add Contact').click() #text
# 输入 Contact Name
name = 'test03'
driver.find_element_by_id('com.example.android.contactmanager:id/contactNameEditText').send_keys(name) #resource-id
# 输入 Contact Phone
driver.find_element_by_id('com.example.android.contactmanager:id/contactPhoneEditText').send_keys('')
# 输入 Contact Email
driver.find_element_by_id('com.example.android.contactmanager:id/contactEmailEditText').send_keys('test@test.com')
# 点击 Save Button
driver.find_element_by_name('Save').click()
# 点击 "Show Invisible Contacts(Only)"
driver.find_element_by_accessibility_id('Show Invisible Contacts (Only)').click()
nameAdded = driver.find_element_by_name(name).text
print(nameAdded)
if nameAdded == name:
print('成功添加联系人.')
else:
print('添加联系人失败') driver.quit()

    Accessibility ID在Android上面就等同于contentDescription,这个属性是方便一些生理功能有缺陷的人使用应用程序的。比如我们有一个ImageView里面放置一张颜色复杂的图片,可能一些色弱色盲的人,分不清这张图片中画的是什么东西。如果用户安装了辅助浏览工具比如TalkBack,TalkBack就会大声朗读出用户目前正在浏览的内容。TextView控件TalkBack可以直接读出里面的内容,但是ImageView TalkBack就只能去读contentDescription的值,告诉用户这个图片到底是什么。

  5. 上面用到了最常用的几种定位方式, 心心念念的强大的xpath还没的提到, 我们来看看它的几种基本用法

    1).使用绝对路径定位,如截图所显示的 xpath 路径
      find_element_by_xpath("className/className/className/className")
    2).使用相对路径定位
      find_element_by_xpath("//className")
    3).通过元素的索引定位
      find_element_by_xpath("//className[index]")
    4).通过元素的属性定位
      一种属性:find_element_by_xpath("//className[@label='更多信息']")
      两种属性:find_element_by_xpath("//className[@label='更多信息'][@isVisible='1']")
      部分属性(最强大):find_element_by_xpath("//className[contains(@label,'更多')]")

#   输入 Contact Name
name = 'test03'
driver.find_element_by_xpath('//android.widget.EditText["3"]').send_keys(name)

  6. 使用android uiautomator定位

    这个方法也属于 Appium(Android)扩展的定位方法。同样使用 UIAutomatorViewer.bat 工具直接查看。

    也就是说一个元素的任意属性都可以通过android uiautomator方法来进行定位,但要保证这种定位方式的唯一性。

#  点击 "Show Invisible Contacts(Only)"
driver.find_element_by_android_uiautomator("new UiSelector().text(\"Show Invisible Contacts (Only)\")").click()
# description对应的属性是content-desc
# driver.find_element_by_android_uiautomator("new UiSelector().description(\"Show Invisible Contacts (Only)\")").click()  

    顺便贴一下UiSelector的其它方法, 依然很好用.

    文本方面的方法:
      1.text(String text) 文本
      2.textContains(String text) 文本包含
      3.textMatches(String regex) 文本正则
      4.textStartsWith(String text) 文本开始字符

    描述方面的方法:
      1.description(String desc) 描述
      2.descriptionContains(String desc) 描述包含
      3.descriptionMatches(String regex) 描述正则
      4.descriptionStartsWith(String desc) 描述开始字符

driver.find_element_by_android_uiautomator("new UiSelector().descriptionContains(\"Show Invisible Contacts\")").click()

  曾哥有话说:

    方法find_element_by_android_uiautomator里的语句是用java处理, 它的字符串是放在双引号中的. 如果把字符串放在单引号中的话, 在python里看起来没有问题, 但是java却并不认为这是一个字符串. 错误信息在appuim server上可以清楚地看到:

    

    这个坑挺隐形的, 我趴了好久, 差点以为 该方法在此处不适用, 很难过.

    

    

Appium移动自动化测试(三)之元素定位的更多相关文章

  1. Appium移动自动化测试(四)之元素定位

    做过UI自动化测试的童鞋都会发现, 在上一篇文章中居然没有万能定位方式Xpath. 是滴, 确实没有! ADT自带的uiautomatorviewer里面并没有属性xpath, 如果我们需要的话,还需 ...

  2. appium+python搭建自动化测试框架_Appium元素定位(二)

    Appium元素定位: 工具:Android\android-sdk\tools    uiautomatorviewer.bat 1. id定位: self.driver.find_element_ ...

  3. Appium常用操作之「元素定位、swipe 滑屏操作」

    坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 目录 一.打开 uiautomatorviewer 二.Appium 常用操作 1.用 layui 做 ...

  4. selenium使用笔记(三)——元素定位

    selenium进行自动化测试的一个很重要的东西那就是元素定位,如果元素都没法定位就无法操作它,也就无法进行自动化测试了.网上对于元素定位有很多的介绍,很详细很详细的,但是依然有很多新手总是会遇到无法 ...

  5. Appium移动自动化测试-----(八)定位控件

    appium 通过 uiautomatorviewer.bat 工具来查看控件的属性.该工具位于 Android SDK 的 /tools/bin/ 目录下. id 定位 通过uiautomatorv ...

  6. Appium常用的3种元素定位方式

    以最右App为例 .apk文件网盘地址: 链接:https://pan.baidu.com/s/1L4MYkhpb5ECe8XeaneTx_Q 提取码:0jqm 1.find_element_by_i ...

  7. Appium python自动化测试系列之元素的定位(六)

    ​6.1 常用定位方法讲解 对象定位是自动化测试中很关键的一步,也可以说是最关键的一步,毕竟你对象都没定位那么你想操作也不行.所以本章节的知识我希望大家多动手去操作,不要仅仅只是书本上的知识,毕竟这个 ...

  8. Appium移动端自动化测试之元素定位(三)

    1.name定位 driver.find_element_by_id(') driver.find_element_by_id(') driver.find_element_by_name('登录') ...

  9. Appium移动端自动化:元素定位uiautomatorviewer

    一.启动uiautomatorviewer mac: 1.打开终端,进入Android/sdk/tools目录 2.打开uiautomatorviewer(我的路径是Android/sdk/tools ...

随机推荐

  1. leetcode第6题:Z字形变换--直接模拟求解法

    [题目描述] 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: 之后,你 ...

  2. 建立一个可以不停地接收客户端新的连接,但不能处理复杂的业务的C/S网络程序

    在Windows平台上主要有两个版本的Socket Api函数:WinSock 1.1和WinSock 2.2 , 2.2版本默认兼容1.1版本,1.1 winsock.h wsock32.lib w ...

  3. Centos7 更改网卡名称

    cd /etc/sysconfig/network-scripts/ 将要改名的网卡配置文件重命名,例如 mv ifcfg-eth1 ifcfg-eth0 vim ifcfg-eth0 修改devic ...

  4. Oracle11g adump目录下面.aud增长导致空间撑满无法删除导致CRS无法启动的解决方法

    [root@node1 adump]# pwd /u01/app/oracle/admin/node/adump 大概有10000个文件 rm -rf * 屏幕显示: -bash: /bin/rm: ...

  5. java线程基础巩固---Thread API综合实战之编写ThreadService实现暴力结束线程

    上篇中在最后抛出一个问题,具体问题可以查看此篇[http://www.cnblogs.com/webor2006/p/7995229.html],这里不再概述,其实要实现这个需求可以用咱们之前学习的守 ...

  6. ULPFEC在WebRTC中的实现[转载]

    一.WebRTC对抗网络丢包的两种手段     丢包重传(NACK)和前向纠错(FEC).FEC是一种前向纠错技术,发送端将负载数据加上一定的冗余纠错码一起发送,接收端根据接收到的纠错码对数据进行差错 ...

  7. Android及java中list循环添加时覆盖的问题-20171021

    鉴于新浪博客太渣,转到这来. 最近在工程设计时,使用list循环添加map对象发现,最终全部变为最后一个map的值,但是list的数值还是正确的,也就是说添加了N(list长度或者说循环的次数)个相同 ...

  8. Json中相关注解解释说明

    @JsonProperty用法: @JsonProperty 此注解用于属性上,作用是把该属性的名称序列化为另外一个名称,如把trueName属性序列化为name,@JsonProperty(“nam ...

  9. Acwing-169-数独2(搜索, 剪枝)

    链接: https://www.acwing.com/problem/content/171/ 题意: 请你将一个16x16的数独填写完整,使得每行.每列.每个4x4十六宫格内字母A~P均恰好出现一次 ...

  10. Mybatis问题-Type interface com.zzu.ssm.dao.UserMapper is not known to the MapperRegistry

    1. mapper.xml中namespace名称是否与dao接口包名一致 2. 在mybatis配置文件中注册mapper