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

# selenium版本

selenium==4.21.0
# 模拟器
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
4.拖拽操作 driver.drag_and_drop()
语法:driver.drag_and_drop(el1, el2)  --元素1:el1,元素2:el2
作用:将el1元素,拖拽到el2
# 拖拽操作
el1 = driver.find_element(By.XPATH, '//*[@text="浏览器"]')
el2 = driver.find_element(By.XPATH, '//*[@text="开发者头条"]')
driver.drag_and_drop(el1, el2)

5、事件链TouchAction

作用:构建相对比较复杂的,连续的触摸行为

使用步骤
通过" TouchAction" 类,创建事件链对象,然后传入 driver对象
通过添加各种方法完成事件
  • 按下
  • 长按
  • 移动
  • 等待
  • 松手
  • 轻敲
  • ...
代码示例:
# 事件链操作TouchAction
# 导包
from appium.webdriver.common.touch_action import TouchAction
# 实例化对象
action = TouchAction(driver)
time.sleep(1)
# 定位元素
ele1 = driver.find_element(By.XPATH, "//*[@text='通知']")
ele2 = driver.find_element(By.XPATH, "//*[@text='WLAN']")# 拖拽操作,将ele2,拖到 ele1位置
# press:按下操作  .wait(100):按下持续时间 move_to(ele1):移动到目标元素或坐标
action.press(ele1).wait(1000).move_to(ele2)
# 完成后,松手操作 release():松手动作
action.release()
# 提交事件链,生效
action.perform()# 再次滑动
ele3 = driver.find_element(By.XPATH, "//*[@text='电池']")
action.press(ele3).wait().move_to(ele1)
# 完成后,松手操作 release():松手动作
action.release()
# 提交事件链,生效
action.perform()# 点击安全
ele4 = driver.find_element(By.XPATH, "//*[@text='安全']")
ele4.click()
time.sleep(0.5)
# 通过事件链,绘制锁屏图案
# 点击屏幕锁定
driver.find_element(By.XPATH, "//*[@text='屏幕锁定']").click()
time.sleep(0.5)
# 点击图案
driver.find_element(By.XPATH, "//*[@text='图案']").click()
time.sleep(2)# 拖拽绘制图案
action.press(x=182, y=775)\.wait(100).move_to(x=449, y=1044) \.wait(100).move_to(x=190, y=1311) \.wait(100).move_to(x=714, y=1299)

6、截图/截屏
driver.get_screenshot_as_file('网络情况.png')
time.sleep(1)
driver.save_screenshot('网络情况2.png')
7、其它操作
重置 app
方法 driver.reset()
用法 :相当于卸载重装应用,所以本地缓存会失效。
模拟摇晃设备
方法 driver.shake
退出键盘
方法 driver.hide_keyboard()
app 置于后台运行 x
方法 driver.background_app(x)
用法 x 为置于后台的秒数
模拟系统按键
方法 :driver.press_keycode(KEYCODE_BACK)
用法 :根据 AndroidkeyCode 来完成指定操作
键名
描述  
键值
KEYCODE_CALL
拨号键
5
KEYCODE_ENDCALL
挂机键
6
KEYCODE_HOME
按键 Home
3
KEYCODE_MENU
菜单键
82
KEYCODE_BACK
返回键
4
KEYCODE_SEARCH
搜索键
84
KEYCODE_CAMERA
拍照键
27
KEYCODE_FOCUS
拍照对焦键
80
KEYCODE_POWER
电源键
2
获取手机的网络信息
# - 获取手机的网络信息:网络信息三种模式分别对应数值
# 飞行模式: 1
# 无线网络: 2
# 移动网络: 4
# 网络情况可以进行组合: 3=1+2,6=2+4
print(driver.network_connection)
# - 设置手机网络信息
driver.set_network_connection(2)
time.sleep(1)
print(driver.network_connection)
# - 获取当前手机时间
print(driver.device_time)
# - 打开通知栏
driver.open_notifications()

九、时间等待

待补充

十、APP自动化框架设计思想

参考文档:

Appium使用教程_Android篇-CSDN博客

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

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

相关文章

thinkphp6 自定义的查询构造器类

前景需求&#xff1a;在查询的 时候我们经常会有一些通用的&#xff0c;查询条件&#xff0c;但是又不想每次都填写一遍条件&#xff0c;这个时候就需要重写查询类&#xff08;Query&#xff09; 我目前使用的thinkphp版本是6.1 首先自定义CustomQuery类继承于Query <?p…

让表单引擎插上AI的翅膀-记驰骋表单引擎加入AI升级

让表单引擎插上AI的翅膀 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经逐渐渗透到我们工作和生活的每一个角落。在数字化办公领域&#xff0c;表单引擎作为数据处理和流程自动化的重要工具&#xff0c;也迎来了与AI技术深度融合的新机遇。让表单引擎…

Python零基础-下【详细】

接上篇继续&#xff1a; Python零基础-中【详细】-CSDN博客 目录 十七、网络编程 1、初识socket &#xff08;1&#xff09;socket理解 &#xff08;2&#xff09;图解socket &#xff08;3&#xff09;戏说socket &#xff08;4&#xff09;网络服务 &#xff08;5&a…

api网关kong对高频的慢接口进行熔断

一、背景 在生产环境&#xff0c;后端服务的接口响应非常慢&#xff0c;是因为数据库未创建索引导致。 如果QPS低的时候&#xff0c;因为后端服务有6个高配置的节点&#xff0c;虽然接口慢&#xff0c;还未影响到服务的正常运行。 但是&#xff0c;当QPS很高的时候&#xff0c…

整合Spring Boot 框架集成Knife4j

本次示例使用Spring Boot作为脚手架来快速集成Knife4j,Spring Boot版本2.3.5.RELEASE ,Knife4j版本2.0.7 POM.XML完整文件代码如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0…

基于开源项目ESP32 SVPWM驱动无刷电机开环速度测试

基于开源项目ESP32 SVPWM驱动无刷电机开环速度测试 ✨本篇硬件电路和代码来源于此开源项目&#xff1a;https://github.com/MengYang-x/STM3F401-FOC/tree/main&#x1f4cd;硬件电路和项目介绍&#xff0c;立创开源广场&#xff1a;https://oshwhub.com/shadow27/tai-yang-nen…

百度中心之星

目录 新材料 星际航行 新材料 直接模拟&#xff1a;因为要考虑上次出现的位置&#xff0c;所以使用map映射最好&#xff0c;如果没有出现过就建立新映射&#xff0c;如果出现过但是已经反应过就跳过&#xff0c;如果出现过但是不足以反应&#xff0c;就建立新映射&#xff0c;…

python实现——分类类型数据挖掘任务(图形识别分类任务)

分类类型数据挖掘任务 基于卷积神经网络&#xff08;CNN&#xff09;的岩石图像分类。有一岩石图片数据集&#xff0c;共300张岩石图片&#xff0c;图片尺寸224x224。岩石种类有砾岩&#xff08;Conglomerate&#xff09;、安山岩&#xff08;Andesite&#xff09;、花岗岩&am…

体验Photoshop:无需下载,直接在浏览器编辑图片

搜索Photoshop时&#xff0c;映入眼帘的是PS软件下载&#xff0c;自学PS软件需要多长时间&#xff0c;学PS软件有必要报班吗...PS软件的设计功能很多&#xff0c;除了常见的图像处理功能外&#xff0c;还涉及图形、文本、视频、出版等。不管你是平面设计师&#xff0c;UI/UX设计…

visual studio code 全局搜索

VScode写代码的时候&#xff0c;会经常性的需要进行查找代码&#xff0c;那么怎么在Visual Studio Code中进行查找呢&#xff0c;下面就来大家vscode全局搜索的方法。 想要在vscode全局搜索进行全局搜索&#xff0c;使用快捷键CTRLSHIFTF即可进行搜索&#xff0c;也可以在左边…

免费分享一套微信小程序图书借阅(图书管理)系统(SpringBoot后端)

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序图书借阅(图书管理)系统(&#xff0c;分享下哈。 项目介绍 该项目是一套图书馆信息管理系统&#xff0c;包括用户小程序以及后台管理系统&#xff0c;基于SpringBootMyBatis实现。前台商城系统包…

Linux主机安全可视化运维(免费方案)

本文介绍如何使用免费的主机安全软件,在自有机房或企业网络实现对Linux系统进行可视化“主机安全”管理。 一、适用对象 本文适用于个人或企业内的Linux服务器运维场景,实现免费、高效、可视化的主机安全管理。提前发现主机存在的安全风险,全方位实时监控主机运行时入侵事…

Windows 11 Beta 22635.3646 预览版发布:中国大陆地区新增“微软电脑管家”应用

微软今天面向 Beta 频道的 Windows Insider 项目成员&#xff0c;发布了适用于 Windows 11 的 KB5037858 更新&#xff0c;用户安装后版本号升至 Build 22635.3646&#xff0c;该版本主要为中国大陆设备新增“微软电脑管家”应用。 IT之家 5 月 24 日消息&#xff0c;微软今天…

LabVIEW中PID控制器系统的噪声与扰动抑制策略

在LabVIEW中处理PID控制器系统中的噪声和外部扰动&#xff0c;需要从信号处理、控制算法优化、硬件滤波和系统设计四个角度入手。采用滤波技术、调节PID参数、增加前馈控制和实施硬件滤波器等方法&#xff0c;可以有效减少噪声和扰动对系统性能的影响&#xff0c;提高控制系统的…

PBR系列-物理材质(上)

作者&#xff1a;游梦 对PBR系列文章感兴趣还可以看前文&#xff1a; PBR系列 - 物理光源 PBR系列-光之简史 前面两篇文章分别介绍了物理光源与光学研究简史&#xff0c;在对光有了简单认识之后&#xff0c;再认识物理材质会发现其实本质上还是对光的研究&#xff0c;再深入…

阿里云 通过EIP实现VPC下的SNAT以及DNAT

192.168.0.85 有公网地址192.1680.95无公网地址 在192.168.0.85&#xff08;有公网地址服务器上操作&#xff09; #开启端口转发 echo "net.ipv4.ip_forward 1" >> /etc/sysctl.conf sysctl -p#仅允许192.168.0.95 iptables -t nat -I POSTROUTING -s 192.16…

SqliSniper:针对HTTP Header的基于时间SQL盲注模糊测试工具

关于SqliSniper SqliSniper是一款基于Python开发的强大工具&#xff0c;该工具旨在检测HTTP请求Header中潜在的基于时间的SQL盲注问题。 该工具支持通过多线程形式快速扫描和识别目标应用程序中的潜在漏洞&#xff0c;可以大幅增强安全评估过程&#xff0c;同时确保了速度和效…

Pycharm使用时的红色波浪线报错——形如‘break‘ outside loop

背景&#xff1a; 我在一个方法中&#xff0c;写了一个if判断&#xff0c;写了一个break&#xff0c;期望终止这个函数&#xff0c;编辑器出现报错 形如下图 视频版问题教程&#xff1a; Pycharm下出现波浪线报错&#xff0c;形如break outside loop 过程&#xff1a; 很奇…

ROS2在RVIZ2中加载机器人urdf模型

参考ROS2-rviz2显示模型 我这边用的solid works生成的urdf以及meshes&#xff0c;比参考的方法多了meshes 问题一&#xff1a;Error retrieving file [package://rm_dcr_description/meshes/leftarm_link7.STL]: Package [rm_dcr_description] does not exist 这个是urdf模型中…

python-pytorch编写transformer模型实现问答0.5.00--训练和预测

python-pytorch编写transformer模型实现问答0.5.00--训练和预测 背景代码训练预测效果 背景 代码写不了这么长&#xff0c;接上一篇 https://blog.csdn.net/m0_60688978/article/details/139360270 代码 # 定义解码器类 n_layers 6 # 设置 Decoder 的层数 class Decoder(…