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

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

软件测试面试文档

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/914305.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

攻防世界36-fakebook-CTFWeb

攻防世界36-fakebook-CTFWeb 没发现什么&#xff0c;随便join发现blog有过滤&#xff0c;dirsearch扫描一下&#xff0c;发现robots.txt&#xff0c;和flag.php(不能直接看)&#xff0c;发现源码泄露&#xff0c;下载得源码&#xff1a; <?phpclass UserInfo{public $nam…

【Vue】简易博客项目跟做

项目框架搭建 1.使用vue create快速搭建vue项目 2.使用VC Code打开新生成的项目 端口号简单配置 修改vue.config.js文件&#xff0c;内容修改如下 所需库安装 npm install vue-resource --save --no-fund npm install vue-router3 --save --no-fund npm install axios --save …

delphi fmx android 自动更新(一)

12.2 android10测试通过 一,安卓权限设置 1,REQUEST_INSTALL_PACKAGES 权限 2,INTERNET 权限 3,READ_EXTERNAL_STORAGE 权限 4,WRITE_EXTERNAL_STORAGE 权限 5,READ_PHONE_STATE 二,安卓下载过程 一般是从http下载安装包 apk 所以,如果是http 则,manife…

VSCode本地C/C++环境配置

基本环境下载 1.我的系统是windows&#xff0c;自己先下载安装VSCode&#xff0c;网上视频实在太多&#xff0c;我建议跟着B站视频操作。 2.下载安装好后你需要明白&#xff1a;VSCode只是一个编辑工具&#xff0c;我们要写C/C代码得编译运行&#xff0c;所以我们要配置它在w…

[CKS] K8S NetworkPolicy Set Up

最近准备花一周的时间准备CKS考试&#xff0c;在准备考试中发现有一个题目关于不安全项目修复的题目。 ​ 专栏其他文章: [CKS] Create/Read/Mount a Secret in K8S-CSDN博客[CKS] Audit Log Policy-CSDN博客 -[CKS] 利用falco进行容器日志捕捉和安全监控-CSDN博客[CKS] K8S Ne…

【实验10】卷积神经网络(1)卷积算子

目录​​​​​​​ 1 自定义二维卷积算子 2 自定义带步长和零填充的二维卷积算子 3 实现图像边缘检测 4 自定义卷积层算子和汇聚层算子 4.1卷积层&#xff1a; 4.2 汇聚层&#xff1a; 5 学习torch.nn.Conv2d()、torch.nn.MaxPool2d()&#xff1b;torch.nn.avg_pool2d()&…

英伟达HOVER——用于人形机器人的多功能全身控制器:整合不同的控制模式且实现彼此之间的无缝切换

前言 前几天&#xff0c;一在长沙的朋友李总发我一个英伟达HOVER的视频(自从我今年年初以来持续不断的解读各大顶级实验室的最前沿paper、以及分享我司七月在具身领域的探索与落地后&#xff0c;影响力便越来越大了&#xff0c;不断加油 )&#xff0c;该视频说的有点玄乎&…

vue-h5:在h5中实现相机拍照加上身份证人相框和国徽框

1.基础功能 参考&#xff1a; https://blog.csdn.net/weixin_45148022/article/details/135696629 https://juejin.cn/post/7327353533618978842?searchId20241101133433B2BB37A081FD6A02DA60 https://www.freesion.com/article/67641324321/ https://github.com/AlexKrat…

如何使用IDEA创建Maven/SSM工程?

鉴于很多学校还在教授SSMJSP&#xff0c;很多同学不会使用IDEA创建Maven工程&#xff0c;这里进行说明 windows下安装jdk并配置环境 添加链接描述Windows下安装Maven并配置环境 首先你要本地安装jdk&#xff0c;Maven并配置基础环境变量&#xff0c;然后对IDEA进行jdk、Mave…

SD-WAN远程监控组网解决方案

在当今&#xff0c;企业对远程监控与管理的需求日益增加。无论是连锁门店的实时运营监控&#xff0c;还是跨区域的团队项目协作&#xff0c;企业都需要高效、稳定且安全的网络支持。传统网络连接方式&#xff0c;例如MPLS&#xff08;多协议标签交换&#xff09;&#xff0c;虽…

SQL练习(2)

题源&#xff1a;牛客官网 选择题 假设创建新用户nkw&#xff0c;现在想对于任何IP的连接&#xff0c;仅拥有user数据库里面的select和insert权限&#xff0c;则列表语句中能够实现这一要求的语句是&#xff08;&#xff09; A grant select ,insert on *.* to nkw% B grant…

Python http打印(http打印body)flask demo(http调试demo、http demo、http printer)

文章目录 代码解释 代码 # flask_http_printer.pyfrom flask import Flask, request, jsonify import jsonapp Flask(__name__)app.route(/printinfo, methods[POST]) def print_info():# 分隔符separator "-" * 60# 获取请求头headers request.headers# 获取 JS…

1163:阿克曼(Ackmann)函数

【题目描述】 阿克曼(Ackmann)函数A(m&#xff0c;n)中&#xff0c;m&#xff0c;n定义域是非负整数(m≤3,n≤10)&#xff0c;函数值定义为&#xff1a; 【输入】 输入m和n。 【输出】 函数值。 【输入样例】 2 3 【输出样例】 9代码实现 #include <stdio.h>/*1163&a…

Docker配置及简单应用

谈论/理解 Docker 的常用核心部分&#xff0c;以下皆在 Ubuntu 操作系统下进行 1 国内源安装 Docker-ce 1.1 配置 Linux 内核流量转发 因为docker和宿主机的端口映射&#xff0c;本质是内核的流量转发功能&#xff0c;所以要对其进行配置 1.1.1 未配置流量转发 如果没有配置流…

前端请求后端php接口跨域 cors问题

只需要后端在网站的入口文件 一般都是 index.php 加上 这几行代码就可以了 具体的参数可以根据需要去修改 header("Access-Control-Allow-Origin: *"); header(Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS); header(Access-Control-Allow-Heade…

Qt(程序打包)

Qt开发的程序最终都是要给用户使用的&#xff0c;用户的电脑上不可能装一个Qt的开发环境导入项目使用。因此项目项目开发完成后需要打包——制作成安装包&#xff0c;用户直接下载并安装即可使用。 1. 设置图标 设置图标的操作步骤如下&#xff1a; 1. 准备好图标文件&#xff…

LLM - 使用 LLaMA-Factory 微调大模型 Qwen2-VL SFT(LoRA) 图像数据集 教程 (2)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/143725947 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 LLaMA-…

HDLBIts习题(3):使用冒号表示位宽时,冒号两端必须是常量

&#xff08;1&#xff09;易错习题1&#xff1a;Circuits - Combinational Logic - Multiplexers - 256-to-1 4bit multiplexer 使用冒号表示位宽时&#xff0c;冒号两端必须是常量&#xff0c;因此如果使用变量&#xff0c;可以使用位拼接的方法。 &#xff08;2&#xff09;…

人工智能助手是否让程序员技能退化?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

shell排序

任务描述 本关任务&#xff1a;实现shell排序算法&#xff0c;void ShellSort(int R[],int N,int d[],int t)。 相关知识 基本思想&#xff1a;对待排记录序列先作“宏观”调整&#xff0c;再作“微观”调整&#xff0c;它是由Donald.L.Shell在1959年提出来的。 所谓“宏观”…