热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

app自动化测试——app自动化控制、常见控件定位方法

6、iOS 与 Android dom 结构的区别 dom 属性和节点结构类似 名字和属性命名不同 android 的 resourceid 和 ios 的 name android 的 conten

在这里插入图片描述

6、iOS 与 Android dom 结构的区别

dom 属性和节点结构类似
名字和属性命名不同
android 的 resourceid 和 ios 的 name
android 的 content-desc 和 ios 的 accessibility-id

7、定位方法


测试步骤三要素

定位、交互、断言

定位方式:

id 定位
accessibilty_id 定位
xpath 定位
classname 定位(不推荐)

三、常见的控件定位方法

Accessibility ID:识别一个唯一的 UI 元素,
对于 XCUITest 引擎,它对应的的属性名是 accessibility-id,
对于 Android 系统的页面元素,对应的属性名是 content-desc
Class name:
对于 iOS 系统,它的 class 属性对应的属性值会以XCUIElementType开头,
对于 Android 系统,它对应的是 UIAutomator2 的 class 属性(e.g.: android.widget.TextView)
ID:原生元素的标识符,
Android 系统对应的属性名为resource-id,
iOS 为name
Name:元素的名称
XPath:使用 xpath 表达式查找页面所对应的 xml 的路径

1、App 定位方式进阶

Image:通过匹配 base 64 编码的图像文件定位元素
Android UiAutomator (UiAutomator2 only):使用 UI Automator 提供的 API, 尤其是 UiSelector 类来定位元素,在 Appium 中,会发送 Java 代码作为字符串发送到服务器,服务器在应用程序的环境中执行这段代码,并返回一个或多个元素
Android View Tag (Espresso only):使用 view tag 定位元素
Android Data Matcher (Espresso only) :使用 Espresso 数据匹配器定位元素
IOS UIAutomation: 在 iOS 应用程序自动化时,可以使用苹果的 instruments 框架查找元素

2、选择定位器通用原则

与研发约定的属性优先
android 推荐 content-description
ios 推荐 label
身份属性 id
组合定位 xpath,css
其它定位

3、元素定位的写法

返回单个元素 WebElement
driver.find_element(AppiumBy.xxx, "xxx属性值")
返回元素列表 [WebElement, WebElement, WebElement…]
driver.find_elements(AppiumBy.xxx, "xxx属性值")

driver.find_element(AppiumBy.ID, “ID属性值”)
driver.find_element(AppiumBy.XPATH, “xpath表达式”)
driver.find_element(AppiumBy.CLASS_NAME, “CLASS属性值”)
driver.find_element(AppiumBy.ACCESSIBILITY_ID, “ACCESSIBILITY_ID表达式”)
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, “android uiautomator 表达式”)
driver.find_element(AppiumBy.IOS_UIAUTOMATION, “ios uiautomation 表达式”)
driver.find_element(AppiumBy.ANDROID_VIEWTAG, “ESPRESSO viewtag 表达式”)
driver.find_element(AppiumBy.ANDROID_DATA_MATCHER, “ESPRESSO data matcher 表达式”)
driver.find_element(AppiumBy.IMAGE, “IMAGE图片”)


driver.find_elements(AppiumBy.ID, “ID属性值”)
driver.find_elements(AppiumBy.XPATH, “xpath表达式”)
driver.find_elements(AppiumBy.CLASS_NAME, “CLASS属性值”)
driver.find_elements(AppiumBy.ACCESSIBILITY_ID, “ACCESSIBILITY_ID表达式”)
driver.find_elements(AppiumBy.ANDROID_UIAUTOMATOR, “android uiautomator 表达式”)
driver.find_elements(AppiumBy.IOS_UIAUTOMATION, “ios uiautomation 表达式”)
driver.find_elements(AppiumBy.ANDROID_VIEWTAG, “ESPRESSO viewtag 表达式”)
driver.find_elements(AppiumBy.ANDROID_DATA_MATCHER, “ESPRESSO data matcher 表达式”)
driver.find_elements(AppiumBy.IMAGE, “IMAGE图片”)


4、ID 定位

通过身份标识 id 查找元素
写法:find_element(AppiumBy.ID, “ID属性值”)

self.driver.find_element(AppiumBy.ID,"android:id/text1")

通过身份标识 id 查找元素,对应的是resource-id在这里插入图片描述

5、ACCESSIBILITY_ID 定位

通过 accessibility id 查找元素
写法:find_element(AppiumBy.ACCESSIBILITY_ID, "ACCESSIBILITY_ID属性值")

self.driver.find_element(AppiumBy.ACCESSIBILITY_ID,'App')

通过 accessibility_id查找元素,对应的是content-desc

在这里插入图片描述

6、XPath 定位

/从根节点选取(取子节点)。
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置(取子孙节点)
.选取当前节点。
.. 选取当前节点的父节点。
@选取属性。

a、XPath 单属性定位

基本表达式://*[@属性名=‘属性值’]

self.driver.find_element(AppiumBy.XPATH,'//*[@text="Content"]')

b、XPath 多属性定位

表达式://*[@属性名=‘属性值’ and @属性名=‘属性值’ ]

7、Android 原生定位


元素属性定位
ID 定位
文本定位
文本匹配定位
父子关系定位
兄弟关系定位


a、Android 原生定位 - 单属性定位

格式 &#39;new UiSelector().属性名("<属性值>")&#39;
比如&#xff1a;‘new UiSelector().resourceId(“android:id/text1”)’
注意外面是单引号&#xff0c;里面是双引号&#xff0c;顺序不能变
可以简写为 属性名(“<属性值>”)’
比如&#xff1a;·resourceId(“android:id/text1”)

def test_uiautomator(self):"""android uiautomator"""element&#61;self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,&#39;new UiSelector().resourceId("android:id/text1")&#39;)element.click()

b、Android 原生定位-组合定位

多个属性同时确定元素的&#xff08;多个属性任意组合 &#xff0c;不限长度&#xff09;

def test_uiautomator1(self):"""android uiautomator"""element&#61;self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,&#39;new UiSelector().resourceId("android:id/text1").text("App")&#39;)element.click()

在这里插入图片描述

c、Android 原生定位-模糊匹配

文字包含
文字以 x 开头
文字正则匹配

# 模糊匹配
def test_android_uiautomator_by_text_contains(self):print(self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, &#39;new UiSelector().textContains("ssi")&#39;).text)def test_android_uiautomator_by_text_start_with(self):print(self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, &#39;new UiSelector().textStartsWith("Ani")&#39;).text)def test_android_uiautomator_by_text_match(self):print(self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, &#39;new UiSelector().textMatches("^Pre.*")&#39;).text)

d、Android 原生定位-层级定位

兄弟元素定位 fromParent
父子结点定位 childSelector, 可以传入 resourceId() , description() 等方法

# 查找目标元素Text&#xff0c;先找App &#xff0c;fromParent() 方法可以查找兄弟结点
new UiSelector().text("App").fromParent(text("Text"))# 根据父结点查找子结点/ 子孙结点
new UiSelector().className("android.widget.ListView").childSelector(text("Text"))
滑动查找元素
new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().text("查找的元素文本").instance(0))

e、滑动查找元素

格式如下&#xff1a;

‘new UiScrollable(new
UiSelector().scrollable(true).instance(0)).scrolllntoView(new
UiSelector().text("查找的文本”).instance(0));&#39;


推荐阅读
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 使用TabActivity实现Android顶部选项卡功能
    本文介绍如何通过继承TabActivity来创建Android应用中的顶部选项卡。通过简单的步骤,您可以轻松地添加多个选项卡,并实现基本的界面切换功能。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • 本文详细介绍了iOS应用的生命周期,包括各个状态及其转换过程中的关键方法调用。 ... [详细]
  • 本文探讨了在SQL Server中处理几何类型列时遇到的INTERSECT操作限制,并提供了解决方案,包括通过转换数据类型和使用额外表结构的方法。 ... [详细]
  • 理解浏览器历史记录(2)hashchange、pushState
    阅读目录1.hashchange2.pushState本文也是一篇基础文章。继上文之后,本打算去研究pushState,偶然在一些信息中发现了锚点变 ... [详细]
  • importjava.io.*;importjava.util.*;publicclass五子棋游戏{staticintm1;staticintn1;staticfinalintS ... [详细]
  • 本文详细介绍了如何利用 Bootstrap Table 实现数据展示与操作,包括数据加载、表格配置及前后端交互等关键步骤。 ... [详细]
  • 解决Visual Studio Code中PHP Intelephense误报问题
    PHP作为一种高度灵活的编程语言,其代码结构可能导致Intelephense插件在某些情况下报告不必要的错误或警告。自1.3.3版本起,Intelephense引入了多个配置选项,允许用户根据具体的工作环境和编程风格调整这些诊断信息的显示。 ... [详细]
  • 小编给大家分享一下Vue3中如何提高开发效率,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获, ... [详细]
  • 在开发iOS应用时,面对不同状态(如数据加载成功、无数据、未登录、网络异常等)的界面管理,如何实现既高效又美观的用户体验?本文探讨了几种最佳实践方法。 ... [详细]
  • OBS Studio自动化实践:利用脚本批量生成录制场景
    本文探讨了如何利用OBS Studio进行高效录屏,并通过脚本实现场景的自动生成。适合对自动化办公感兴趣的读者。 ... [详细]
  • Windows操作系统提供了Encrypting File System (EFS)作为内置的数据加密工具,特别适用于对NTFS分区上的文件和文件夹进行加密处理。本文将详细介绍如何使用EFS加密文件夹,以及加密过程中的注意事项。 ... [详细]
author-avatar
情非不得以1_810
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有