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()方法来执行滑动操作。它需要指定起始点和终止点的坐标,并且可以设置滑动的持续时间。滑动操作通常用于测试应用程序界面的可滚动性、页面切换和内容展示等功能。
- swipe(起始横坐标,起始纵坐标,目标横坐标,目标纵坐标,时间)
- 时间:指滑动使用多长时间,单位为毫秒,可为空(去掉duration=****)
简单示例:
# 获取屏幕宽度和高度
width = driver.get_window_size()["width"]
height = driver.get_window_size()["height"]# 从下向上滑动屏幕
driver.swipe(width*0.5, height*0.9, width*0.5, height*0.1, duration=500)# 从上向下滑动屏幕
driver.swipe(width*0.5, height*0.1, width*0.5, height*0.9, duration=500)# 从右向左滑动屏幕
driver.swipe(width*0.9, height*0.5, width*0.1, height*0.5, duration=500)# 从左向右滑动屏幕
driver.swipe(width*0.1, height*0.5, width*0.9, height*0.5, duration=500)
封装示例:
class ScreenSlider():def __init__(self, driver):"""初始化屏幕滑动器"""self.driver = driverdef get_screen_size(self):"""获取屏幕尺寸"""screen_size = self.driver.get_window_size()return screen_size["width"], screen_size["height"]def swipe_up(self, duration=500):"""从下向上滑动屏幕 x轴不变,y轴变动"""width, height = self.get_screen_size()self.driver.swipe(width*0.5, height*0.9, width*0.5, height*0.1, duration=duration)def swipe_down(self, duration=500):"""从上向下滑动屏幕 x轴不变,y轴变动"""width, height = self.get_screen_size()self.driver.swipe(width*0.5, height*0.1, width*0.5, height*0.9, duration=duration)def swipe_left(self, duration=500):"""从右向左滑动屏幕 x轴变动,y轴不变"""width, height = self.get_screen_size()self.driver.swipe(width*0.9, height*0.5, width*0.1, height*0.5, duration=duration)def swipe_right(self, duration=500):"""从左向右滑动屏幕 x轴变动,y轴不变"""width, height = self.get_screen_size()self.driver.swipe(width*0.1, height*0.5, width*0.9, height*0.5, duration=duration)
文章持续更新中…
相关文章:

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.03、手机连接电脑,并在dos窗口…...
chromium通信系统-ipcz系统(四)-ipcz-分层、和mojo的关系以及handle
在只有mojo的情况下, 进程间通信都是靠unix 域套接字来完成了,由于这种方式比较低效,并且不够灵活,后来引入了ipcz。 但是系统中基本上使用mojo做进程间通信,想要一步到位迁移到ipcz系统是比较困难的。 所以chrome团队…...
推荐一些研发人员经常用到的免费API接口
快递物流订阅与推送(含物流轨迹):【物流订阅与推送、H5物流轨迹、单号识别】支持单号的订阅与推送,订阅国内物流信息,当信息有变化时,推送到您的回调地址。地图轨迹支持在地图中展示包裹运输轨迹。包括顺丰…...
高薪资是跳出来的,好工作是面出来的~
听人劝、吃饱饭,奉劝各位小伙伴,不要订阅该文所属专栏。 如需要项目实战或者是体系化资源,文末名片加V! 作者:哈哥撩编程,工作十余年, 从事过全栈研发、产品经理等工作,目前在公司担任研发部门CTO。荣誉:2022年度博客之星Top4、2023年度超级个体得主、谷歌与亚马逊开发…...
记QListWidget中QPushButton QSS样式失效的“bug”
一、场景 有一个QListWidget的列表;里面存放了若干QListWidgetItem;每个QListWidgetItem与一个自定义类对象绑定——通过QListWidget的setItemWidget()实现。自定义对象继承于QWidget,且内含QPushButton。 二、bug描述 在该QListWidget的外…...

python提取通话记录中的时间信息
您需要安装适合中文的SpaCy模型。您可以通过运行 pip install spacypython -m spacy download zh_core_web_sm来安装和下载所需的模型。 import spacy# 加载中文模型 nlp spacy.load(zh_core_web_sm)# 示例电话记录文本 text """ Agent: 今天我们解决一下这…...

DSShop移动商城网店系统 反序列化RCE漏洞复现
0x01 产品简介 DSShop是长沙德尚网络科技有限公司推出的一款单店铺移动商城网店系统,能够帮助企业和个人快速构建手机移动商城,并减少二次开发带来的成本。 以其丰富的营销功能,精细化的用户运营,解决电商引流、推广难题,帮助企业打造生态级B2C盈利模式商业平台。完备的电商…...

docker搭建node环境开发服务器
docker搭建node环境开发服务器 本文章是我自己搭建node环境开发服务器的过程记录,不一定完全适用所有人。根据个人情况,按需取用。 命名项目路径 为了方便cd到项目路径,将项目路径重命名,方便输入。 vim /etc/profile # 修改p…...

传统制造业企业如何实现数字化转型?
传统制造企业的数字化转型涉及利用数字技术来提高效率、生产力和整体业务流程。以下是实现制造业数字化转型的关键步骤和策略: 1.当前流程的评估: 确定可以从数字化转型中受益的领域。这可能包括生产流程、供应链管理、库存控制和客户关系。 评估技术集…...

面试:说一下深拷贝,浅拷贝,引用拷贝吧;Object类中的clone是哪种呢?
目录 深拷贝、浅拷贝、引用拷贝Object类的clone()方法 深拷贝、浅拷贝、引用拷贝 ● 浅拷贝: 对基本数据类型进行值传递; 对引用类型,复制了一份引用类型的变量 里面存储的内存地址一样 指向的对象也一样。 ● 深拷贝:对基本数据…...

接口压测指南
接口压测指南 一、 为什么需要进行接口压测二 、接口压测的目标是什么三、 用什么工具进行接口压测四、 接口压测核心指标4.1 JMeter的报告模板4.2 ApiPost报告模板 五、 接口慢如何排查5.1 大体排查思路5.2 排查工具5.3 压测经验 一、 为什么需要进行接口压测 突然有一天领导…...

计算机辅助药物设计AIDD-小分子-蛋白质|分子生成|蛋白质配体相互作用预测
文章目录 计算机辅助药物设计AIDD【小分子专题】AIDD概述及药物综合数据库学习机器学习辅助药物设计图神经网络辅助药物设计自然语言处理辅助药物设计药物设计与分子生成 计算机辅助药物设计【蛋白质专题】蛋白质数据结构激酶-Kinase相似性学习基于序列的蛋白质属性预测基于结构…...
深度学习-yolo目标检测-机器学习-计算机视觉-python学习路线(呕心沥血出品-绝对精品-附资源链接)
学习路线 1. 计算机视觉基础知识 图像处理基础:了解图像的基本处理技术,如滤波、边缘检测、直方图等。数字图像处理:熟悉数字图像的表示、颜色模型、图像增强等基本概念。opencv课程链接:Python for Computer Vision with OpenCV and Deep Learning资料推荐: 书籍:《数字…...
ubuntu2204 防火墙ufw限制某ip对某端口的访问
公司内部有个ip为10.10.10.1的网关,每天定时端口扫描,然后扫描发送的数据包http server解析不了,日志里就会记录这个错误,有点烦, 用防火墙过滤一下 ubuntu的防火墙命令是 ufw, 跟ufo挺像的,也…...
常见代码优化案例记录
1. 使用StringBuilder优化字符串拼接: // 不优化的写法 String result ""; for (int i 0; i < 1000; i) {result i; }// 优化的写法 StringBuilder resultBuilder new StringBuilder(); for (int i 0; i < 1000; i) {resultBuilder.append(i)…...

【android开发-04】android中activity的生命周期介绍
1,返回栈 android中使用任务task来管理activity,一个任务就是一组存放在栈里的活动的集合,这个栈被称为返回栈。栈是一种先进先出的数据结构。当我们启动一个新的活动,他会在返回栈中人栈,并处以栈顶的位置࿰…...

java后端技术演变杂谈(未完结)
1.0版本javaWeb:原始servletjspjsbc 早期的jsp:htmljava,页面先在后端被解析,里面的java代码动态渲染完成后,成为纯html,再通过服务器发送给浏览器显示。 缺点: 服务器压力很大,因为…...

UDS 诊断报文格式
文章目录 网络层目的N_PDU 格式诊断报文的分类:单帧、多帧 网络层目的 N_PDU(network protocol data unit),即网络层协议数据单元 网络层最重要的目的就是把数据转换成符合标准的单一数据帧(符合can总线规范的),从而…...
kafka的详细安装部署
introduce Kafka是一个分布式流处理平台,主要用于处理高吞吐量的实时数据流。Kafka最初由LinkedIn公司开发,现在由Apache Software Foundation维护和开发。 Kafka的核心是一个分布式发布-订阅消息系统,它可以处理大量的消息流,并…...

【数据分享】2015-2023年我国区县逐月二手房房价数据(Excel/Shp格式)
房价是一个城市发展程度的重要体现,一个城市的房价越高通常代表这个城市越发达,对于人口的吸引力越大!因此,房价数据是我们在各项城市研究中都非常常用的数据!之前我们分享过2015-2023年我国地级市逐月房价数据&#x…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...