appium知识点笔记
目录
1. Appium是什么
Appium 是移动端的自动化测试框架,可用于测试
- 原生应用:能安装,即从应用程序市场中下载的app
- 移动网页应用:浏览器访问的应用,iOS上的Safari和Android上的 Chrome
- 混合应用:原生应用中嵌入web网页。(微信小程序)
可以用在iOS和Android操作系统上,多语言,多平台(iOS、Android,Windows、Mac)。
1.1 Appium原理
Appium使用Client/Server设计模式,Client发送HTTP请求给Server其中用任何语言来实现都可以。采用了C/S设计模式就是Appium和Selenium(WebDriver)支持多语言的原因。
Appium类库封装了selenium类库并在其基础上增加了一些扩展,以实现selenium无法完成的功能,例如:手机端操作、旋转屏幕、手机硬件、手势操作等。
Appium的底层通过HTTP协议进行交互,**在W3C协议WebDriver (w3c.github.io)的基础上进行了扩展[ Mobile JSON Wire Protocol**。
webdriver基于http协议,第一链接会建立一个session会话,并且通过post发送一个json告知服务端相关测试信息。
按照W3C的协议及appium扩展的协议可以封装成自己的测试框架,通过一系列的api完成各种客户端的操作。
1.2 Appium设计理念
Appium Client、Appium Server、被测设备
Appium Client就是脚本,可以用任何语言编写;
Appium Server提供了一整套的服务,先启动4723端口,然后会监听客户端(Appium Client)发来的请求(HTTP),客户端通过webdriver.remote给客户端发送请求建立连接;
同时server还会将请求转发给被测的移动设备,客户端和server端建立连接时发送的JSON会告诉server被测设备的信息及指令,再将指令转发给被测设备;
被测设备执行完测试转发给server,server再返回给客户端。
server可以放在云端
1.3 Appium环境
Java 1.8、Android sdk、Node js(≥10)、npm(≥6)、python3、appium-desktop、Appium-Python-Client
客户端(Appium Client):Appium-Python-Client(pip,调用webdriver需要)、python3
服务端(Appium Server):
appium-desktop:
新手友好,官网安装。包含两部分:appium inspector(录制功能)、appium server
appium server(官方方式:
npm install -g appium
;cnpm install -g appium
)还需要安装的运行环境:Node js(≥10)、npm(≥6)
手机端:
Android设备:
真机 / 模拟器(mumu模拟器(6.1)、夜神(5.1)、逍遥、genimotion(连接外网,对不同尺寸型号都能定制)、emulator(电脑性能要好,提供不同版本))
adb:android debug bridge——>需要配置Android sdk(下载、环境变量)
Java 1.8 (环境变量)
iOS设备(MacOS):
- 真机 / 模拟器:Xcode,libimobiledevice、ideviceinstaller、WDA
Android可以运行在Windows、MacOS、Linux环境下;
iOS设备只能运行在MacOS环境下
1.4 常用端口
4723、5037、7555、800*
4723:Appium server监听客户端发来的请求的端口,多设备时要监听多个端口
5037:adb server和adb clients之间的通讯端口。
7555:MuMu模拟器端口
800*:Chrome driver通讯使用的端口。appium server和手机端之间的通讯端口(8200)
1.5 Appium源代码(待补充)
Appium Package Structure - Appium
appium server: Node.js系列包、adb shell、ChromeDriver
底层引擎: Uiautomator java(Android)、WDA(IOS)、selenium
appium client: Python、java
android直接依赖于uiautomator2-driver,uiautomator2-driver间接依赖uiautomator2-server,uiautomator2-server是核心。
脚本中的所有请求先经过appium server(Node.js写的),多数逻辑直接转化给了android的Uiautomator2 Server(Java写的),收到请求后底层调用Uiautomator2来完成对应控件的识别、定位,以及操作。
二次封装appium
- 自定义Appium Server
github下载源码
- 重新编译Uiautomator
git clone appium-uisutomator2-server
2. 常用命令及设置
2.1 常用adb命令
查看当前设备:
1 | adb devices |
1 | adb kill-server |
2.1.1 获取app的信息
- app信息:
1 | # 获取当前界面元素 |
- app入口(获取包名,activity名):
1 | adb logcat |grep -i displayed # Linux |
- 启动应用
1 | adb shell am start -W -n 包名/activity名 -S |
2.2 appium常用设置
中文版:https://github.com/appium/appium/blob/master/docs/cn/writing-running-appium/caps.md
英文版:https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md / Desired Capabilities - Appium
1 | app apk地址 |
1 | “noReset” : True |
在当前 session 下不会重置应用的状态。默认值为 false。适用情景:弹框、登录等
1 | fullReset |
Stop app, clear app data and uninstall apk before session starts and after test
1 | "skipDeviceInitialization" true or false |
跳过安装、权限设置等操作,提升性能,加快速度
1 | "udid" |
多设备测试时启用
1 | "dontStopAppOnReset" |
首次启动的时候
1 | "unicodeKeyboard" |
是否输入非英文之外的语言并在测试完成后重置输入法
1 | "skipDeviceInitialization" |
跳过设备初始化:Skip device initialization which includes i.a.: installation and running of Settings app or setting of permissions.
1 | "skipServerInstallation" |
appium/appium-uiautomator2-driver: Appium driver for Android UIAutomator2 (github.com)
跳过uiautomator2 server的安装
1 | "skipUnlock" |
Skips unlock during session creation. Defaults to false
1 | "skipLogcatCapture" |
Skips to start capturing logcat. It might improve performance such as network. Log related commands will not work. Defaults to .false
跳过日志捕获,driver也提供了一个logcat的API(get_log)
1 | "waitForIdleTimeout" |
appium/settings.md at master · appium/appium (github.com)
appium/appium-uiautomator2-driver: Appium driver for Android UIAutomator2 (github.com)
Timeout used for waiting for the user interface to go into an idle state.
动态页面
2.3 Appium server的常用命令
1 | appium # 直接启动 |
2.4 Android Stadio
显示emulator支持的所有命令:
1 | emulator -help |
列出可用模拟器:
1 | emulator -list-avds |
命令行方式启动模拟器:
1 | emulator @可用模拟器名 |
2.5 补充
uiautomatorviewer
命令行启动uiautomator
3. App测试注意点
3.1 pytest:setup_class、setup
setup_class :、teardown_class在每一个类中只执行一次,先执行setup_class方法,再执行setup方法。setup、teardown在方法中调用。
4. 常用操作
3.1 弹框处理
5. 项目(进行中)
5.1项目一
项目地址:Abilish/TestPractice: 测试学习及练习汇总,包括代码、笔记等 (github.com)
项目介绍:BiliBili的自动化测试脚本。
(√ )已完成
⭕还有一半未完成
打开app(√ )—>点击搜索框(√ )—>输入搜索内容(√ )—>进行搜索(√ ⭕)—>点击up主第一个视频—这里用触屏操作下滑(√ ),然后点击屏幕中显示的第二个视频(√ )>发表评论(√ )并一键三连(√ )((●’◡’●),骗三连喽~)—>toast(√ ),然后返回首页—>测试完成(断言)(√ )—>生成测试报告(√ ) —>PO(√ )
待改进内容:
触屏操作、数据驱动、弹框使用装饰器
5.1.1 遇到的问题及解决方法
1. 搜索(待补充)
问题描述:
进行搜索有两种方法:①点击下方自动匹配出的搜索关键词; ②点击手机自带输入法中的搜索按钮进行搜索
方法①在appium自带的定位器中无法选中(如下图所示),但在uiautomator定位器中可以被选中
解决方法:
①当搜索的关键词在页面出现多次时,无法使用ID定位、无法使用Accessibility ID 定位,因此最优选择是XPATH
(//*[@text='天真的和感伤的小说家'])[2]
吐槽:appium定位器太不稳定了,老是崩,还要重启
②待补充
2.MobileBy ——> AppiumBy
1 | deprecated:: 2.1.0 |
MobileBy已弃用,已使用AppiumBy
3. 触屏操作(待修改)
appium/touch-actions.md at master · appium/appium (github.com)
在触屏操作之前要注意页面元素显示,因为find_element会不断执行隐式等待,但触屏操作不会,所以要等页面加载出来再执行触屏滑动
用着用着突然看见了已被弃用,扎心了,我都快写完了才发现,等我先写完再改TAT:
1 | 'TouchAction' action is deprecated. Please use W3C actions instead. |
W3C actions:http://appium.io/docs/en/commands/interactions/actions/
1 | element = driver.find_element_by_accessibility_id("elId") |
4. 字符串转列表
在获取点赞按钮的坐标这个属性时,获取到的是字符串
获取元素:
1 | like_element = self.driver.find_element(AppiumBy.ID, 'tv.danmaku.bili:id/recommend_icon') |
输出:
1 | PASSED [100%][104,1286][170,1352] |
解决:replace替换其中的符号,然后再使用split对逗号(,)进行切割就行。
1 | l_position = l_position.replace("][", ',').replace("[", '').replace("]", '').split(',') |
问题延伸:
1、列表转字符串:str
1 | >>> a = [1, 'ff', 'eed'] |
其他呢?
5.PO封装
page:
app.py app基本操作
6.弹框处理
基础:base_page.py
进阶:装饰器
7. 其他
appium测试运行的很慢,看了一下日志,大概是从手机端返回post请求时出现的问题,想要知道是哪里出现问题需要找到手机端的logcat
(21条消息) 使用adb logcat命令显示Android设备上的Log日志_峥嵘life的博客-CSDN博客_adb logcat
常用adb logcat命令总结
1 | 1.adb logcat -v time |
(吐槽:我太无语了,哭笑不得,用adb logcat -c
清除了一下缓存信息就突然不卡了,和我的预想差太多了,懵圈了23333)