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-CSDN博客

安卓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 设备名称,即可断开连接

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值