编写第一个 Appium 测试脚本:从安装到运行!

前言

最近接到一个测试项目,简单描述一下,需求就是:一端发送指令,另一端接受指令并处理指令。大概看了看有上百条指令,点点点岂不是废了,而且后期迭代,每次都需要点点点,想想就头大。冷静分析一下,其实这个需求的测试工作重复性很高,操作一端发送指令,查看另一端日志,验证指令接收处理是否正确,果断考虑自动化测试方案。

框架选择

基于本人情况,选择python+pytest+appium,具体该如何搭建,我们先从理论知识开始回顾熟悉一下。

Android自动化

想要开始Android自动化,必须要获取APP的相关信息。因为appium的capabilities配置中需要使用。当然Android sdk环境变量相关是更基本的,可以自行查找文档进行配置,这里就不介绍了。

获取APP信息
  • 获取当前界面元素:adb shell dumpsys activity top

  • 获取任务列表:adb shell dumpsys activity activities

App入口
  • adb logcat |grep -i displayed

  • aapt dump badging mobike.apk | grep launchable-activity

启动应用

adb shell am start -W -n com.qw.amobile/.splash.SplashActivity -S

回顾adb基本命令
  • adb devices:查看设备

  • adb kill-server:关闭 adb 的后台进程

  • adb tcpip:让 Android 脱离 USB 线的 TCP 连接方式

  • adb connect:连接开启了 TCP 连接方式的手机

  • adb logcat:Android 日志查看

  • adb bugreport:收集日志数据,用于后续的分析,比如耗电量

adb shell

adb shell 本身就是一个 Linux 的 shell,可以调用 Android 内置命令

  • adb shell dumpsys

  • adb shell pm

  • adb shell am

  • adb shell ps

  • adb shell monkey

性能统计
  • 获取所有的 dumpsys 子命令 dumpsys | grep -i DUMP

  • 获取当前 activity adb shell dumpsys activity top

  • 获取 activities 的记录,可以获取到 appium 依赖的原始 activity dumpsys activity activities

  • 获取特定包基本信息 adb shell dumpsys package com.xueqiu.android

  • 获取系统通知 adb shell dumpsys notifification

  • 获得内存信息 adb shell dumpsys meminfo com.android.settings

  • 获取 cpu 信息 adb shell dumpsys cpuinfo

  • 获取 gpu 绘制分析 adb shell dumpsys gfxinfo com.android.settings

  • 获取短信 adb shell dumpsys activity broadcasts | grep senderName=uiautomator

Appium

我们先来看看appium的生态工具

  • Appium Desktop:内嵌了 Appium Server 和 Inspector 的综合工具

  • Appium Server:Appium 的核心工具,命令行工具

  • Appium Clients:各种语言的客户端封装库,用于连接 appium server Java、Python、Ruby、robotframework-appium

Appium Desktop

桌面版,这个更容易上手,可以让你更快体会到简易自动化的乐趣。它有哪些功能呢?元素查找、录制用例两大基本功能,爽的飞起。

Appium Server

官方推荐安装方式:npm install -g appium,这种方法可能会失败或者很慢,那可以使用下面的方法

淘宝cpm:

npm install -g cnpm --registry=https://registry.npm.taobao.org 
cnpm install -g appium

还需要安装Node,可以从Appium源码中找推荐的版本。

验证是否安装配置成功,可以执行命令

appium-doctor

哪里失败,再针对问题具体搜索解决吧。开始环境配置可能遇到很多问题,不要被吓到,一个个解决,基本都可以找到解决方案。笔者配置时也遇到很多问题,最终还是成功了。建议:安装之前先找好适配版本,可以减少很多问题。

Python中使用

需要安装Appium-Python-Client

pip install Appium-Python-Client

定位元素

想要自动化,定位元素是必要的一步,有哪些方式可以定位元素呢

class By:
    """Set of supported locator strategies."""

    ID = "id"
    XPATH = "xpath"
    LINK_TEXT = "link text"
    PARTIAL_LINK_TEXT = "partial link text"
    NAME = "name"
    TAG_NAME = "tag name"
    CLASS_NAME = "class name"
    CSS_SELECTOR = "css selector"

可以看到可以通过这么多方法来定位元素。

举个例子:定位钉钉登录页面,最终实现自动登录

class LoginPage(BasePage):

    _mobile_input_locator = (By.XPATH, '//XCUIElementTypeApplication[@name="钉钉"]/XCUIElementTypeWindow/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther[1]/XCUIElementTypeOther[2]/XCUIElementTypeTextField')
    _password_input_locator = (By.XPATH, '//XCUIElementTypeApplication[@name="钉钉"]/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther[1]/XCUIElementTypeOther[3]/XCUIElementTypeSecureTextField')
    _clear_input_locator = (By.XPATH, '//XCUIElementTypeButton[@name="清除文本"]')
    _agree_locator = (By.XPATH, '//XCUIElementTypeApplication[@name="钉钉"]/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther[1]/XCUIElementTypeOther[5]/XCUIElementTypeButton')
    _login_locator = (By.XPATH, '//XCUIElementTypeStaticText[@name="登录"]')

    def login(self, mobile, pwd):
        self.find_element_and_click(self._mobile_input_locator)
        self.find_element_and_click(self._clear_input_locator)
        self.find_element(self._mobile_input_locator).send_keys(mobile)
        self.find_element(self._password_input_locator).send_keys(pwd)
        self.find_element_and_click(self._agree_locator)
        self.find_element_and_click(self._login_locator)
        return "登录成功"

和真实场景是一样的,点击手机号输入框->清除已有输入内容->输入登录手机号->输入密码->点击同意协议->点击登录,就登录成功了。这是基于page object设计模式设计的,这就是核心逻辑,用例层调用该方法即可,后续再详细写。

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

相关推荐
Shepherd061940 分钟前
【Jenkins实战】Windows安装服务启动失败
运维·jenkins
U12Euphoria2 小时前
java项目-jenkins任务的创建和执行
java·servlet·jenkins
牧魂.2 小时前
软件测试入职要求汇总
自动化测试·软件测试·功能测试·接口测试·性能测试
编码小袁8 小时前
蓝桥杯:编程爱好者的试炼场
职场和发展·蓝桥杯
我非夏日12 小时前
JMeter进阶篇
jmeter
惜.己12 小时前
Jmeter中的配置原件(三)
功能测试·测试工具·jmeter·1024程序员节
綦枫Maple12 小时前
Jmeter基础篇(23)TPS和QPS的异同
数据库·jmeter·oracle
惜.己12 小时前
Jmeter中的配置原件(二)
测试工具·jmeter·1024程序员节
我非夏日12 小时前
JMeter项目实战
jmeter
川石课堂软件测试12 小时前
性能测试|JMeter接口与性能测试项目
javascript·数据库·python·jmeter·单元测试