APP自动化测试-3. Appium元素定位与等待


文章目录

  • APP自动化测试-3. Appium元素定位与等待
  • 前言
  • 一、Appium Desired Capabilities简介
    • 1. Appium Desired Capabilities通用参数
    • 2. Appium Desired Capabilities Android常用参数
    • 3. Appium Desired Capabilities IOS常用参数
  • 二、Appium常用定位方法
    • 1. ID定位
    • 2. XPATH定位
    • 3. ACCESSIBILITY ID定位
    • 4. CSS SELECTOR定位
  • 三、Appium常用等待
    • 1. 强制等待
    • 2. 隐式等待
    • 3. 显式等待
  • 四、元素定位工具(android)
    • 1. uiautomatorviewer启动
    • 2. uiautomatorviewer使用
    • 3. uiautomatorviewer异常处理
  • 五、uiautomator定位
    • 1. uiautomator基本定位
    • 2. uiautomator组合定位
    • 3. 滚动查找定位
  • 总结

前言

主要介绍一下Appium初始化driver 的配置项及常用的元素定位方法,还有定位工具uiautomatorviewer的简单适用


一、Appium Desired Capabilities简介

1. Appium Desired Capabilities通用参数

  • automationName:使用的自动化引擎,通常保持默认即可
  • platformName:运行的平台,如iOS, Android, or FirefoxOS
  • platformVersion:系统版本
  • deviceName:被测的设备名称
  • app:.apk或.ipa文件的绝对路径或下载地址,首次会进行应用的安装
  • browserName:被测试浏览器名称,如Safari、Chrome、Browser等
  • newCommandTimeout:超时时间
  • udid:测试多台设备时,需要用来置顶设备的ID
  • noReset:默认为False,设置为True后,会保留session信息,比如登录信息,操作信息等
  • FullReset:与noReset相反

2. Appium Desired Capabilities Android常用参数

  • appActivity:应用的页面
  • appPackage:应用的包名
  • unicodeKeyboard:默认为false,设置为True可以进行中文输入
  • resetKeyboard:配合unicodeKeyboard使用,在测试完成后将键盘恢复为原始状态
  • skipDeviceInitialization:跳过安装、权限设置等操作
  • dontStopAppOnReset:执行测试时如果目标应用已存在,则无需重新打开应用

3. Appium Desired Capabilities IOS常用参数

  • bundleId:应用包名

以简书为例,简单示例:

from time import sleepfrom appium import webdriver
from appium.webdriver.common.appiumby import AppiumBydesired_caps = {"platformName": "android","appium:deviceName": "b1f37e8e","appium:appPackage": "com.jianshu.haruki","appium:appActivity": "com.baiji.jianshu.ui.splash.SplashScreenActivity",# 添加noReset后,会记录该应用之前的操作"noReset": True,# 设置dontStopAppOnReset后,如果应用已打开,则不会关闭应用重新打开"dontStopAppOnReset": True,# 跳过安装及权限设置操作,提升执行速度"skipDeviceInitialization": True
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
# 设置隐式等待
driver.implicitly_wait(3)
driver.find_element(by=AppiumBy.ID, value="com.jianshu.haruki:id/et_account").send_keys("13000000000")
sleep(3)
driver.quit()

二、Appium常用定位方法

1. ID定位

id定位基本可selenium定位差不多,调用find_element()方法,传入定位方法和resource-id的值即可
id的值可以通过Appium inspector查看:

代码示例:

# by为定位方法,ID即为AppiumBy.ID,value为ID的值
driver.find_element(by=AppiumBy.ID, value="com.jianshu.haruki:id/et_account")

注:id和resource-id的值通常是一致的

2. XPATH定位

(1)定义:
XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。
XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初XPath的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模型。但是XPath很快地被开发者采用来当作小型查询语言。

(2)语法:
选取节点 XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。
常用表达式:

表达式 描述
nodename 选取此节点的所有子节点
/ 从根节点选取,路径中/代表当前节点选取元素
// 从匹配选择的当前节点选择文档中的节点,选择当前节点的所有子节点(子节点不限制层级)
. 选取当前节点
选取当前节点的父节点
@ 选取属性

常用路径表达式示例:

路径表达式 说明
/android.widget.RelativeLayout/android.widget.TextView[1] 选取属于android.widget.RelativeLayout子元素的第一个android.widget.TextView元素
/android.widget.RelativeLayout/android.widget.TextView[last()] 选取属于android.widget.RelativeLayout子元素的最后一个android.widget.TextView元素
/android.widget.RelativeLayout/android.widget.TextView[last()-1] 选取属于android.widget.RelativeLayout子元素的倒数第二个android.widget.TextView元素
//android.widget.TextView[@text=‘登录’] 选取所有的android.widget.TextView元素,且这些元素拥有值为:登录 的text属性

3. ACCESSIBILITY ID定位

uiautomatorviewer界面上没有这个字段,这个对应的字段是content-desc

driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value='test').click()

4. CSS SELECTOR定位

基本与web端的定位是一样的规则,不过原生应用并不支持css selector,只有app中嵌套的网页可以使用该种定位方式

选择器 例子 描述
.class .intor 选择class="intro"的所有元素
#id #firstname 选择id="firstname"的所有元素
element * 选择所有元素
element,element div,p 选择所有div元素和p元素,同时选择2个元素
element element div p 选择div元素内部的所有p元素,无视层级,相当于xpath的//
element>element div>p 选择div元素所有的子元素p,注意是子元素,相当于xpath的/
element+element div+p 选择在div元素之后的所有p元素,同一个层级
[attribute] [target] 选择带有target属性的所有元素
[attribut=value] [target=_blank] 选择target="_blank"的所有元素
:nth-child(n) p:nth-child(2) 选择属于父元素的第二个字元素的每个p元素
element1~element2 p~ul 选择前面有p元素的每个ul元素

三、Appium常用等待

1. 强制等待

使用sleep进行强制等待,不建议使用,时长无法确认,成功也无法确保

2. 隐式等待

使用implicitly_wait()方法进行隐式等待,隐式等待时全局的,适用于大部分场景

3. 显式等待

显式等待可以对个别难以获取的元素进行单独定义,定义完成后可以确保元素被查找到或可操作为止。

四、元素定位工具(android)

uiautomatorviewer相对于Appium inspector更轻量一些,可以直接命令使用

1. uiautomatorviewer启动

通常Android sdk安装完成后,uiautomatorviewer已经可以正常使用,在terminal窗口,直接执行uiautomatorviewer即可,执行完成后弹出手机页面:

  1. 左上角第一个按钮打开,打开保存的页面元素文件
  2. 第二个按钮同步手机页面,并在右侧展示当前页面的元素
  3. 第三个按钮,压缩当前页面的元素,只显示主要的元素
  4. 第四个按钮保存当前元素页面,包含一个截图和元素文件

2. uiautomatorviewer使用

uiautomatorviewer窗口左侧栏中选择需要定位的元素,右侧dom树查找到对应的元素,根据对应信息编写定位的表达式即可

3. uiautomatorviewer异常处理

问题现象:mac启动uiautomatorviewer后,uiautomatorviewer窗口不显示操作按钮,类似卡住未响应的状态
问题原因:兼容性有问题
解决方案:

  • 下载swt.jar工具包,下载地址:https://archive.eclipse.org/eclipse/downloads/drops4/R-4.20-202106111600/swt-4.20-cocoa-macosx-x86_64.zip
  • 解压文件,重命名文件夹中的swt.jar为swt2.jar
  • 拷贝swt2.jar文件致%adbpath//tools/lib/x86_64下(目录下应该有个swt.jar文件)
  • 启动uiautomatorviewer,最大化uiautomatorviewer窗口,点击第二个按钮即可正常使用

五、uiautomator定位

uiautomator定位是android的工作引擎,速度快,缺点是表达式比较复杂,所以还是建议使用常规定位,这里简单做一下介绍

语法:driver.find_element_by_android_uiautomator(“uiautomator表达式”).click()

1. uiautomator基本定位

  • resourceid:通过resourceid定位,表达式:new UiSelector().resourceId(“id”)
  • classname:通过classname定位,表达式:new UiSelector().className(“className”)
  • content-desc:通过content-desc定位,表达式:new UiSelector().description(“content-desc值”)
  • text:通过text定位,表达式:new UiSelector().text(“text文本”)
  • textContains:通过包含某个文本来定位,表达式:new UiSelector().textContains(“包含的文本”)
  • textStartsWith:通过某个文本开头来定位,表达式:new UiSelector().textStartsWith(“开头的文本”)
  • textMatches:通过正则表达式来定位,表达式:new UiSelector().textMatches(“正则表达式”)
from time import sleepimport pytest as pytest
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumByclass TestTouch:def setup(self):desired_caps = {"platformName": "android","appium:deviceName": "b1f37e8e","appium:appPackage": "com.jianshu.haruki","appium:appActivity": "com.baiji.jianshu.ui.splash.SplashScreenActivity",# 添加noReset后,会记录该应用之前的操作"noReset": True,# 设置dontStopAppOnReset后,如果应用已打开,则不会关闭应用重新打开# "dontStopAppOnReset": True,# 跳过安装及权限设置操作,提升执行速度"skipDeviceInitialization": True}self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)# 设置隐式等待self.driver.implicitly_wait(3)def teardown(self):self.driver.quit()def test_automator(self):# uiautomator resource id定位self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'new UiSelector().resourceId("com.jianshu.haruki:id/iv_mine")').click()self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().text("点击登录")').click()self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().text("账号密码登录")').click()self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'new UiSelector().resourceId("com.jianshu.haruki:id/iv_clear_account")').click()self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'new UiSelector().resourceId("com.jianshu.haruki:id/et_account")').send_keys("13000000000")self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'new UiSelector().resourceId("com.jianshu.haruki:id/et_verification_code_or_password")').send_keys("Aa123456")self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'new UiSelector().className("android.widget.CheckBox")').click()self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'new UiSelector().resourceId("com.jianshu.haruki:id/tv_login")').click()sleep(5)if __name__ == 'main':pytest.main()

2. uiautomator组合定位

uiautomator可以进行组合定位,提高定位的准确性

  • 多个属性组合定位:
id_text = 'new UiSelector().resourceId("com.jianshu.haruki:id/tv_login").text("登录")'self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, id_text).click()
  • 父子节点组合定位:
    父元素表达式后使用childSelector方法,方法中输入子元素的表达式
id_text = 'new UiSelector().className("android.widget.RelativeLayout").childSelector(resourceId("com.jianshu.haruki:id/tv_login"))'self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, id_text).click()
  • 兄弟节点定位:
    兄弟节点表达式后使用fromParent()方法,方法中输入目标元素的表达式
id_text = 'new UiSelector().className("android.widget.RelativeLayout").fromParent(resourceId("com.jianshu.haruki:id/tv_login"))'self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, id_text).click()

注:组合定位可以在表达式后面一直添加元素的属性,确保定位的准确性

3. 滚动查找定位

页面元素当前也没有时,进行滚动查找元素
表达式:new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().text(“测试”).instance(0));

代码示例:

    def test_scroll(self):self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().textContains("测试").instance(0));').click()

总结

  1. appium中初始化driver,常用的配置项需要熟悉
  2. 定位基本和selenium中是一致的,但是需要注意的是有些定位仅适用于app中嵌套的网页,不适用原生的应用
  3. uiautomatorviewer使用时可能会有兼容问题,需要处理

APP自动化测试-3. Appium元素定位与等待相关推荐

  1. APP自动化测试-12.Appium日志分析(原理)

    APP自动化测试-12.Appium日志分析 文章目录 APP自动化测试-12.Appium日志分析 前言 一.应用启动 二.元素定位与操作 总结 前言 以Android原生应用为例,记录使用appi ...

  2. APP自动化测试-10.Appium中Desired Capabilities常用参数

    APP自动化测试-10.Appium中Desired Capabilities常用参数 文章目录 APP自动化测试-10.Appium中Desired Capabilities常用参数 前言 一.通用 ...

  3. 4、通过uiautomatorviewer实现appium元素定位

    熟悉selenium自动化的小伙伴应该知道WebDriver 提供了八种元素定位方法: id name class name tag name link text partial link text ...

  4. Python Appium 元素定位方法简单介绍

    Python  Appium  元素定位 常用的八种定位方法(与selenium通用) id定位 name定位 Xpath定位 如下图,使用 uiautomatorviewer.bat 获取页面元素 ...

  5. appium自动化,appium元素定位

    appium自动化,appium元素定位 Appium是一款综合性软件,可让您在本地.移动或混合应用程序上执行复杂的测试. 简而言之,appium自动化框架允许您在不需要 SDK 或在每次测试会话后重 ...

  6. UI自动化测试之八大元素定位方法(最新版)

    Selenium-UI自动化测试之八大元素定位方法(最新版) 前言 UI界面本质上就是HTML直接体现,脚本通过HTML标签信息来找到具体的元素. 元素定位:通过代码调用方法查找元素 一.ID定位 概 ...

  7. Appium元素定位操作app

    1.APP元素定位操作 1.Appium常用元素定位方式 2.前置代码 from appium import webdriver# 启动参数 caps = {} # 设备信息 caps["p ...

  8. Android app UI自动化测试 常用的元素定位方法

    本文简要介绍了移动端Android APP进行UI自动化测试时,常用到的元素定位方法 目录 前言 一.通过resource-id定位 二.通过class name定位 三.通过accessibilit ...

  9. Appium 自动化测试 H5页面元素定位

    简介   在现在的移动端App中,由于开发效率.需求频繁变更的需求情况下,经常有相关的运营需求,经常要进行更新,如果全部采用原生开发,需要的成本比较高,后来就出现了内嵌的H5页面.那么这些H5页面元素 ...

  10. python怎么通过手机号定位_6.1 python+appium元素定位方式(登录app)

    1.0.0 :常见的十种元素定位方式 1.driver.find_element_by_id() #id定位2.driver.find_element_by_name() #name定位(已经凉了,不 ...

最新文章

  1. Ubuntu文件管理点击没有反应
  2. C语言贪吃蛇如何让蛇一直前进,c++贪吃蛇代码中,哪条代码是让蛇知道前进的
  3. spotify 数据分析_没有数据? 没问题! 如何从Wikipedia和Spotify收集重金属数据
  4. MySQL -- SQL 语句
  5. keytool条目_keytool工具使用详解二(整理)
  6. mysql——数据库事务(C#代码)
  7. bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊(分块)
  8. 洛谷P3216 [HNOI2011]数学作业
  9. 自编Python机器人,内置词库可改写。
  10. 【Matlab】利用matlab画圆
  11. 《从0到1:CTFer成长之路》
  12. [受限玻尔兹曼机] 原理、求解过程推导、深度信念网络
  13. RTI DDS的xml说明
  14. 第二人生的源码分析(六十四)类LLCurlEasyRequest实现Http请求
  15. 阿里云掠地CDN:网宿称我们不在一条路上
  16. MySQL代码错误号大全
  17. [野史乱弹]对一段历史的大胆臆测与还原 [暴笑转载]
  18. 最长公共子序列问题-----题目
  19. Java(回文数--比较简单的写法)
  20. SQL Server 中WITH (NOLOCK)浅析 2014-08-30 11:58 by 潇湘隐者, 58264 阅读, 33 评论, 收藏, 编辑 概念介绍 开发人员喜欢在SQL脚本

热门文章

  1. Spring学习笔记
  2. POJ 3764 DFS+trie树
  3. Installation failed due to: ‘Failed to commit install session 2076767024 wit
  4. alt复制选区就会卡 ps_运行PS卡死了,学会这些Photoshop设置让PS摆脱卡顿
  5. python Numpy中的array函数讲解及各参数含义
  6. 5G和4G有那些区别
  7. Matplotlab可视化学习笔记(二):如何绘制柱状图
  8. 用Python自制一个百度一下,这操作可还行
  9. java开发工具排名_排名前16的Java工具类
  10. 【PMP】变更流程图与说明