App自动化测试_Python+Appium使用手册

一、Appium的介绍

Appium是一款开源的自动化测试工具,支持模拟器和真机上的原生应用、混合应用、Web应用;基于Selenium二次开发,Appium支持Selenium WebDriver支持的所有语言(java、 Object-C JavaScript 、p hp、 Python等,Appium支持任何一种测试框架,

二、Appium架构

Appium 是一个用Node.js编写的HTTP server,它创建、并管理多个 WebDriver sessions 来和不同平台交互,如 iOS ,Android等等. 

Appium 开始一个测试后,就会在被测设备(手机)上启动一个 server ,监听来自 Appium server的指令. 每种平台像 iOS 和Android都有不同的运行、和交互方式。所以Appium会用某个桩程序“侵入”该平台,并接受指令,来完成测试用例的运行

三、Appium的工作原理

Client端发送自动化指令给Appium server,Appium Server接收到client发送的指令后,转换为移动端能够识别的ADB指令,然后发送给移动端设备,并对移动端设备进行操作。
【工作过程】
脚本请求 --> 4723端口appium server —> 解析参数给PC端4724端口 —> 发送给设备4724端口 —> 通过设备4724端口发给bootstrap.jar —> Bootstrap.jar把命令发给uiautomator
注意: Bootstrap.jar :是 push Android 手机上的一个应用程序,主要是接受 Appium Server 的执行并 运行这些测试指令。而指令的执行正是通过UIAutomator 来驱动的。

三、Appium环境搭建

使用appium服务需要配置依赖环境,以及各个环境之间的版本需要互相兼容; 

我目前使用的版本信息: 

# JDK版本

jdk-8u261
# android SDK版本
installer_r24.4.1-windows.exe
# appium客户端
Appium-windows-1.15.1.exe
# Appium-Python-Client
pip install Appium-Python-Client==2.11.1
# 模拟器
nox_setup_v7.0.2.7_full.exe

网盘获取:

链接:https://pan.baidu.com/s/18uqZfmX9d9HqqSBIEM73uA?pwd=z5ak 
提取码:z5ak 

3.1、配置jdk环境

详见JDK配置文章:

Windows配置java环境JDK-CSDN博客

3.2、android SDK环境

详见SDK配置文章:

Android SDK下载安装(_指定版本)-CSDN博客

3.3、安装appium客户端

Appium安装除了安装Appium客户端,还要在Python环境中安装Appium-Python-Client,其作用就是将 Python 与 appium 关联起来;

需要指定版本:pip install Appium-Python-Client==2.11.1

详见Appium配置文章:

Appium安装及配置(Windows环境)-CSDN博客

3.5、下载模拟器

详见模拟器配置文章:

Android模拟器下载及配置_夜神模拟器-CSDN博客

四、启动App

操作步骤:

  • 启动桌面Appium客户端
  • 启动模拟器或移动设施(确保连接adb)
  • 启动Python脚本

4.1、启动桌面Appium客户端

双击 桌面Appium客户端-->启动服务器

4.2、启动模拟器或移动设施(确保连接adb)

ADB命令:ADB日常使用命令-CSDN博客

启动模拟器后,一般默认会已经连接adb,如果没有连接需要输入adb命令进行连接

# 验证是否连接成功
adb devices
# 建立连接
adb connect 127.0.1: 模拟器端口号〈逍遥模拟器21503〉

已连接 

4.3、运行Python脚本,启动App

启动参数:

# 1.导入appium中的webdriver
from appium import webdriver
import time


def startUp():
    print('准备启动app')
    # 2. 启动参数,配置手机连接的参数内容,
    # 所有参数信息都是键值对的方式进行连接
    desire_caps = {
        "deviceName": "127.0.0.1:62001",  # 参数1:当前设备的名称
        "platformName": "Android",  # 参数2:系统
        "platformVersion": "7.1.2",  # 参数3:系统版本号
        "appPackage": "com.android.contacts",  # 参数4:启动的app名称(包名)
        "appActivity": ".activities.PeopleActivity t12",  # 参数5:app界面名称
        "noReset": True,
        "unicodeKeyboard": True
    }
    # 3.发送连接请求
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_capabilities=desire_caps)
    # 等待时间,防止启动后立马关闭
    time.sleep(4)
    # 关闭驱动
    driver.quit()


if __name__ == '__main__':
    startUp()

启动参数说明

待补充

五、元素定位工具

Android SDK 自带的一个工具,在 sdk tools 目录下(一定关闭 appium-desktop 的自带的定位工具后打 开,否则连接不上模拟器/ 真机 )
找到 sdk 下的 tools 里面的 uiautomatorviewer.bat

详见uiautomatorviewer.bat使用文章:

appium元素定位工具_uiautomatorviewer.bat-CSDN博客

六、元素定位

6.1、单个元素定位:find_element

语法:

# 需要导包

from selenium.webdriver.common.by import By

# 用法  --传递两个参数:一个是定位属性,一个是该属性的值

driver.find_element(By. 属性 ,' 属性值 ').操作方法 
1.通过id定位
resource-id 的值为id
driver . find_element ( By . ID , " xxxx " )
2.通过class_name定位
# 取class的属性值
driver . find_element ( By . CLASS_NAME , " xxxx " )
3.通过link_text定位
# 取 text 属性值--文本属性
driver . find_element ( By . LINK_TEXT , " xxxx " )
4.通过xpath定位
# 取元素xpath路径
driver . find_element ( By . XPATH , " xxxx " )

# 使用文本属性比较实用(推荐)

driver.find_element(By.XPATH, '//*[@text="显示"]').click()
driver.find_element(By.XPATH, '//*[@text="亮度"]').click()

5.通过坐标定位driver.tap()

通过坐标定位有一定的局限性

  • 优先:任意的元素都可以通过坐标进行定位操作

  • 缺点:当手机的分辨率发生变化的时候,元素的坐标值也会发生变化

注意点:通过坐标定位的方法,一般使用场景是固定的机型或者固定的分辨率下进行自动化测试

 driver.tap()

左边通过[(x,y)]形式传入

duration:表示触碰时间/ms

# 左上角
driver.tap([(144,1327)], duration=100)  
# 右下角
driver.tap([(208, 1370)], duration=100)  

6.2、多个元素定位find_elements

find_element 方式基本一致,这个方法可以同时定位多个元素,返回一个列表
例如:通过 ID 定位到多个元素,我想点击第一个元素
driver . find_elements ( By . ID , "xxxxx" )[ 0 ]. click ()
#
list1 = driver . find_elements ( By . ID , "xxxxx" )
list1 [ 0 ]. click ()

七、元素操作方法

Appium元素的操作方法与Selenium元素操作方法,基本一样

1. click():点击

# 模拟鼠标点击操作
driver.find_element(By.ID," xxxx ").click()

2. clear():清空

# 清空元素输入框中内容
driver.find_element(By.ID," xxxx ").clear()

3. send_keys():输入

# 往输入框中,输入内容值
driver.find_element(By.ID," xxxx ").send_keys("输入的内容")

4. text:获取文本属性值

# 获得元素的text内容
result = driver.find_element(By.XPATH," xxxx").text
print(result)

5. get_attribute():获取某个标签,元素的属性

# 获取标签xxx的元素的 class 属性值
driver.find_element(By.ID,'xxx').get_attribute('class')

6. size:获取元素的大小(宽、高)

# 获取元素的大小,得到一个字典如:{'height': 48, 'width': 640}
driver.find_element(By.ID,' xxxx ').size

7. location:获取元素的坐标

# 获取元素的坐标,得到的是一个字典{}
res = driver.find_element(By.ID,' xxxx ').location

print(res)  # {'x': 108, 'y': 380}

8. is_selected():判断元素是否被选中

# 选中返回True,否则返回False
res = driver.find_element(By.ID, 'xxxx').is_selected()
print(res)  # True/False

9. is_enabled():判断元素是否被启用

# 判断元素是否被启用,返回True / False
res = driver.find_element(By.ID, 'xxxx').is_enabled()
print(res)

10. is_displayed():判断元素是否显示

#判断元素是否显示,返回True / False
res = driver.find_element(By.ID, 'xxxx').is_displayed()
print(res)

八、其它操作

8.1、操作应用包

1、判断是否安装

# 语法 返回True/False
driver.is_app_installed("应用的包名")

# 可以简单做一个判断,然后进行安装或卸载
if driver.is_app_installed('io.manong.developerdaily'):
    driver.remove_app('io.manong.developerdaily')
    print('app卸载成功')
else:
    driver.install_app(r'D:\MS_App_auto_24_529\toutiao.apk')
    print('app安装成功')

2、安装应用

install_app("app的绝对路径")
​​​​ 3、卸载应用
remove_app("应用的包名")

 4、获取当前操作的应用的界面名称

current_activity

5、获取包名
driver.current_package

8.2、操作屏幕页面

 1.获取屏幕尺寸

方法:driver.get_window_size

# 得到的是一个字典,width是屏幕的宽度,height为屏幕的高度
dic = driver.get_window_size()

print(dic )  #{'width': 1080, 'height': 1776}
2.页面滑动
app界面为了保证内存优化性,所有可操作的元素只是当前界面存在的元素,所以需要滑动屏幕,进行元素定位
方式1:坐标定位.swipe()
方法 driver.swipe(x1, y1, x2, y2,duration)
参数
(x1, y1):开始坐标,(x2, y2):结束坐标,duration:滑动时间
注意 :滑动的坐标不能超过屏幕的宽高
实现思路1:通过  driver.get_window_size()  获得窗口高和宽 -->按比例滚动
# 获取屏幕尺寸得到所用坐标
def getSize(driver):
    x = driver.get_window_size()['width']
    y = driver.get_window_size()['height']
    x1 = x * 0.75
    x2 = x * 0.25
    y1 = y * 0.75
    y2 = y * 0.25
    return x1, y1, x2, y2

# 完成上滑操作
def swipeUp(driver):
    x1, y1, x2, y2 = getSize(driver)
    driver.swipe(x1, y1, x1, y2, 100)

实现思路2:获取两个元素的坐标,在掉用swipe方法,从a元素 滚动到 b元素

# 获取元素坐标
a_dic = driver.find_element(By.XPATH,'//*[@text="WLAN"]').location  # {'x': 144, 'y': 799}
b_dic = driver.find_element(By.XPATH,'//*[@text="通知"]').location  # {'x': 144, 'y': 1471}

# 将通知 滚动到 WLAN
driver.swipe(b_dic["x"], b_dic["y"], a_dic["x"], a_dic["y"], duration=100)
方式2: 通过元素的相对位置进行滚动
# 页面滚动
el1 = driver.find_element(By.XPATH, '//*[@text="显示"]')
el2 = driver.find_element(By.XPATH, '//*[@text="WLAN"]')
# 将"显示" 滚动到 "WLAN"位置
driver.scroll(el1, el2)

如图所示,将下面的“显示”滑动到上面的“WLAN”位置 

 

3.获取界面的xml源码
方法 driver.page_source()
用法 :可以用来断言或检查
page = driver.page_source()
assert '登陆成功' in page

参考文档:

Appium使用教程_Android篇-CSDN博客

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

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

相关文章

鸿蒙OS开发:【一次开发,多端部署】(分栏控件)

一多分栏控件 介绍 本示例分别展示了多场景下,一多分栏控件的响应式变化效果。 本示例分别用到了[SideBarContainer]组件与[Navigation]组件,对应使用场景如下: ABC:即SideBarContainer组件组合Navigation组件AC:S…

Redis 中的 Zset 数据结构详解

目录 用法 1. 增 2. 删 3. 查 4. 交,并 编码方式 应用场景 Redis 中的 Zset(有序集合)是一种将元素按照分数进行排序的数据结构。与上篇写的SetRedis 中的 Set 数据结构详解不同,Zset 中的每个元素都关联一个浮点数类型的…

如何理解 Java 接口和抽象类的定义和使用场景

Java 是一种面向对象编程语言,提供了丰富的面向对象编程机制。其中,接口和抽象类是两个重要的概念,它们在设计和实现代码时扮演着关键的角色。 接口(Interface) 定义和特性 接口是 Java 中的一种引用数据类型&#…

C++学习第十一天——vector的模拟实现

✨ 生于火焰,落俗不可避免,但浪漫至死不渝 🌏 📃个人主页:island1314 🔥个人专栏:C学习 🚀 欢迎关注:👍点赞 &…

eDP V1.4协议介绍

一、说明 eDP的全称是Embedded DisplayPort嵌入式显示端口,主要应用与短距离系统内应用,例如手机、一体式台式机等。eDP V1.4b是基于DP V1.3标准制作完成,但因应用场景的不同,还是有很多区别。 电压摆幅不同,eDP相对较低; eDP功耗相对较低; DP有线材和连接器的要求,eD…

JVM监控-JMX探针的安装和使用

jvm监控的搭建和使用 ​ Java Management Extensions(JMX)是一种Java标准,用于管理和监控Java应用程序,特别是分布式系统。它提供了一种标准化的方式来管理应用程序的各种方面,包括性能监控、配置更改、事件通知等。目…

Apache POI对Excel进行读写操作

1、什么是Apache POI ​ Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是,我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。一般情况下,POI 都是用于操作 Excel 文件。 Apache POI 的应用场景&…

QT C++ 基于word模板 在书签位置写入文字和图片

如果你有按模版批量自动化操作word文件的需求,那么本文能给你一定的帮助。 它能满足你程序自动化生成报表的需求。常常用于上位机、测试仪器的软件中。 需要你你自己做个word模版文档,添加2个书签。点按钮,会按照你的模板文档生成一个同样的…

RK3588 AB镜像升级学习(一)

参考资料:Android A/B 系统_洛奇看世界的博客-CSDN博客 一、AB镜像分区 区分了OTA升级镜像的两种方式: 传统的升级方式:设备有Android系统和Recovery系统,如果Android需要升级时,把内容存到cache分区。重启后进入re…

GSM信令流程(附着、去附着、PDP激活、修改流程)

1、联合附着流程 附着包括身份认证、鉴权等 2、去附着流程 用户发起去附着 SGSN发起去附着 HLR发起去附着 GSSN使用S4发起去附着 3、Activation Procedures(PDP激活流程) 4、PDP更新或修改流程 5、Deactivate PDP Context 6、RAU(Routeing Area Update)流程 7、鉴权加…

Centos 7 安装刻录至硬件服务器

前言 在日常测试中,会遇到很多安装的场景,今天给大家讲一下centos 7 的安装,希望对大家有所帮助。 一.下载镜像 地址如下: centos官方镜像下载地址https://www.centos.org/download/ 按照需求依次点击下载 二.镜像刻录 镜像刻…

STM32---蓝牙模块ECB02(从机模式_与手机通信)

目录 1、ECB02 重点 参数 2、引脚说明 3、AT指令使用重点 4、使用USB转TTL模块测试 5、STM32开发板的接线 6、STM32通信代码 7、手机小程序 连接ECB02 1、ECB02 重点 参数 蓝牙协议: 5.2主从模式:主、从一体,可设置睡眠模式&#xff…

Jmeter压测中遇到的问题汇总

Jmeter使用过程问题总结 一、某个请求的请求体中有中文字段,执行后该请求无法成功 解决方法:在取样器的内容编码处加上UTF-8 二、遇到接口请求后报401,请求未授权(或者信息头管理器只写了cookie请求不成功) 解决方…

开展FMEA,这些准备工作你做足了吗?

在产品研发和制造过程中,失效模式与影响分析(FMEA)是一项至关重要的质量工具。它能够帮助团队提前识别和预防潜在的产品失效问题,从而提升产品的可靠性和质量。然而,要想充分发挥FMEA的效用,充分的准备工作…

全志H616(BIGTREETECH CB1)和 博通BCM2711(树莓派4B)CPU对比测试

一,实物对比图: BIGTREETECH CB1的底板接口的分布和树莓派4B是一样的,但是没有树莓派的音频接口,底板也不能放到树莓派4B的官方外壳里,因为底板的背面有一个DSI接口,高度超出了。 二,开发板硬…

【QEMU中文文档】1.关于QEMU

本文由 AI 翻译(ChatGPT-4)完成,并由作者进行人工校对。如有任何问题或建议,欢迎联系我。联系方式:jelin-shoutlook.com。 QEMU 是一款通用的开源机器仿真器和虚拟化器。 QEMU 可以通过几种不同的方式使用。最常见的用…

每日一题《leetcode--LCR 021.删除链表的倒数第N个结点》

https://leetcode.cn/problems/SLwz0R/ 这道题我们可以设一个哨兵位,然后把要遍历链表的结点指向该哨兵位。最后用for循环将指针指向要删除结点的前一个。 struct ListNode* removeNthFromEnd(struct ListNode* head, int n){struct ListNode* dummy malloc(sizeof…

[数据集][目标检测]RSNA肺炎检测数据集VOC+YOLO格式6012张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):6012 标注数量(xml文件个数):6012 标注数量(txt文件个数):6012 标注…

一文读懂OrangePi AIpro体验测评与应用开发

文章目录 OrangePi AIpro 基本介绍AI边缘计算产品对比性能测试体验1. 点亮系统2. Jupyter远程启动测试官方例程3. 官方例程在OrangePi AIpro上的运行效果1. YOLOv5 目标检测2. OCR 识别3. ResNet50 物体检测4. 图像增强模型测试5 CartoonGAN 图像风格迁移 总结参考文档 OrangeP…

.NET SK 如何给AI大模型添加搜索引擎功能?

普通的AI大模型的数据都是在一开始训练的时候决定的&#xff0c;所以大模型的数据来源都可能存在时效性。 下面我们会利用SK插件来给AI大模型添加联网功能。 准备工作 创建一个名称为5_SK_Plugin_Web的控制台项目 复制以下代码到5_SK_Plugin_Web项目文件中 <Project Sdk…