Python之Appium 2自动化测试(Android篇)

一、环境搭建及准备工作

1、Appium 2 环境搭建

  • 请参考另一篇文章: Windows系统搭建Appium 2 和 Appium Inspector 环境

2、安装 Appium-Python-Client,版本要求3.0及以上

pip install Appium-Python-ClientVersion: 3.1.0

3、手机连接电脑,并在dos窗口启动 Appium Server
在这里插入图片描述

4、演示环境APP软件:ES文件浏览器

5、查看元素唯一方法

  • 复制id,点击搜索图标
    在这里插入图片描述
  • 选择id,粘贴内容,点击Search

在这里插入图片描述

  • 唯一

在这里插入图片描述

  • 不唯一

在这里插入图片描述


二、编写自动化脚本

from appium import webdriver
from appium.options.common.base import AppiumOptions
from appium.webdriver.common.appiumby import AppiumBydef create_driver():"""AppiumOptions():用于配置 Appium 测试的通用选项,可用于 Android 和 iOS 平台可以设置通用的测试选项,如平台名称、版本、自动化引擎等"""# 创建 AppiumOptions 对象options = AppiumOptions()# 加载测试的配置选项和参数(Capabilities配置)options.load_capabilities({# 自动化测试的引擎"automationName": "uiautomator2",# 平台名称"platformName": "Android",# 系统版本"platformVersion": "11",# 设备的名称"deviceName": "RK3399",# 待测试应用的包名"appPackage": "com.estrongs.android.pop",# 待测试应用的活动(Activity)名称"appActivity": ".app.openscreenad.NewSplashActivity",# 设置使用 Unicode 编码方式发送字符串到设备的键盘"unicodeKeyboard": "true",# 设置重置设备的软键盘状态并隐藏键盘"restKeyboard": "true"})# Appium服务器地址端口,本地用http://127.0.0.1:4723appium_host = 'http://192.168.100.15:4723'return webdriver.Remote(appium_host, options=options)def close_driver(driver):"""关闭驱动"""if driver:driver.quit()if __name__ == "__main__":driver = create_driver()# 设置隐式等待时间为10秒driver.implicitly_wait(10)# 元素定位代码...# 关闭驱动close_driver(driver)

三、元素定位方式

1、根据id定位

# ID 定位方法
el = driver.find_element(AppiumBy.ID, "com.estrongs.android.pop:id/txt_grant")
el.click()

在这里插入图片描述

2、根据xpath定位

# xpath 方法
el1 = driver.find_element(AppiumBy.XPATH, '//android.widget.TextView[@resource-id="android:id/title" and @text="密码设置"]')
el1.click()# xpath 简写方法
el2 = driver.find_element(AppiumBy.XPATH, '//*[@text="密码设置"]')
el2.click()

在这里插入图片描述

3、根据class定位 (建议少用,重复名称较多)

# 使用class name定位
el3 = driver.find_element(AppiumBy.CLASS_NAME, "android.widget.ImageButton")
el3.click()

在这里插入图片描述

4、根据Accessibility ID定位

# 使用Accessibility ID定位
el4 = driver.find_element(AppiumBy.ACCESSIBILITY_ID, '转到上一层级')
el4.click()

在这里插入图片描述

5、根据UIAutomator定位

  • UIAutomator元素定位是 Android 系统原生支持的定位方式,虽然与 xpath 类似,但比它更加好用,且支持元素全部属性定位.定位原理是通过android 自带的android uiautomator的类库去查找元素。 Appium元素定位方法其实也是基于Uiautomator来进行封装的。
# 使用UIAutomator定位元素 (id定位)
el5 = driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().resourceId("com.estrongs.android.pop:id/txt_grant")')
el5.click()# 使用UIAutomator定位元素 (test定位)
el6 = driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().text("搜索")')
el6.click()# 使用UIAutomator定位元素 (class name定位)
el7 = driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().className("android.widget.ImageButton")')
el7.click()

6、相同元素定位
在这里插入图片描述
在这里插入图片描述
如上图,三个输入框的class属性都是一样的,如果要根据class属性分别来获取这三个值,就使用driver.find_elements方式。代码实现如下(注意 driver.find_elements 多个 s):

# 使用class name和索引定位,查找的元素列表中的特定元素
el8 = driver.find_elements(AppiumBy.CLASS_NAME, "android.widget.EditText")
# 输入邮箱
el8[0].send_keys("123456789@qq.com")
# 输入验证码
el8[1].send_keys("654321")
# 输入密码
el8[2].send_keys("123456")

四、点击 - 输入 - 清空操作

# 运行ES文件浏览器软件,并点击同意
el = driver.find_element(AppiumBy.ID, "com.estrongs.android.pop:id/txt_grant")
el.click()# 单机操作(相当于鼠标点击):click()
el1 = driver.find_element(AppiumBy.XPATH, '//*[@text="搜索"]')
el1.click()# 输入:send_keys()
el2 = driver.find_element(AppiumBy.CLASS_NAME, "android.widget.EditText")
el2.send_keys("Android自动化")# 清空: clear()
el3 = driver.find_element(AppiumBy.CLASS_NAME, "android.widget.EditText")
el3.clear()

五、swipe()方法模拟滑动操作

  • 滑动操作是模拟用户在应用程序界面上进行手势滑动的操作。在Appium中,可以使用swipe()方法来执行滑动操作。它需要指定起始点和终止点的坐标,并且可以设置滑动的持续时间。滑动操作通常用于测试应用程序界面的可滚动性、页面切换和内容展示等功能。
# 获取屏幕尺寸
screen_size = driver.get_window_size()# 从下向上滑动
def swipeUp():# 定义起始点和终止点的坐标start_x = screen_size['width'] * 0.5start_y = screen_size['height'] * 0.9end_x = screen_size['width'] * 0.5end_y = screen_size['height'] * 0.1# swipe()方法执行滑动操作,duration参数来指定滑动的持续时间,单位为毫秒(ms)driver.swipe(start_x, start_y, end_x, end_y, duration=2000)
swipeUp()# 从上向下滑动
def swipDown():start_x = screen_size['width'] * 0.5start_y = screen_size['height'] * 0.1end_x = screen_size['width'] * 0.5end_y = screen_size['height'] * 0.9driver.swipe(start_x, start_y, end_x, end_y, duration=2000)
swipDown()# 从右向左滑动
def swipe_left_to():start_x = screen_size['width'] * 0.9start_y = screen_size['height'] * 0.5end_x = screen_size['width'] * 0.1end_y = screen_size['height'] * 0.5driver.swipe(start_x, start_y, end_x, end_y, duration=2000)
swipe_left_to()# 从左向右滑动
def swipe_right_to():start_x = screen_size['width'] * 0.1start_y = screen_size['height'] * 0.5end_x = screen_size['width'] * 0.9end_y = screen_size['height'] * 0.5driver.swipe(start_x, start_y, end_x, end_y, duration=2000)
swipe_right_to()

文章持续更新中…

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

修改git仓库地址

要修改Git仓库的远程地址&#xff0c;你可以使用以下命令&#xff1a; 查看当前的远程地址&#xff1a; git remote -v修改远程地址&#xff1a; git remote set-url origin <新的远程地址>在这个命令中&#xff0c;你需要将 <新的远程地址> 替换为你想要设置的新的…

13-Vue基础之自定义指令与插槽的使用

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…

[c++]——string类____详细初步了解string类的运用

在成为大人的路上喘口气. 目录 &#x1f393;标准库类型string &#x1f393;定义和初始化string对象 &#x1f4bb;string类对象的常见构造 &#x1f4bb;string类对象的不常见构造 &#x1f4bb;读写string对象 &#x1f393; string类对象的修改操作 &#x1f4…

openGauss学习笔记-135 openGauss 数据库运维-例行维护-检查openGauss健康状态

文章目录 openGauss学习笔记-135 openGauss 数据库运维-例行维护-检查openGauss健康状态135.1 检查办法135.2 操作步骤135.3 异常处理 openGauss学习笔记-135 openGauss 数据库运维-例行维护-检查openGauss健康状态 135.1 检查办法 通过openGauss提供的gs_check工具可以开展o…

.net 面试题7

1.请解释一下C#中的异常处理&#xff08;Exception Handling&#xff09;。 异常处理是一种用于处理程序运行过程中发生的异常情况的机制。C#中的异常处理主要是通过使用try-catch-finally语句块来实现。try块用于包含可能引发异常的代码&#xff0c;catch块用于处理已捕获的异…

亚马逊云科技本地系统迁移上云(自定义系统上云)

本地使用VMWare安装系统&#xff0c;例如CentOS7.X、龙蜥8.X等 云端使用AWS MGN服务进行迁移操作 作者&#xff1a;指剑 日期&#xff1a;2023-11-30 业务实现过程 1.本地系统安装(重点) 对安装系统需要额外注意磁盘分区 安装系统&#xff0c;在磁盘分区需要注意&#xff0c;…

List系列集合

List系列集合特点&#xff1a;有序&#xff0c;可重复&#xff0c;有索引 ArrayList&#xff1a;有序&#xff0c;可重复&#xff0c;有索引 LinkedList&#xff1a;有序&#xff0c;可重复&#xff0c;有索引 &#xff08;底层实现不同&#xff01;适合的场景不同&#xff01;…

19. 删除链表的倒数第 N 个结点 --力扣 --JAVA

题目 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 解题思路 删除链表的倒数第n个节点&#xff0c;需要从链表末尾开始计数&#xff1b;设立私有的全局变量用于统计&#xff1b;因为是单向链表&#xff0c;所以需要通过递归获取需要…

java实战(四):编写学生信息管理系统页面·

1.要求 编写程序 实现表格的输入和编辑功能。界面如下&#xff1a; 1、用户按插入键后&#xff0c;把学号、姓名和成绩插入到最后一行&#xff0c;序号显示当前的行号。 2、当用户选中表格的某一行时&#xff0c;按删除按钮&#xff0c;则这一行从表格中删除 3、编辑功能&am…

ClassPathXmlApplicationContex和ApplicationContext和BeanFactory的区别和联系

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、BeanFactory1.1定义&#xff1a;1.2特点&#xff1a; 二、ApplicationContext&#xff1a;2.1定义&#xff1a;2.2特点&#xff1a; 三、ClassPathXmlAppli…

OpenCV中八种不同的目标追踪算法

引言 目标跟踪作为机器学习的一个重要分支&#xff0c;加之其在日常生活、军事行动中的广泛应用&#xff0c;受到极大的关注。在AI潮流中&#xff0c;大家对于深度学习&#xff0c;目标跟踪肯定都会有过接触了解&#xff1a;在GPU上通过大量的数据集训练出自己想使用的垂直场景…

sqli-labs(9)

45. 不会显示报错信息通过or 1验证 在密码处输入)or(1 登录成功 )union select 1,2,3 # )union select 1,database(),3 # )union select 1,(select group_concat(table_name) from information_schema.tables where table_schemasecurity),3 # )union select 1,(select gro…

【echarts】图表清空,重新渲染数据

需求&#xff1a; 笔者在echarts图型中&#xff0c;随着点击不同按钮&#xff0c;echarts图型里的数值随着变化 问题 点击不同按钮&#xff0c;echarts图型里的数值进行了替换&#xff0c;奇怪的是&#xff0c;有的按钮可以&#xff0c;有的就不行&#xff08;点击按钮后&#…

学习记录PCL-1 通过哈希表进行三维点云的虚拟格网划分

直接对整个场景的点云进行特征提取&#xff0c;效果很差&#xff0c;因此通过划分区域格网进行划分。格网划分有很多种方式&#xff0c;在这里尝试使用哈希表进行格网链接&#xff0c;后续通过在每个格网内基于点云特征进行提取。 参考博客&#xff1a; 点云侠的PCL 点云分块_p…

ESP32-Web-Server编程- 通过文本框向 Web 提交数据

ESP32-Web-Server编程- 通过文本框向 Web 提交数据 概述 前述章节我们通过简单 HTML、AJAX、Websocket、SSE 在网页上显示数据&#xff0c;通过网页上的按钮控制 ESP32 的行为。从本节开始&#xff0c;我们将进一步了解通过网页与 ESP32 进行交互的方法。 实现更复杂的交互功…

【OJ比赛日历】快周末了,不来一场比赛吗? #12.02-12.08 #15场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 2023-12-02&#xff08;周六&#xff09; #4场比赛2023-12-03…

UDP Socket API 的讲解,以及回显服务器客户端的实现

文章目录 UDPDatagramSocktet APIDatagramPacket API UDP 客户端服务器实现 UDP 先来认识一下 UDP 的 socket api&#xff0c;两个核心的类&#xff1a;DatagramSocket、DatagramPacket. DatagramSocktet API 是一个 socket 对象。 什么是 socket&#xff1f; 操作系统&…

nginx部署多个vue或react项目

下载nginx(tar.gz) nginx: download(官方地址) 部署nginx # 进入nginx压缩包所在目录 cd /usr/nginx# 解压 tar -zxvf nginx-1.25.3.tar.gz# 安装nginx的相关依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel# 生成Makefile可编译文件 cd /usr/ng…

【JavaSE】集合(学习笔记)

一、数据结构 1、栈 压栈 / 弹栈栈顶元素、栈底元素先进后出 2、队列 入队列 / 出队列前端、后端先进先出 3、数组 查询效率高&#xff0c;增删效率低 4、链表 查询效率低(必须从头找)&#xff0c;增删效率高 5、哈希表 比较方法哈希值equals结构&#xff1a;数组 链…

golang面试题:字符串转成byte数组,会发生内存拷贝吗?

问题 字符串转成byte数组&#xff0c;会发生内存拷贝吗&#xff1f; 怎么答 字符串转成切片&#xff0c;会产生拷贝。严格来说&#xff0c;只要是发生类型强转都会发生内存拷贝。那么问题来了。 频繁的内存拷贝操作听起来对性能不大友好。有没有什么办法可以在字符串转成切片的…