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

在这里插入图片描述


文章目录

  • 一、app自动化控制
    • 1、清理数据:
    • 2、启动:
    • 3、关闭:
  • 二、常见控件定位方法
    • 1、android知识
    • 2、ios 基础知识
    • 3、元素定位
    • 4、控件基础知识
    • 5、app dom 结构解析
    • 6、iOS 与 Android dom 结构的区别
    • 7、定位方法
      • 测试步骤三要素
      • 定位方式:
  • 三、常见的控件定位方法
    • 1、App 定位方式进阶
    • 2、选择定位器通用原则
    • 3、元素定位的写法
    • 4、ID 定位
    • 5、ACCESSIBILITY_ID 定位
    • 6、XPath 定位
      • a、XPath 单属性定位
      • b、XPath 多属性定位
    • 7、Android 原生定位
      • a、Android 原生定位 - 单属性定位
      • b、Android 原生定位-组合定位
      • c、Android 原生定位-模糊匹配
      • d、Android 原生定位-层级定位
      • e、滑动查找元素

一、app自动化控制

1、清理数据:

driver.clear()

2、启动:

方式一:
webdriver.remote("url",desirecapability)
方式二:
launch_app():将应用启动起来(新版本不用了)
driver.activate_app("com.tencent.wework"):直接启动desire里设置的package以及activity的相关设置参数,只启动当前测试的应用

3、关闭:

driver.close()

二、常见控件定位方法

1、android知识

Android 是通过容器的布局属性来管理子控件的位置关系,布局关系就是把界面上的所有的空间,根据他们的间距的大小,摆放在正确的位置

Android 七大布局

LinerLayout(线性布局)
RelativeLayout(相对布局)
FrameLayout(帧布局)
AboluteLayout(绝对布局)
TableLayout(表格布局)
GridLayout(网格布局)
ConstraintLayout(约束布局

Android 四大组件

activity 与用户交互的可视化界面
service 实现程序后台运行的解决方案
content provider 内容提供者,提供程序所需要的数据
broadcast receiver 广播接收器,监听外部事件的到来(比如来电)

常用的控件

TextView(文本控件),EditText(可编辑文本控件)
Button(按钮),ImageButton(图片按钮),ToggleButton(开关按钮)
ImageView(图片控件)
CheckBox(复选框控件),RadioButton(单选框控件)

布局

是可用于放置很多控件的容器按照一定的规律调整内部控件的位置由此构成界面。

嵌套布局

布局内部放置布局,多层布局嵌套,可以完成复杂的界面结构

2、ios 基础知识

布局
iOS 不使用布局的概念,用变量之间的相对关系完成位置的计算
注意
使用 Appium 测试 iOS 应用需要使用 MacOS 操作系统

3、元素定位

概念:元素定位的含义就是定位控件
注意:同一脚本同时支持 android/iOS 两个系统的前提是:
元素属性(id,aid,xpath 等)一致

4、控件基础知识

dom:Document Object Model 文档对象模型
dom 应用:用于表示界面的控件层级,界面的结构化描述
常见的格式:html、xml
核心元素:节点、属性
xpath:xml路径语言,用于xml 中的节点定位

Anrdroid 应用的层级结构与 html 不一样,是一个定制的 xml
app source 类似于 dom ,表示 app 的层级,代表了界面里面所有的控件树的结构
每个控件都有它的属性(resourceid,xpath,aid),但是没有 css 属性

5、app dom 结构解析

在这里插入图片描述

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 原生定位 - 单属性定位

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

    def test_uiautomator(self):
        """android uiautomator"""
        element=self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,
                                         'new UiSelector().resourceId("android:id/text1")')
        element.click()

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

多个属性同时确定元素的(多个属性任意组合 ,不限长度)

    def test_uiautomator1(self):
        """android uiautomator"""
        element=self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'new UiSelector().resourceId("android:id/text1").text("App")')
        element.click()

在这里插入图片描述

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

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

# 模糊匹配
def test_android_uiautomator_by_text_contains(self):
    print(self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().textContains("ssi")').text)

def test_android_uiautomator_by_text_start_with(self):
    print(self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().textStartsWith("Ani")').text)

def test_android_uiautomator_by_text_match(self):
    print(self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().textMatches("^Pre.*")').text)

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

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

# 查找目标元素Text,先找App ,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、滑动查找元素

格式如下:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/2105.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大环境不好,找工作太难?三面阿里,幸好做足了准备,已拿offer

三面大概九十分钟&#xff0c;问的东西很全面&#xff0c;需要做充足准备&#xff0c;就是除了概念以外问的有点懵逼了&#xff08;呜呜呜&#xff09;。回来之后把这些题目做了一个分类并整理出答案&#xff08;强迫症的我狂补知识&#xff09;分为软件测试基础、Python自动化…

超专业解析!10分钟带你搞懂Linux中直接I/O原理

我们先看一张图&#xff1a; 这张图大体上描述了 Linux 系统上&#xff0c;应用程序对磁盘上的文件进行读写时&#xff0c;从上到下经历了哪些事情。 这篇文章就以这张图为基础&#xff0c;介绍 Linux 在 I/O 上做了哪些事情。 文件系统 什么是文件系统 文件系统&#xff0…

docker版jxTMS使用指南:数据查询

本文讲解docker版jxTMS的数据查询&#xff0c;整个系列的文章请查看&#xff1a;docker版jxTMS使用指南 请按前文所述先做好相关的准备工作&#xff0c;然后多在helloWorld界面输入各种数据后点【点我】按钮&#xff0c;以多创建点数据来为查询做下准备。 分页查询 首先在we…

python网上选课系统django-PyCharm

学生选课信息管理系统&#xff0c;可以有效的对学生选课信息、学生个人信息、教师个人信息等等进行管理。 开发语言&#xff1a;Python 框架&#xff1a;django Python版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat11 开发软件&#x…

RK3588平台开发系列讲解(NPU篇)NPU调试方法

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、日志等级二、NPU 支持查询设置项沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们一起来看一下NPU的调试方法。 一、日志等级 NPU 的运行库会根据开发板上的系统环境变量输出一些日志信息或者生成…

操作系统(2.4.5)--管程机制

1.管程的定义 利用共享数据结构抽象地表示系统中的共享资源&#xff0c;而把对该共享数据结构实施的操作定义为一组过程进程对共享资源的申请、释放和其它操作&#xff0c;都是通过这组过程对共享数据结构的操作来实现的&#xff0c;这组过程还可以根据资源的情况&#xff0c;或…

yolov8训练筷子点数数据集

序言 yolov8发布这么久了&#xff0c;一直没有机会尝试一下&#xff0c;今天用之前自己制作的筷子点数数据集进行训练&#xff0c;并且记录一下使用过程以及一些常见的操作方式&#xff0c;供以后翻阅。 一、环境准备 yolov8的训练相对于之前的yolov5简单了很多&#xff0c;…

【链表OJ题(九)】环形链表延伸问题以及相关OJ题

环形链表OJ题 1. 环形链表 链接&#xff1a;141. 环形链表 描述&#xff1a; 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&…

简单分析Linux内核基础篇——initcall

写过Linux驱动的人都知道module_init宏&#xff0c;因为它声明了一个驱动的入口函数。 除了module_init宏&#xff0c;你会发现在Linux内核中有许多的驱动并没有使用module_init宏来声明入口函数&#xff0c;而是看到了许多诸如以下的声明&#xff1a; static int __init qco…

Java之类与对象(图文结合)

目录 一、面向对象的初步认知 1、什么是面向对象 2、面向对象与面向过程 二、类定义和使用 1、简单认识类 2、类的定义格式 3、练习 &#xff08;1&#xff09;定义一个狗类 &#xff08;2&#xff09;定义一个学生类 三、类的实例化 1、什么是实例化 2、类和对象的…

CSDN 周赛38期题解

CSDN 周赛38期题解1、题目名称&#xff1a;代写匿名信2、题目名称&#xff1a;寻因找祖3、题目名称&#xff1a;小Q新式棋盘4、题目名称&#xff1a;拯救公主结束语1、题目名称&#xff1a;代写匿名信 小Q想要匿名举报XX领导不务正业&#xff01; 小Q害怕别人认出他的字迹。 他…

【数据结构】Java实现双向链表

目录 1. 接口的实现 2. 动手实现双链表 2.1 重写SeqList接口方法 2.2 在当前链表尾部添加节点&#xff08;尾插&#xff09; 2.3 在当前链表头部添加节点&#xff08;头插&#xff09; 2.4 检验index是否合法 2.5 在 第index位置添加节点&#xff08;任意位置&#xff09; 2.6 …

【精品】华为认证数通HCIA+HCIP题库分享(含答案解析)

嗨~大家好久不见&#xff0c;我是薄荷学姐&#xff0c;随着华为业务也全球领域的迅猛发展&#xff0c;越来越多人开始重视华为认证的重要性。今天给大家分享一下去年8月份的题库&#xff0c;基本都是一样&#xff0c;希望可以帮助到大家哈想要通过华为认证&#xff0c;除了进行…

gdb调试工具和makemakefile工具

gdb调试工具和make/makefile工具 文章目录gdb调试工具和make/makefile工具一、gdb调试工具1.debug/release2.使用二、make/makefile1.什么是make/makefile2.编写一、gdb调试工具 1.debug/release 程序有两种默认的发布方式debug和release。release是无法进行调试的。Linux中g…

Bing+ChatGPT 对传统搜索引擎的降维打击

早些时候申请了新版 Bing 的内测资格&#xff0c;终于收到了通过的邮件。 一天的体验之后&#xff0c;我的感受是&#xff1a;当新版 Bing 具备了 ChatGPT 的聊天能力之后&#xff0c;它的能力不论是对传统搜索引擎&#xff0c;还是 ChatGPT 自身&#xff0c;都将是降维打击。 …

菜鸟刷题Day3

⭐作者&#xff1a;别动我的饭 ⭐专栏&#xff1a;菜鸟刷题 ⭐标语&#xff1a;悟已往之不谏&#xff0c;知来者之可追 一.字符串压缩&#xff1a;面试题 01.06. 字符串压缩 - 力扣&#xff08;LeetCode&#xff09; 描述 字符串压缩。利用字符重复出现的次数&#xff0c;编…

Python程序员看见一个好看的手机壁纸网站,开撸!

人生苦短&#xff0c;我用python 最近好像没什么大事&#xff0c; .那就采集一下小——姐——姐————看下吧~ python 安装包资料:点击此处跳转文末名片获取 最近有同学的爬虫代码出了bug&#xff0c;给问我怎么改 于是就发现了这个好看的手机壁纸网站。 这个图片应该是违规…

【Unity工具,简单学习】PUN 2,多人在线游戏开发,初步使用

【Unity工具&#xff0c;简单学习】PUN 2&#xff0c;多人在线网络工具前言简单介绍安装简单使用一些 nomenclature 部分连接到 Server设置简单的大厅UI游戏场景搭建关卡加载事后前言 链接 简单介绍 PUN 可以让你简单地开发多人游戏&#xff0c;在全球范围推出 让开发者不用…

【Java学习笔记】38.Java 发送邮件

Java 发送邮件 使用Java应用程序发送 E-mail 十分简单&#xff0c;但是首先你应该在你的机器上安装 JavaMail API 和Java Activation Framework (JAF) 。 您可以从 Java 网站下载最新版本的 JavaMail&#xff0c;打开网页右侧有个 Downloads 链接&#xff0c;点击它下载。 您…

MySQL注入秘籍【上篇】

MySQL注入秘籍【上篇】1.数据库敏感信息常用语句2.联合(UNION)查询注入3.报错注入原理常见报错注入函数1.数据库敏感信息常用语句 获取数据库版本信息 select version(); select innodb_version;获取当前用户 select user();获取当前数据库 select database()&#xff1b;数…
最新文章