Appium是一个跨平台移动端自动化测试工具,可以为IOS和Android平台创建自动化测试用例。可以模拟App内部的各种操作,如点击、滑动、文本输入等。只要我们手工操作的动作Appium都可以完成。
appium 支持多平台、多语言
appium在不同平台中使用了标准的自动化APIs,所以在跨平台时,不需要重新编译或者修改自己的应用。
appium支持Selenium WebDriver支持的所有语言,如java、Object-C、JavaScript、Php、Python、Ruby、C#、Clojure,或者Perl语言
,更可以使用Selenium WebDriver
的Api。
appium 支持多平台,包括 MAC 和 Windows
。它针对这两大平台开发了 appium-Server
。
又同时支持 Android 和 iOS
两个操作系统。这就使得 appium 变得非常灵活。
自动化脚本向AppiumServer
发送注册参数(URL,platformName,platformVersion,deviceName,appPackage,appActivity)
AppiumServer将bootstrap.jar包
放入手机端
中
手机端用bootstrap启动手机端口(4724)
,并将端口返回给AppiumServer
(相当于建立好了通信连接
)
自动化脚本发送请求(操作或命令或动作)给AppiumServer
AppiumServer将请求解析
并发送给bootstrap
bootstrap将请求解析发给UIAutomator
UIAutomator执行相应的操作并将结果返回给bootstrap
bootstrap将响应结果返回给AppiumServer
AppiumServer将响应结果返回到脚本
综上所述,AppiumServer像是一个请求者
;bootstrap充当桥梁
的角色,负责PC与电脑之间的通信
;UIAutomator
则是真正的执行者。
类似于HTML,页面由各个标签组成
由于appium是基于JDK+SDK环境来运行,如果想正常使用python+appium进行脚本开发,需要部署下面的环境
作用等同于 Uiautomator2
pip install Appium-Python-Client
pip install pytest
通过上面的设置,我们就具备了使用appium进行python自动化测试要求了
/wd/hub
Allow Unauthorized Certificates
,不勾选 Use ProxystartSession启动Appium-Inspector
UIAutomatorViewer
。Simple:简单模式
Advanced:高级模式
元素id值是唯一的
,所以可用id去进行定位发送秘钥
:对文本框进行输入
Appium Python Client模块与Selenium之间存在一定的版本依赖关系。
appium像是一个服务,appium-python-client是让python连接appium服务的一个驱动
,也就是一个python语言封装和appium api通讯的一个库
。
appium又继承了selenium的webdriver
,因此appium-python-client安装会更新selenium。
查看selenium和appium-python-client的版本
pip show selenium
pip show appium-python-client
卸载当前的selenium和appium-python-client
pip uninstall selenium
pip uninstall appium-python-client
安装指定版本的appium-python-clien
#安装appium-python-client的同时,系统会安装与之相匹配的selenium版本
pip install appium-python-client==2.11.0
进入【开发者模式】
在开发者选项中,打开【usb调试】、【usb安装】
android-sdk-tools环境搭建
安装installer_r24.4.1-windows.exe
,中途一定要出现【java路径
】再进行下一步
解压缩build-tools.zip 、tools.zip 、platform-tools.zip
到 安装目录【不要文件夹套着文件夹
】
打开安装目录中SDK Manager.exe
, 查看platform-tools和build-tools是否已安装
查看手机的android版本, 在SDK Manager
中 安装对应 android版本
进入【开发者模式】
步骤见1,不再赘述
打开USB调试及安装
手机通过数据线连接电脑
打开appium,点击编辑配置,将如图所示位置的安卓SDK/JDK路径分别更改为自己的路径
打开Appium Inspector配置需要连接app所需参数
{
"platformName": "Android", # 机操作系统,如 iOS, Android, 或者 FirefoxOS (必填)
"platformVersion": "9", #手机版本 (必填)
"deviceName": "FJH7N19xxx00457", #设备编码,不会进行校验,但是没有会报错 (必填)
"appPackage": "com.android.calculator2", #运行的 Android 应用的包名 (必填)
"appActivity": "com.huawei.calculator.Calculator", #程序入口类名 (必填)
"noReset": true #在当前 session 下不会重置应用的状态。默认值为 false(非必填)
}
adb devices
】,程序包名、程序入口类名
】
关闭手机所有后台程序
adb shell "dumpsys window | grep mCurrent
】
如果上面命令正确启动报错,说明当前的appActivity设置的不是app首次进入的appActivity,可以解析apk文件
- aapt dump badging apk包路径 |findstr package
- aapt dump badging F:\my_tools\DigiFinex_V2023.10.12_debugT.apk |findstr package
- aapt dump badging apk包路径 |findstr activity
- aapt dump badging F:\my_tools\DigiFinex_V2023.10.12_debugT.apk |findstr activity
配置好所需功能后,保存配置,点击启动会话
会发现手机端已经自动跳转到计算器界面,并显示在电脑端appium窗口左侧
注:如果手机是第一次连接appium,会提示下载一个软件【
Appium Settings】,正常下载安装即可
,安装后的APP如图中红框所示
之后再次使用就无需下载,【Appium Settings
】运行时会显示在手机通知栏,如图中红框所示
通过鼠标点击电脑appium上的手机计算器界面,录制需要测试的操作(以测试九九乘法表为例)
首先在DOS窗口中输入【adb shell pm clear 包名
】,按enter,意为清除缓存,防止缓存对将要进行的测试造成影响,返回结果为【Success
】即清除缓存成功
点击红框处眼睛图标,即为开始录制
开始录制具体操作,以操作7*8为例
将录制的代码复制到pycharm
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
from appium.webdriver.common.touch_action import TouchAction
# Appium服务器地址
appium_server = 'http://127.0.0.1:4723/wd/hub'
# Appium测试设备配置
desired_caps = {
"platformName": "Android",
"appium:platformVersion": "9",
"appium:deviceName": "FJH7N19131000457",
"appium:appPackage": "com.android.calculator2",
"appium:appActivity": "com.huawei.calculator.Calculator",
'unicodeKeyboard': True, # 使用自带输入法,输入中文时填True
'resetKeyboard': True, # 执行完程序恢复原来输入法
'noReset': True, # 不要重置App,如果为False的话,执行完脚本后,app的数据会清空,比如你原本登录了,执行完脚本后就退出登录了
'newCommandTimeout': 6000
}
# 连接Appium服务器
driver = webdriver.Remote(appium_server, desired_caps)
driver.implicitly_wait(10)
# TODO 干掉弹框
TouchAction(driver).tap(x=777, y=2192).perform()
# 清空计算器
driver.find_element(AppiumBy.ID, "com.android.calculator2:id/op_clr").click()
for i in range(1, 10):
for j in range(i, 10):
# TODO 按下 9
el1 = driver.find_element(AppiumBy.ID, f'com.android.calculator2:id/digit_{i}')
el1.click()
# TODO 按下 乘X
el2 = driver.find_element(AppiumBy.ACCESSIBILITY_ID, "乘")
el2.click()
# TODO 按下 8
el3 = driver.find_element(AppiumBy.ID, f'com.android.calculator2:id/digit_{j}')
el3.click()
# TODO 获取 result 结果
el4 = driver.find_element(AppiumBy.ID, "com.android.calculator2:id/result")
print(f"{i} X {j} = {el4.text}", end=", ")
# 清除
el6 = driver.find_element(AppiumBy.ID, "com.android.calculator2:id/op_clr")
el6.click()
print(f"\n-----{i}乘法已完毕-----------")
driver.quit()