文章目录
前言
自动化测试核心三要素:
- 定位元素
- 操作元素
- 断言结果
web端一般采用selenium作为自动化测试工具,而selenium的定位元素一般通过id、name、class name、css、xpath等等。移动端一般采用appium作为自动化测试工具,在进行Android APP自动化测试的时候,appium的webdriver也给我们提供了许多定位元素的方式,毕竟appium有很多方法继承于selenium,今天采用Python语言对Android APP的元素进行定位。
通过webdriver定位
1.通过resource-id 定位:
需求:定位微信号/QQ号/邮箱登录这个元素
代码:
# el是定位元素后返回的对象实例
el = self.driver.find_element_by_id("com.tencent.mm:id/d67")
2.通过class name 定位
需求:定位登录按钮
代码:
# el是定位元素后返回的对象实例
el = self.driver.find_element_by_class_name("android.widget.Button")
3.通过 accessibility_id定位元素
PS:accessibility_id一般是用来辅助残疾人士使用APP的,国外APP此功能较完善,目前国内这块做的不太好,当残障人士点击此元素或高亮显示,或者系统自动读出来
# content-desc 为元素对应的属性值
driver.find_element_by_accessibility_id(content-desc)
4.通过xpath定位元素
xpath定位大概是APP自动化中最常用的定位了,应为APP中id比较少,class name 也经常重复。xpath优点是用法灵活,缺点是每次都会比那里dom树,查询速度慢,影响了脚本的整体运行速度。
属性值完全匹配
需求:定位登录按钮
代码:
# el是定位元素后返回的对象实例
el = self.driver.find_element_by_xpath('//*[@text="登录"]')
contain 属性值部分匹配
我们在定位较长文本时,一种像上面一样进行完全匹配,但是那样太繁琐了,xpath给我们提供了一种模糊匹配的方式
需求:使用 录微 ;两个字定位 登录微信
xpath表达式
代码:
# el是定位元素后返回的对象实例
el = self.driver.find_element_by_xpath('//*[contains(@text,"录微")]')
xpath语法远远不止这两种,还有通过父亲定位儿子、儿子定位父亲、通过轴定位兄弟节点等等,有兴趣的同学可以具体查找下xpath的用法
5.定位toast弹框
toast弹框一般用于添加成员成功、购物车添加成功了出现,大概存在3秒后,自动消失
一般用于断言脚本是否成功
toast定位一般分三步走
第一步 :打印会有toast当前页面的xml
获取有toast当前页面的xml
page_source = self.driver.page_source
第二步:分析xml,进行元素定位
xml:
<android.widget.Toast index="1" package="com.android.settings"
class="android.widget.Toast" text="添加成功"
第三步:元素定位,获取属性值用于断言
__toast = (MobileBy.XPATH, "//*[@class='android.widget.Toast']")
text = self.find_element(self.__repetition_text).text
通过adb 定位
有些时候,我们通过xpath语法、id 等等手段都定位不到元素,而且这些在企业实际运用非常常见,例如我们公司的app中登录和注册在同一个div中,你通过xpath根本定位不到具体的元素,点击一下,两个都会触发,这些其实都是开发不规范导致的,那么我们如何准确定位元素呢?Android SDK 给我们提供了一种底层的定位方式,那就是 adb shell模拟点击,adb是通过 元素的坐标进行定位的
1.input用法
输入文本信息:input text zhangsan
物理按键操作: input keyevent KEYCODE_VOLUME_DOWN
点击(DOWN_UP)操作:input tap 500 500 # 500 500 是你要点的元素的绝对坐标
模拟滑动操作:input swipe 200 500 400 500
模拟轨迹球操作 input roll 100 200
2、input tap实现的是DOWN_UP事件,也就是点击操作,后面两个参数是点击的坐标x,y
一般来说上面命令都是在DOS窗口输入的,不能再脚本直接使用,需要给这些adb命令封装一个执行方法,Python调用 os.system() 来执行adb shell 命令
def execute_adb(self, adb_command):
"""
执行adb命令
:param adb_command: adb shell 命令
:return:
"""
os.system(adb_command)
Android 原生定位 UIautomator
UIautomator 官网提供的一种定位方式,优点是响应速度快和全面,缺点是语法在pycharm中没有自动联想容易写错,且支持Android,iOS不能用,但是xpath兼容iOS和Android
官网:https://developer.android.com/reference/android/support/test/uiautomator/UiSelector.html
通过文本定位
写法:’new UiSelector().text(“text")'
滑动查找元素(先向上再向下)
代码:
# 滑动查找元素
def qjhd_search(self, text):
"""
滑动查找元素,并点击元素
:param text: 要点击的元素的文本(必须要是唯一的)
:return:
"""
self.driver.find_element(MobileBy.ANDROID_UIAUTOMATOR,
'new UiScrollable(new UiSelector().'
'scrollable(true).instance(0)).'
'scrollIntoView(new UiSelector().'
'text("{0}").instance(0));'.format(text)).click()
建议:不要手敲,直接粘贴,上面方法是二次封装后的