Appium 移动端自动化测试(Mac)

news2024/11/25 22:49:47

目录

adb调试工具(Android Debug Bridge)

 adb常用命令

Appium使用

快速体验步骤

Appium常用方法

UIAutomatorViewer 获取元素

元素等待(在指定时间内一直等待

元素操作

Swipe 滑动和拖拽事件(Scroll、drag_and_drop)

手势操作TouchAction

手机操作API(分辨率、按钮、截图、网络、通知栏)

网络补充:


0. 环境基础

  • Java(jdk 1.8)
  • Android SDK(adb)
  • Android模拟器(Genymotion、VirtualBox)

adb调试工具(Android Debug Bridge)

adb包含三个部分:

  1. Client端:运行在开发电脑上,负责发送adb命令
  2. Daemon守护进程:运行在手机(或模拟器),负责接收和执行adb命令
  3. Server端:运行在开发电脑上,负责管理Client端和手机Daemon之间的通信

adb工作原理:

  1. Client端将命令发送给Server端
  2. Server端将命令发送给Daemon端
  3. Daemon端执行
  4. Daemon端将执行结果,返回给Server端
  5. Server端将结果再返回给Client端

 adb常用命令

获取当前包名界面名(告诉手机测试哪个应用程序的哪个一个界面

  • 包名(package):一个应用程序的唯一ID
  • 界面名(activity):一个界面名对应一个界面

adb shell dumpsys window | grep mFocusedApp

        返回结果中,“/” 前的为包名,“/” 后的为界面名

 文件传输

从电脑发送文件到手机: adb push 电脑文件路径 手机的文件夹路径

从手机中拉取文件:adb pull 手机文件路径 电脑的文件夹路径

获取app启动时间

adb shell am start -w 包名/启动名

  • ThisTime:该界面(activity)启动耗时(毫秒)
  • TotalTime:应用自身启动耗时 = ThisTime + 应用application等资源启动时间(毫秒)
  • WaitTime:系统启动应用耗时 = TotalTime + 系统资源启动时间(毫秒)

点击图标 -> 系统资源调度 -> application程序启动 -> activity界面加载 -> 界面展示完成

获取手机日志

adb logcat

找日志中at……前面 第一个字符为 "E" 的均为错误信息

  • 安装app到手机                                adb install 路径/xx.apk
  • 卸载手机上的app                             adb uninstall 包名
  • 获取当前电脑已经连接的设备          adb devices
  • 进入到安卓手机内部的Linux            adb shell     exit退出Linux

# 重启adb服务

  • 启动adb服务器                                adb start-server
  • 停止adb服务器                                adb kill-server
  • 查看adb帮助                                    adb --help

Appium使用

  • 通过官网下载Appium: Mobile App Automation Made Awesome.
    • 若失败,通过nodejs下载npm 这个链接
  • pip3 install appium-python-client
    • 若失败,参考这个博客。 pip3 install --upgrade pip --user

快速体验步骤

  1. 打开手机模拟器(Genymotion)
  2. 打开appium.app工具
  3. 创建Python项目 from appium import webdriver
from appium import webdriver
import time

desired_caps = dict()
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '10'
# 设备名,按默认,主要用于限制iOS
desired_caps['deviceName'] = '192.168.56.101:5555'
# 包名
desired_caps['appPackage'] = 'com.android.settings'
# 界面名
desired_caps['appActivity'] = '.Settings'

# 解决中文输入问题
desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True

driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(5)
driver.quit()

原理:

  • appium实际上在本机上使用4723端口开启了一个服务
  • Python代码通过访问本机的服务器,获取driver对象
  • appium将我们的driver对象调用的方法转化成POST请求,提交给appium服务器
  • appium通过接收到的POST请求发送给手机,再由手机进行执行

Appium常用方法

# 打开指定包指定界面
driver.start_activity(“appPackage包名”, “appActivity界面名”)

# 获取包名
driver.current_package
# 获取界面名
driver.current_activity

# ——————关——————闭——————
# 关闭当前app,不关闭驱动对象
driver.close_app()
# 关闭驱动对象,同时关闭所有关联的app
driver.quit()

# ——————安装卸载及是否安装——————
# 安装app
driver.install_app("app_path apk安装包路径")
# 卸载app
driver.remove_app("app_id 包名")
# 判断app是否已经安装
driver.is_app_installed("app_id 包名")

# ——————将应用置于后台——————
driver.background_app(seconds 秒数)

UIAutomatorViewer 获取元素

启动该程序使用Device Screenshot工具获取元素特征信息

# 通过id定位(resource id)
driver.find_element_by_id("id-value").click() #并点击
# 通过class_name定位
driver.find_element_by_class_name("class-value").send_keys("hello") #并输入hello
# 通过xpath定位 # 包含则使用://*[contains(@变量名,'xx')]
driver.find_element_by_xpath("xpath-value表达式://*[@变量名='xx']")

# 定位一组元素 by_id / by_class_name / by_xpath
driver.find_elements_by_id("xxxx")

元素等待(在指定时间内一直等待

# 隐式等待(秒),全局有效
driver.implicitly_wait(20)

# 显式等待,对单个元素有效
from selenium.webdriver.support.wait import WebDriverWait
wait = WebDriverWait(driver, 5)
# 仅对修饰元素有效
back_button = wait.until(lambda x: x.find_element_by_xpath("xxxx"))
back_button.click()

元素操作

element.click()
element.send_keys("xxx")
# 清空输入框内容
element.clear()
# 获取元素内容
element.text
element.location
element.size

# 获取元素属性 如:name(content-desc / text)、resourceId、className、enabled、clickable")
element.get_arribute("属性名")

Swipe 滑动和拖拽事件(Scroll、drag_and_drop)

# Swipe 从一个坐标滑动到另一个坐标,duration 滑动持续时间长短,单位:ms
driver.swipe(start_x, start_y, end_x, end_y, duration=None)

# scroll 从一个元素滑动到另一个元素,直到页面惯性结束自动停止
button1 = driver.find_element_by_id("xxx")
button2 = driver.find_element_by_id("xxxx")
driver.scroll(button1, button2)

# drag_and_drop 从一个元素滑动到另一个,第二个元素代替第一个元素的位置
driver.drag_and_drop(button1, button2)

手势操作TouchAction

# 创建TouchAction对象
touch_action = TouchAction(driver)
# 轻敲
touch_action = touch_action.tap(element=元素, x=xxx, y=xxx, count=次数)
# 执行
touch.perform()
  1. 创建TouchAction对象
  2. 通过对象调用执行手势
  3. perform() 执行动作

轻点tap、按下press、抬起release、等待wait、长按long_press、移动move_to

# 轻敲 tap(element,x,y,count)
TouchAction(driver).tap(element=元素, x=xxx, y=xxx, count=次数).perform()
# 按下和抬起 press、release
TouchAction(driver).press(x=xxx, y=xxx).release().press()..release().perform()
# 等待 wait (单位:ms)
TouchAction(driver).press(x=xxx, y=xxx).wait(2000).release().perform()
# 长按 long_press
TouchAction(driver).long_press(element, x=坐标, y=坐标, duration=持续时间).perform()
# 移动 move_to
TouchAction(driver).press(x=坐标, y=坐标).move_to(x=坐标, y=坐标).release().perform()

手机操作API(分辨率、按钮、截图、网络、通知栏)

Android KeyCode:Android KeyCode列表_51CTO博客_event.keycode

# 获取手机分辨率
driver.get_window_size()
# 截图
driver.get_screenshot_as_file("path.filename")

# 获取网络
print(driver.network_connection)
# 设置网络
driver.set_network_connection(数字0-6)

# 发送键到设备 Android Keycode
driver.press_keycode("keycode", metastate=None)
# 打开通知栏
driver.open_notifications()
# 返回键
driver.press_keycode(4)

网络补充:

from appium.webdriver.connectiontype import ConnectionType

class ConnectionType:
    NO_CONNECTION = 0
    AIRPLANE_MODE = 1
    WIFI_ONLY = 2
    DATA_ONLY = 4
    ALL_NETWORK_ON = 6

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pytorch深度学习实战19

第十九课 卷积层的填充和步幅 目录 理论部分 实践部分 理论部分 首先看一下卷积层的填充。 上图所示的情况会有个问题,如果卷积核不变的话(一直是5*5的卷积核),那么我的网络最多也就只能弄到第七层了,如果我想搭建更…

恒太照明在北交所上市:募资规模缩水三成,第三季度收入下滑

11月17日,江苏恒太照明股份有限公司(下称“恒太照明”,NQ:873339)在北京证券交易所(即“北交所”)上市。本次上市,恒太照明的发行价格为6.28元/股,发行数量为2220万股,募…

Linux|centos7下部署安装alertmanager并实现邮箱和微信告警

前言: 一个成熟的符合一般人预想的资源监控平台应该是能够多维度的展示各种各样的数据,比如,服务器的内存使用率,磁盘io状态,磁盘使用率,CPU的负载状态,某个服务的状态(比如&#x…

Pandas数据分析33——数据多条件筛选(点估计和区间估计评价指标)

本次是写论文代码区间估计评价指标有感..... 数据框有两列的时候,我们想筛选A列大于B列的样本出来时,只需要用布尔值索引就行: df[df[A]>df[B]] 可是多条件的筛选的时候怎么办,比如我需要A大于B列,还有A小于C列。…

软件测试“摆烂”已经成为常态化,我们应该怎样冲出重围?

网络日新月异发展的今天,每隔一段时间就会出现一些新的网络热词,最近“摆烂”成功突出重围,成为大家热议的中心。什么是“摆烂”?“摆烂”就是事情无法向好发展的时候直接选择妥协,不采取任何措施加以改变,…

兼容 信创鲲鹏/M1 arm64架构的kafka镜像

当前热度比较高的kafka镜像是wurstmeister/kafka,在dockerhub上有很多的使用次数。我起初很开心最新版支持arm64架构,然后拉到本地用Mac M1跑也很完美 但是!我放到信创鲲鹏的生产环境,导入镜像没问题,但一用docker-com…

IPWorks Zip Delphi 流式压缩组件

IPWorks Zip Delphi 流式压缩组件 IPWorks Zip允许开发人员使用Zip、Tar、Gzip、7-Zip、Bzip2、ZCompress或Jar压缩标准轻松地将压缩和解压缩集成到应用程序中。IPWorks Zip组件是从头开始构建的,将卓越的速度与出色的数据压缩比相结合。 IPWorks Zip功能 文件压…

Allegro如何给铜皮导弧操作详解

Allegro如何给铜皮导弧操作详解 当需要给如下铜皮导弧的,是一件比较麻烦的事情,但是可以用以下两个方法来实现 方法一 具体操作如下 shape-decompose shape Find选择shapes Options选择层面,比如top层,选择delete shape after decompose 框选铜皮 得到下图效果,然后…

SNMP 协议解析(一)

♥️作者:小刘在C站 ♥️每天分享课堂笔记,一起努力,共赴美好人生! ♥️夕阳下,是最美的,绽放。 一.SNMP是什么 是基于TCP/IP协议族的网络管理标准,它的前身是简单网关监控协议(SGMP)&#xf…

HOST前后端分离小操作

“本地测试项目配置域名小操作” ​ 相关文章【欢迎关注该公众号“一路向东”】(CORS处理跨域问题): CORS跨域问题配置白名单CORS_ORIGIN_WHITELIST HOSTS 本地测试域名必然少不了修改:C:/Windows/System32/driver/etc/host文件&…

MVVM的构建(javakotlin)

概念性的描述就不写了,直接上代码 MVVM框架,主要是构建基类,实现ViewModel绑定,ViewBinding的绑定,在构建好基类后,后续开发中新建activity或fragment的viewModel和viewBinding就会在基类的方法中实现绑定…

Python virtualenv工具设置虚拟环境和VS code调试Python

Python virtualenv工具设置虚拟环境和VS code调试Python1. Window环境下采用VS code调试Python和虚拟环境1.1 安装Python1.2 安装虚拟环境工具virtualenv1.3 Windows上使用虚拟环境的基本操作1.4 Windows上VS code使用虚拟环境2. Linux环境下采用VS code调试Python和虚拟环境2.…

SAP 一次性读取工单的所有状态(工单抬头、工序、子工序、检验特性等等)

1. 前言 支持读取状态列表 2. 实现 代码 DATA: ls_objects TYPE tca11,ls_t490_imp TYPE t490. DATA: lt_ord_pre_imp TYPE TABLE OF ord_pre. FIELD-SYMBOLS: <fs_jest> TYPE any.DATA: lt_jest TYPE TABLE OF jest."fill var ls_objects VALUE #( flg_alt X…

[搞点好玩的] JETSONNANO 受苦记 -- 001 (布置环境,未完待续)

最开始是打算从0开始自己调试适配yahboom的IO板子&#xff0c;但是后来各种版本失配翻墙困难&#xff0c;前期先是用人家的包烧录进去。(所以叫未完待续) 直接粘贴我的debug记录了哈&#xff0c;凑合看吧&#xff1a; 记录 本项目是开源的实现基于jetbot的图像处理流程项目&a…

分享购商城模式详情特点和优势解析

随着互联网的不断发展&#xff0c;市面上出现了很多新怡的商业模式&#xff0c;就以分享购这个模式举例说来&#xff0c;直接解决了消费者自买省、好省、分享赚的逻辑玩法&#xff0c;之前有一个平台一个月直接引入70万的会员&#xff0c;引爆了网络上又一波话题&#xff0c;热…

【物理应用】大气辐射和透射率模型及太阳和月亮模型(Matlab代码实现)

&#x1f496;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f947;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为…

基于分时电价策略的家庭能量系统优化附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

《计算机导论》课程学习笔记

目录 第一章认识计算机 1.1计算思维概述 1.2冯诺依曼体系结构 1.3计算机硬件组成 1.4计算机软件 1.5计算机操作系统 第一章认识计算机 1.1计算思维概述 1.计算思维能力概念 计算思维能力的核心是问题求解能力。 发现问题寻求解决问题的思路分析比较不同的方案验证方案…

47、Docker 安装 ElasticSearch、Kibana、IK分词器

1、docker hub查看pull命令 2、Docker 安装 ElasticSearch docker run -d \ --name es \ -e "ES_JAVA_OPTS-Xms512m -Xmx512m" \ -e "discovery.typesingle-node" \ -v es-data:/usr/share/elasticsearch/data \ -v es-plugins:/usr/share/elasticsearch/p…

微信小程序云开发入门详细教程

微信小程序云开发 介绍&#xff1a; 微信云开发是微信团队联合腾讯云推出的专业的小程序开发服务。 开发者可以使用云开发快速开发小程序、小游戏、公众号网页等&#xff0c;并且原生打通微信开放能力。 开发者无需搭建服务器&#xff0c;可免鉴权直接使用平台提供的 API 进行…