Appium

该文章已生成可运行项目,

引言

什么是UI测试

UI (User Interface)旨在通过编写自动化脚本和使用相关工具,自动模拟用户与软件应用程序的图形用户界面(GUI)进行交互(GUI又分为Web GUI和App GUI),并验证界面元素的显示、功能和行为是否符合预期

什么项目适合做UI测试
  • 项目的需求不会频繁变动
  • 页面的 UI 已经进入稳定阶段
  • 项目周期足够长
  • 大量回归的测试任务
  • Boss要求的项目
能解决什么问题
  • 回归测试
  • 提高工作效率,保障产品质量
  • 性能测试 通过一些工具来模拟多个用户实现并发操作
  • 兼容性测试 web实例化不同的浏览器驱动相当于对不同的浏览器/设备进行操作,从而解决浏览器及设备的兼容性测试问题
市面上UI测试工具的种类
  • Appium:一种开源的跨平台自动化测试框架,支持 Android 和 iOS 平台。它基于 WebDriver 协议,采用 HTTP/REST API 的方式与移动设备进行通信,可以使用多种编程语言(如 Java、JavaScript、Python、Ruby 等)编写测试代码。能够模拟用户操作,对移动应用进行功能和性能测试
  • Airtest:一款使用 Python 开发的跨平台游戏和应用自动化测试框架。它支持多种游戏引擎(如 Unity3D、Cocos2d-x、Egret、Layabox 等)以及 Android 和 iOS 平台,为开发人员提供了极大的灵活性
  • UiAutomator:Google提供的用来做安卓自动化测试的一个java库,基于Accessibility服务。功能很强,可以对第三方App进行测试,获取屏幕上任意一个APP的任意一个控件属性,并对其进行任意操作,但有两个缺点:测试脚本只能使用Java语言/测试脚本要打包成jar或者apk包上传到设备上才能运行
  • UiAutomator2:通过UiAutomator进行封装,从而支持通过python语言进行开发

Appium

appium简介

appium是一个移动端的自动化框架,可用于测试多种类型应用,可支持安卓和IOS两大平台。

Welcome - Appium Documentation

appium特点
支持多平台/跨平台
  • 支持多平台:Android、IOS等
  • 支持跨平台:Windows、Linux等
支持三种类型的应用
  • Native APP:原生应用(基于SDK开发的应用)
  • Mobile Web App:移动Web应用(通过移动浏览器访问的应用程序,如IOS的Safari,Android的Chrome)
  • Hybrid App:混合应用(在原生里面嵌套了H5页面的应用)
支持多种开发语言

appium是基于WebDriver协议,WebDriver协议一定程度上借鉴了 RESTful 架构的一些原则和设计模式,而RESTful 架构是通过 URL 来唯一标识系统中的每个资源和使用标准的 HTTP 方法(GET、POST、PUT、DELETE 等)来操作资源;因此支持Http协议的语言都能直接支持Appium运行:python、java等

appium设计原理

appium的核心是一个C/S架构,appium相当于一个web服务器,提供一套接口,它会接收客户端的命令,然后在移动设备上运行命令,最后通过HTTP响应包把结果返回给客户端,每个客户端连接上服务器后都会创建一个session,自动化都会围绕一个session进行。即appium在PC上启动一个Server,监听来自客户端的自动化测试的运行,并将请求发送到对应的的移动设备中运行。

Appium的基础环境安装

安装JDK,并配置环境变量
  • 安装配置略,验证安装java -version

安装Android SDK,并配置环境变量

AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载

步骤一:根据电脑系统选择需要下载的版本,下载完成后选择文件夹进行解压

步骤二:解压成功后双击 SDK Manager.exe,出现Android SDK Manager弹框,如下图所示

步骤三:点击install packages,选中Accept Licence,点击Install,等待下载完成(时间较长,请耐心等待...)

步骤四:配置环境变量,如下图所示

  • 配置ANDROID_HOME环境变量
  • 在path中配置platform-tools环境变量
  • 在path中配置tools环境变量

步骤五:验证安装:adb --version

安装Appium Server(需要翻墙)

Releases · appium/appium-desktop · GitHub

安装Appium Inspector(需要翻墙,Appium 工具提供的一个用于查看和分析移动应用界面元素的组件)

Releases · appium/appium-inspector · GitHub

安装python库:Appium-Python-Client
  • 安装 pip install Appium-Python-Client
  • 验证安装:pip show Appium-Python-Client

Appium在Windows上Android的实际应用

Load Capabilities

load_capabilitiess是由客户端生成的一个字典对象,在appium中主要扮演着告知服务器App运行的环境

from appium import webdriver
from appium.options.common.base import AppiumOptions
from appium.webdriver.common.appiumby import AppiumBy

options = AppiumOptions()
options.load_capabilities({
    "platformName": "Android",  # 必填参数:所测系统类型Android/Ios
    "appium:platformVersion": "13",  # 必填参数:所测系统版本13.1.1可以写成13
    "appium:deviceName": "oppo",  # 必填参数:所测系统名称:随便填,一般是手机型号
    "appPackage": "com.youmatech.worksheet",  # 所测app的包名
    "appActivity": ".app.main.activity.WelcomeActivity",  # 所测app的活动窗口名
    "noReset": True,  # 是否重置cookies
})
本地启动Appium Server服务

  • Host地址默认本机的Host:127.0.0.1
  • Port默认appium服务的端口号:4723

出现上图所示代表Appium服务启动成功!

使用数据线连接Android手机,启动Appium Inspector

步骤一: 打开开发者模式-打开USB调试模式

步骤二:输入adb devices命令,可以看到当前连接的设备列表

步骤三 :进入被测app内部,输入 adb shell dumpsys activity recents 丨find "intent={" 命令

其中 cmp=com.crcc.android.tjmhjygd/.app.main.ui.APPSplashActivity

包名appPacakge:com.crcc.android.tjmhjygd

活动窗口名:appActivity:.app.main.ui.APPSplashActivity

步骤四:输入下图所示信息,Start Session启动,启动成功会连接手机,如下图1所示(首次安装会自动下载Appium Settings,如下图2所示,不要卸载!!)

控件定位
使用ID定位

driver.find_element(AppiumBy.ID, 'com.youmatech.worksheet:id/txt_hourse').click()
driver.implicitly_wait(3)
使用Class Name定位

driver.find_element(AppiumBy.CLASS_NAME, 'android.widget.ImageButton').click()
driver.implicitly_wait(3)
使用Xpath定位

driver.find_element(AppiumBy.XPATH,
                    '//android.widget.ImageView[@resource-id="com.youmatech.worksheet:id/iv_menu"]').click()
driver.implicitly_wait(3)
使用Accessibility id定位

driver.find_element(AppiumBy.ACCESSIBILITY_ID, '转到上一层级').click()
driver.implicitly_wait(3)
使用Android Uiautomator定位
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().text("报事报修")').click()  # test属性,匹配全部
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().textContains("报修")').click()  # test属性,匹配部分
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().textStartWith("报事")').click()  # test属性,匹配开头
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().description("转到上一层级")').click()  # content-desc属性
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().resourceId("com.youmatech.worksheet:id/txt_hourse")').click()  # id属性
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().className("android.widget.ImageButton")').click()  # class属性
  • 引入 Android UIAutomator 定位方式是为了丰富 Appium 的定位手段,以应对各种复杂多变的 Android 应用界面情况,提高自动化测试的适应性和可靠性
使用坐标进行定位
left_top_x = 926
left_top_y = 2291
right_bottom_x = 986
right_bottom_y = 2332
# 计算中心位置的坐标
center_x = (left_top_x + right_bottom_x) // 2
center_y = (left_top_y + right_bottom_y) // 2
driver.tap([(center_x, center_y)])
driver.implicitly_wait(3)
time.sleep(2)
其它定位方式

  • 实际的定位方法还有很多,前面列举的是几种比较常见的方法,其它方法还需要在不断实践中去学习扩展
Appium的常用API
应用操作
  • driver.install_app(“应用包名路径”) #安装app
  • driver.remove_app(“应用包名”) #卸载app
  • driver.terminate_app(“应用包名”) #关闭app
  • driver.activate_app(“应用包名”) #打开app
  • result = driver.is_app_installed(“应用包名”) #判断app是否安装,返回bool类型
  • driver.background_app(10) #退至后台
上下文操作
  • contexts = driver.contexts #获取当前所有可用上下文

print(contexts)

  • current_context = driver.current_context #获取当前上下文

print(current_context)

  • driver.switch_to.context(‘NATIVE_APP’) #切换上下文
键盘输入

KeyEvent  |  Android Developers

使用keyevent输入(不是很好用,不建议采取这种方式)

driver.keyevent(36)
driver.keyevent(33)
driver.keyevent(40)
driver.keyevent(40)
driver.keyevent(43) # 输入hello

使用Appium内置api输入

element = driver.find_element(AppiumBy.ID, 'com.youmatech.worksheet:id/et_my')
driver.implicitly_wait(3)
element.send_keys('报事报修') # 输入文本
element.clear() # 清除文本
触摸操作(TouchAction)
  • swipe:模拟从屏幕的一个点滑动到另一个点
  • pinch:模拟双指捏合操作,用于缩小屏幕内容
  • zoom:模拟双指张开操作,用于放大屏幕内容
  • tap:模拟手指点击屏幕上的某个位置,支持多点触控
推送文件
  • pull_file:从设备上拉取文件,并以Base64格式返回文件内容
  • push_file:将Base64编码的文件内容推送到设备上的指定路径
其它操作

driver.hide_keyboard() # 收起键盘

Appium Inspector使用介绍

『App自动化测试之Appium应用篇』| 元素定位工具Appium-Inspector从简介、安装、配置到使用的完整攻略_appium inspector-优快云博客

安卓UI自动化实战
​​​​​​# @Time : 2024/8/13 14:18  
# @Author : Jacky Wang
# @File : android_demo.py
"""云物管app"""
import time

from appium import webdriver
from appium.options.common.base import AppiumOptions
from appium.webdriver.common.appiumby import AppiumBy

options = AppiumOptions()
options.load_capabilities({
    "platformName": "Android",  # 必填参数:所测系统类型Android/Ios
    "appium:platformVersion": "13",  # 必填参数:所测系统版本13.1.1可以写成13
    "appium:deviceName": "oppo",  # 必填参数:所测系统名称:随便填,一般是手机型号
    "appPackage": "com.youmatech.worksheet",  # 所测app的包名
    "appActivity": ".app.main.activity.WelcomeActivity",  # 所测app的活动窗口名
    "noReset": True,  # 是否重置cookies
})

driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", options=options)
driver.implicitly_wait(3)
# TODO 进入首页
driver.find_element(AppiumBy.ID, 'com.youmatech.worksheet:id/tv_home').click()
driver.implicitly_wait(3)

# TODO 计算中心位置的坐标,并点击坐标
left_top_x = 926
left_top_y = 2291
right_bottom_x = 986
right_bottom_y = 2332
center_x = (left_top_x + right_bottom_x) // 2
center_y = (left_top_y + right_bottom_y) // 2
# TODO 进入我的
driver.tap([(center_x, center_y)])
driver.implicitly_wait(3)
time.sleep(2)
# TODO 进入应用列表
driver.find_element(AppiumBy.ID, 'com.youmatech.worksheet:id/tv_service').click()
driver.implicitly_wait(3)
# TODO 进入报事报修页面
driver.find_element(AppiumBy.XPATH,
                    '//android.widget.TextView[@resource-id="com.youmatech.worksheet:id/tv_service_item" and @text="报事报修"]').click()
# TODO 点击房产
driver.find_element(AppiumBy.ID, 'com.youmatech.worksheet:id/txt_hourse').click()
driver.implicitly_wait(3)
# TODO 选择A1-1单元
driver.find_element(AppiumBy.XPATH,
                    '//android.widget.TextView[@resource-id="com.youmatech.worksheet:id/txt1" and @text="A1-1单元"]').click()
driver.implicitly_wait(3)
# TODO 选择1001房间
driver.find_element(AppiumBy.XPATH,
                    '//android.widget.TextView[@resource-id="com.youmatech.worksheet:id/tv_room_item" and @text="1001"]').click()
driver.implicitly_wait(3)
# TODO 点击确定
driver.find_element(AppiumBy.ID, 'com.youmatech.worksheet:id/btnSubmit').click()
driver.implicitly_wait(3)
# TODO 姓名输入汪俊红
name_element = driver.find_element(AppiumBy.ID, 'com.youmatech.worksheet:id/txt_name')
name_element.send_keys('汪俊红')
driver.implicitly_wait(3)
# TODO 手机号输入18321358297
name_element = driver.find_element(AppiumBy.ID, 'com.youmatech.worksheet:id/txt_mobile')
name_element.send_keys('18321358297')
driver.implicitly_wait(3)
# TODO 报修内容输入hello
driver.find_element(AppiumBy.ID, 'com.youmatech.worksheet:id/et_my').click()
driver.implicitly_wait(3)
driver.keyevent(36)
driver.keyevent(33)
driver.keyevent(40)
driver.keyevent(40)
driver.keyevent(43)
# TODO 收起键盘
driver.hide_keyboard()
driver.implicitly_wait(3)
# TODO 选择问题分类
driver.find_element(AppiumBy.ID, 'com.youmatech.worksheet:id/txt_category').click()
driver.implicitly_wait(3)
# TODO 选择问题分类一级
driver.find_element(AppiumBy.XPATH,
                    '//android.widget.TextView[@resource-id="com.youmatech.worksheet:id/txt1" and @text="入户门"]').click()
driver.implicitly_wait(3)
# TODO 选择问题分类二级
driver.find_element(AppiumBy.XPATH,
                    '//android.widget.TextView[@resource-id="com.youmatech.worksheet:id/txt1" and @text="门吸"]').click()
driver.implicitly_wait(3)
# TODO 选择问题描述
driver.find_element(AppiumBy.XPATH,
                    '//android.widget.TextView[@resource-id="com.youmatech.worksheet:id/txt1" and @text="未安装、安装不牢固、安装位置错误"]').click()
driver.implicitly_wait(3)
# TODO 点击确定
driver.find_element(AppiumBy.XPATH,
                    '//android.widget.ImageView[@resource-id="com.youmatech.worksheet:id/iv_menu"]').click()
driver.implicitly_wait(3)
# TODO 点击最终提交确认按钮
driver.find_element(AppiumBy.ID, 'com.youmatech.worksheet:id/btn_save').click()
driver.implicitly_wait(3)
# TODO 强制停留3s
time.sleep(3)
# TODO 退出session
driver.quit()

Appium在Windows上Ios的实际应用

苹果Ui自动化实战(仅支持ios17以下版本)

步骤一:找一个有Mac电脑的朋友使用Xcode将下方下载(需要翻墙)的Zip打包到你的苹果手机上,如下图所示

GitHub - appium/WebDriverAgent: A WebDriver server for iOS and tvOS

步骤二:在设置-通用-VPN与设备管理中找到该应用并信任它,如下图所示

步骤三:下载Itunes,并连接手机,如下图所示

iTunes - Apple (中国大陆)

步骤四:安装tidevice:pip install tidevice

验证安装:pip show tidevice

使用tidevice applist命令,查找到Wda的包,如下图所示

步骤五:使用tidevice wdaproxy -B com.facebook.WebDriverAgentRunnerqqq.xctrunner --port 8100命令启动本地服务器,如下图所示,出现WebDriverAgenet start successfully即启动成功

步骤六:安装facebook-wda:pip install facebook-wda

验证安装:pip show facebook-wda

步骤七:使用usb连接手机并使用Appium Inspector连接8100端口号,如下图所示即连接成功

步骤八:剩余步骤同安卓

# @Time : 2024/8/14 17:15  
# @Author : Jacky Wang
# @File : ios.py
import time
import wda

client = wda.Client("http://127.0.0.1:8100")
client.session().app_activate("com.YM.CloudThingTube")
client.implicitly_wait(3)
client(name='首页').click()
client.implicitly_wait(3)
client(name='我的').click()
client.implicitly_wait(3)
client(name='统计分析').click()
client.implicitly_wait(3)
client(name='工作待办').click()
client.implicitly_wait(3)
client(name='应用').click()
client.implicitly_wait(3)
client(name='报事报修').click()
client.implicitly_wait(3)
client(name='请选择房产').click()
client.implicitly_wait(3)
client(name='A1栋-1单元').click()
client.implicitly_wait(3)
client(name='1001').click()
client.implicitly_wait(3)
client(name='确定').click()
client.implicitly_wait(3)
client(name='请输入报修的详细内容').click()
client.implicitly_wait(3)
client.send_keys('这里是报修内容')
client.implicitly_wait(3)
client(name='Done').click()
client.implicitly_wait(3)
client.swipe_up()
# client.keyboard_dismiss()
client.implicitly_wait(3)
client(name='请选择处理时限').click()
client.implicitly_wait(3)
client(name='确定').click()
client.implicitly_wait(3)
time.sleep(3)
client(name='确定').click()
client.implicitly_wait(3)
time.sleep(3)

Appium使用避坑指南

1.在使用appium inspertor工具时,点击刷新,一直转圈加载?

将appium相关应用设置为允许完全后台行为

2.使用tidevide list命令时一直报错?

需要下载itunes工具

3.使用ios17版本无法与appium inspetor连接?

使用17以下ios版本

4.使用傲软投屏软件后导致电脑连接不上ios手机?

使用傲软投屏软件会和itunes冲突,不要使用,在设备管理器中将该苹果设备删除即可重新连接

5.在cmd中使用adb devices命令,出现多个设备?

使用adb disconnect 设备名称,即可断开连接

欢迎大家使用过程中持续补充...

本文章已经生成可运行项目
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值