目录

  1. 1. Appium是什么
    1. 1.1 Appium原理
    2. 1.2 Appium设计理念
    3. 1.3 Appium环境
    4. 1.4 常用端口
    5. 1.5 Appium源代码(待补充)
  2. 2. 常用命令及设置
    1. 2.1 常用adb命令
      1. 2.1.1 获取app的信息
    2. 2.2 appium常用设置
    3. 2.3 Appium server的常用命令
    4. 2.4 Android Stadio
    5. 2.5 补充
  3. 3. App测试注意点
    1. 3.1 pytest:setup_class、setup
  4. 4. 常用操作
    1. 3.1 弹框处理
  5. 5. 项目(进行中)
    1. 5.1项目一
      1. 5.1.1 遇到的问题及解决方法
        1. 1. 搜索(待补充)
        1. 2.MobileBy ——> AppiumBy
        2. 3. 触屏操作(待修改)
        3. 4. 字符串转列表
          1. 1、列表转字符串:str
        4. 5.PO封装
        5. 6.弹框处理
        6. 7. 其他

1. Appium是什么

Appium 是移动端的自动化测试框架,可用于测试

  • 原生应用:能安装,即从应用程序市场中下载的app
  • 移动网页应用:浏览器访问的应用,iOS上的Safari和Android上的 Chrome
  • 混合应用:原生应用中嵌入web网页。(微信小程序)

可以用在iOS和Android操作系统上,多语言,多平台(iOS、Android,Windows、Mac)。

1.1 Appium原理

The Appium Clients - 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可以放在云端

appium.png

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)

  1. appium-desktop:

    新手友好,官网安装。包含两部分:appium inspector(录制功能)、appium server

  2. appium server(官方方式:npm install -g appiumcnpm 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之间的通讯端口。adb.png

7555:MuMu模拟器端口

800*:Chrome driver通讯使用的端口。appium server和手机端之间的通讯端口(8200)

1.5 Appium源代码(待补充)

Appium Package Structure - Appium

Appium (github.com)

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下载源码

参考文档从源代码运行 Appium - Appium

  • 重新编译Uiautomator

git clone appium-uisutomator2-server

2. 常用命令及设置

2.1 常用adb命令

查看当前设备:

1
adb devices
1
2
3
4
adb kill-server
adb start-server # 没有server会自动启动,所以这条命令不哟个特意写
adn connect IP/端口
adb shell dumpsys window|findstr mCurrent # 查看当前窗口信息,可以用来获取当前页面名

2.1.1 获取app的信息

  • app信息:
1
2
3
4
5
# 获取当前界面元素
adb shell dumpsys activity top

# 获取任务列表(待补充)
adb shell dumpsys actity activities
  • app入口(获取包名,activity名):
1
2
3
adb logcat |grep -i displayed  			# Linux
adb shell "logcat |grep -i displayed" # Win
adb logcat |findstr -i displayed # Win
  • 启动应用
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
2
3
app apk地址
appPackage # 包名
appActivity # Activity名
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
2
"unicodeKeyboard"   
"resetKeyboard"

是否输入非英文之外的语言并在测试完成后重置输入法

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
2
3
4
appium # 直接启动
appium --help # 帮助文档
appium -g d:\appium.log # 打印日志到文件appium.log
appium -p 4723 # 多设备,启动特定端口

2.4 Android Stadio

显示emulator支持的所有命令:

1
emulator -help

列出可用模拟器:

1
emulator -list-avds  

命令行方式启动模拟器:

1
emulator @可用模拟器名

2.5 补充

  1. 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定位器中可以被选中

bilibili.png

解决方法:

①当搜索的关键词在页面出现多次时,无法使用ID定位、无法使用Accessibility ID 定位,因此最优选择是XPATH

(//*[@text='天真的和感伤的小说家'])[2]

search.png

吐槽:appium定位器太不稳定了,老是崩,还要重启

②待补充

2.MobileBy ——> AppiumBy

1
2
deprecated:: 2.1.0
Please use 'from appium.webdriver.common.appiumby import AppiumBy' instead of 'MobileBy'.

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
2
3
4
5
element = driver.find_element_by_accessibility_id("elId")
actions = ActionChains(driver)
actions.move_to_element(element)
actions.click(hidden_submenu)
actions.perform()

4. 字符串转列表

在获取点赞按钮的坐标这个属性时,获取到的是字符串

获取元素:

1
2
3
4
like_element = self.driver.find_element(AppiumBy.ID, 'tv.danmaku.bili:id/recommend_icon')
l_position= like_element.get_attribute("bounds")
print(l_position)
print(type(l_position))

输出:

1
2
PASSED                       [100%][104,1286][170,1352]
<class 'str'>

解决:replace替换其中的符号,然后再使用split对逗号(,)进行切割就行。

1
l_position = l_position.replace("][", ',').replace("[", '').replace("]", '').split(',')

问题延伸:

1、列表转字符串:str
1
2
3
>>> a = [1, 'ff', 'eed']
>>> str(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
2
3
1.adb logcat -v time
2.adb logcat -v time > D:\log.txt
3.adb logcat -c

(吐槽:我太无语了,哭笑不得,用adb logcat -c清除了一下缓存信息就突然不卡了,和我的预想差太多了,懵圈了23333)