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 timedef 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 ').locationprint(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.75x2 = x * 0.25y1 = y * 0.75y2 = y * 0.25return 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博客

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

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

相关文章

故障诊断 | 基于 KAN、KAN卷积的轴承故障诊断模型

研究背景: 轴承是机械设备中常见的关键部件之一,其工作状态直接影响设备的性能和可靠性。因此,轴承故障的早期诊断对于设备的正常运行和维护具有重要意义。近年来,基于振动信号的轴承故障诊断成为了研究的热点之一。KAN: Kolmogorov-Arnold Network 是一种有效的处理方法。…

ax.set_xticks(range(len(years))) 将 x 轴刻度设置为数据集的索引范围

在 ax.set_xticks() 方法中,我们传递了一个参数,该参数是一个列表,用于指定 x 轴刻度的位置。在这个列表中,我们使用了 range(len(years)),其中 len(years) 是年份列表的长度。range() 函数会生成一个从 0 到 len(year…

C语言贪心算法——解硬币

题目:有1元,5元,10元,100元,500元的硬币各从c1枚, c5枚,c10枚,c50枚,c100枚, c500枚,现在要用这些硬币支付A元, 最少需要多少枚硬币 输入:第一行有…

安装flask:后端框架的学习之旅

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言 二、创建虚拟环境 1. 引入虚拟环境的概念 2. 创建Flask虚拟环境 三、安装Flask…

CSRF跨站请求伪造漏洞

CSRF跨站请求伪造漏洞 1.CSRF漏洞概述2.防御CSRF攻击3.CSRF防御绕过CSRF令牌未绑定到用户会话自定义标头令牌绕过绕过Referer检查关键词绕过 4.利用示例使用HTML标签进行GET表单 GET 请求表单POST请求通过 iframe 发送表单 POST 请求Ajax POST 请求 5.CSRF BP 验证方法6.CSRF测…

HTTP协议介绍与TCP协议的区别

1、HTTP介绍 HTTP(超文本传输协议,Hypertext Transfer Protocol)是一种用于从网络传输超文本到本地浏览器的传输协议。它定义了客户端与服务器之间请求和响应的格式。HTTP 是基于TCP/IP 进行数据的通信,通常使用端口 80/8080。HTT…

提高MongoDB效率九大优化方式

MongoDB九大优化方式: 第一:单次批量查询比循环逐条查询更快; 循环查询是开发者最常犯的错误写法。循环嵌套查询写代码快,逻辑简单,最耗时。在小批量数据处理时间一般远小于数据库查询时间。所以尽量避免增加查询次数&…

软件需求规格说明书(Word原件@配套软件全资料)

软件需求规格说明书编写规范编写规范 1.项目背景 2.项目目标 3.系统架构 4.总体流程 5.名称解释 6.功能模块 软件项目相关全套精华资料包获取方式①:点我获取 获取方式②:本文末个人名片直接获取。 软件资料清单列表部分文档清单:工作安排任…

爬虫学习--17.反爬斗争 selenium(2)

鼠标行为链 有时候在页面中的操作可能要有很多步,那么这时候可以使用鼠标行为链类ActionChains来完成。比如现在要将鼠标移动到某个元素上并执行点击事件。 actions ActionChains(driver) actions.move_to_element(inputTag) actions.send_keys_to_element(inputT…

Optional类

一、概述 泛型类、java8引进的、java.util包里 二、作用 解决空指针异常带来的不便 三、做法 将对象封装为一个Optional对象,如果封装的对象为空(即该对象不存在),可以使用默认值和或者执行默认操作 四、方法 1、empty() 创…

【Qt知识】Qt Creator快捷键

以下是Qt Creator中的一些常用快捷键列表(持续更新): 基本编辑 多行注释/取消多行注释: Ctrl /编译工程: Ctrl B运行工程: Ctrl R整行上移/下移: Ctrl Shift ↑/↓查找: Ctrl F函数声明和定义切换: F2向下查找: F3头文件和源文件切换:…

【postgresql初级使用】初识触发器,在数据行发生变化时自动执行用户行为,也可以SQL级别触发,特别是视图上可以有触发器了

初识触发器 ​专栏内容: postgresql使用入门基础手写数据库toadb并发编程 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 文章目录 初识触发器概…

【成品设计】基于RT-thread星火开发板的智能监测系统设计

《基于RT-thread星火开发板的智能监测系统设计》 所需器件: 主控:STM32F407星火开发板。温湿度传感器:采集当前环境中的温湿度。环境传感器:采集当前环境中的光照强度。CO2传感器,采集当前环境中的C02浓度。粉尘传感…

excel怎么对非数字求和汇总?

如:学生小王的成绩为:A,A,A,A,B,B-……想得到的成绩汇总求和为:2A,2A,1B,1B- 如果在低版本里,用公式计算可能相当复杂,但是有了TEXTJOIN函数和UNIQUE函数&…

校园交友|基于SprinBoot+vue的校园交友网站(源码+数据库+文档)

校园交友网站 目录 基于SprinBootvue的校园交友网站 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2后台功能模块 5.2.1管理员功能模块 5.2.2用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#x…

AKG K450配什么前端:深度解析与最佳搭配指南

AKG K450配什么前端:深度解析与最佳搭配指南 在音频世界里,选择一款合适的前端设备对于耳机音质的发挥至关重要。AKG K450作为一款备受好评的耳机,其音质细腻、低频饱满,但要想真正发挥其潜力,就需要找到一款与之相匹…

CSS学习笔记:bootstrap的介绍、下载、使用及响应式布局的实现

介绍 Bootstrap 是由 Twitter 公司开发维护的前端 UI 框架,它提供了大量编写好的CSS 样式 bootstrap过时了吗? 其实在学bootstrap这一部分的网课时,在弹幕上看到一些同学说bootstrap已经过时了,这里谈谈我的看法 我的前端学习…

3天13部,端午档电影数何以是五一档2倍?

离端午还有12天,院线端午档再上热搜。 截止至5月29日,本次端午档将有13部电影在3天的节假日内集中上映,这一数量仅比2021年端午档的最高纪录少了2部,几乎是今年五一档期上映影片数量(7部)的两倍。 并且与…

使用OpenCV创建全景图像

使用OpenCV创建全景图像 前言图像拼接策略创建全景图像相关链接前言 在本节中,我们将学习组合多个图像来创建全景图像。使用相机拍摄全景照片时,通常会拍摄多张照片,通过算法将这些图像中共同存在的元素(从左到右)映射到一张单独的图像中。为了执行图像的拼接,将利用 cv2 …

UE5 Http Server

前言 最近要用UE 作为一个服务器去接收来自外部的请求,从而在UE中处理一些内容,但是之前只做过请求,哪整过这玩意,短期内还得出结果,那怎么搞嘞,本着省事的原则就找找呗,有没有现成的&#xff0…