编写第一个 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

桌面版,这个更容易上手,可以让你更快体会到简易自动化的乐趣。它有哪些功能呢?元素查找、录制用例两大基本功能,爽的飞起。 要想启动app,需要先进行一些配置,如下图

配置完成之后,点击start session,就可以启动手机上的该app,成功启动后,就可以操作app了,启动后如下图所示

这个页面就可以查找元素定位以及录制用例。使用比较简单,不详细说了。
注意:如果报错找不到sdk,需要在配置中指定路径,如图所示

找到自己的路径复制进去,然后保存并重新打开就可以了。

Appium Server

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

淘宝cpm:

ini 复制代码
npm install -g cnpm --registry=https://registry.npm.taobao.org 
cnpm install -g appium

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

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

复制代码
appium-doctor

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

Python中使用

需要安装Appium-Python-Client

arduino 复制代码
pip install Appium-Python-Client

定位元素

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

ini 复制代码
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"

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

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

python 复制代码
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设计模式设计的,这就是核心逻辑,用例层调用该方法即可,后续再详细写。

最后

这篇内容只写了一些基础以及钉钉自动登录的简单案例,后续异常处理、用例如何运行更加稳健,我们之后再做分享,笔者目前也是在实践中。

相关推荐
骑士雄师3 分钟前
21.2 mcp-server-chart 图表化作用
python
满怀冰雪21 分钟前
01_LangChain是什么_带你理解LLM应用框架
python·langchain
道友可好29 分钟前
AI 怎么自己跑完一个 6 小时的任务?
前端·人工智能·后端
稷下元歌34 分钟前
python核心基础,这关于基于Moveltg加 Ros2实战Python编程基础实课
开发语言·python
java1234_小锋36 分钟前
Spring Boot 中 Starter 是什么?它的核心规范有哪些?请说明如何自定义一个 Starter。
java·spring boot·后端
财经资讯数据_灵砚智能40 分钟前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年6月10日
大数据·人工智能·python·ai·信息可视化·自然语言处理·灵砚智能
雪隐42 分钟前
AI股票小助手09-结果展示
人工智能·后端
Wonderful U43 分钟前
Python+Django实战|企业客户关系管理系统(CRM):客户档案、跟进记录、商机管理、合同签约、回款追踪、客户分层、数据分析
python·数据分析·django
Wonderful U43 分钟前
Python+Django实战|企业办公用品申领管理系统:物资入库、库存预警、申领审批、归还登记、损耗统计、供应商对账
android·python·django
VitoChang1 小时前
前端也能快速入门后端! NestJS前台和后台的Auth认证
前端·后端