涨薪技术 —— 搞定Appium工作中常见应用操作!

前言

Appium 是一个开源、跨平台的自动化测试工具,用于测试原生和轻量移动应用,支持 iOS, Android 和 FirefoxOS 平台。此工具在测试工作中也较长用到,接下来给大家介绍日常中的操作。

1、应用操作

1.1获取应用的包名和界面名

当我们从一个应用跳转到另外一个应用的时候,想输出其包名、界面名或者想在报告中展现对应信息, 我们就可以调用这个属性来进行获取。

# 打印当前包名print(driver.current_package)# 打印当前界面名print(driver.current_activity)

1.2 安装和卸载以及检查应用是否安装

安装应用:

driver.install_app(app_path) :安装应用到设备,需要apk包的路径

卸载应用:

driver.remove_app(app_id) :从设备中删除一个应用

检查应用是否安装:

driver.is_app_installed(app_id) :检查应用是否已经安装。需要传入应用包的名字。返回结果为True或False

案例:

# 如果计算器已经安装,就会卸载计算器。如果计算器没有安装,就会安装计算器。if driver.is_app_installed("com.youba.calculate"):driver.remove_app("com.youba.calculate")else:driver.install_app(r"F:\APP_packages\apks\calc.apk")#退出driverdriver.quit()

1.3 在脚本内启动其他应用

我们经常遇到需要从一个应用跳转到另外一个应用 ,就像我们使用饿了吗的时候,需要跳转到支付宝来进行支付一样。

我们想要实现这种功能,就要使用下面的方法了。​​​​​​​

driver.start_activity(appPackage, appActivity) :分别传入要打开的应用的包名和界面名。

实例:

打开《设置》,等待三秒后跳转到《通讯录》​​​​​​​

sleep(3)#跳转到短信driver.start_activity('com.android.contacts','.activities.PeopleActivity')sleep(5)#退出driverdriver.quit()

1.4 关闭应用​​​​​​​

driver.quit() 。但是这种关闭呢,是关闭驱动对象,同时关闭所有关联的应用,关闭后我们是无法使用脚本操作应用的。如果我们只想关闭当前操作的应用,不关闭驱动对象,我们就可以使用driver.close_app() 方法。若要终止某个指定的应用可以使用driver.terminate_app('app_id') ,需要传入app_id参数。

1.5 重置应用​​​​​​​

driver.reset()#重置应用,相当于“恢复出厂默认值”的效果,这个方法不需要传入参数

1.6 将应用置于后台​​​​​​​

driver.background_app(seconds) :app放置到后台一定时间后再回到前台,模拟热启动。这个方法需要传入一个时间,表示在后台停留多少秒

实例:

打开《设置》,进入后台五秒,再回到前台​​​​​​​

time.sleep(3)driver.background_app(5)time.sleep(3)# 退出driverdriver.quit()
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:691998057【暗号:csdn999】

2、滑动和拖拽

2.1 swipe滑动事件

从一个坐标位置滑动到另一个坐标位置,只能是两个点之间的滑动。​​​​​​​

driver.swipe(start_x, start_y, end_x, end_y,duration=None) :参数分别是起点坐标的x,y和终点坐标的x,y,以及滑动时间,滑动事件的单位是ms

实例1:

模拟手指从(100,2000),滑动到(100,1000)的位置

driver.swipe(100, 2000, 100, 1000)

实例2:

模拟手指从(100, 2000),滑动到(100, 100)的位置

driver.swipe(100, 2000, 100, 100, 5000)

2.2 scroll滑动事件

从一个元素滑动到另一个元素,直到页面自动停止。

方法:​​​​​​​

driver.scroll(origin_el, destination_el, duration=None) :参数分别是滑动开始的元素和滑动结束的元素

实例:

从“存储”滑动到“更多”​​​​​​​

save_button = driver.find_element_by_xpath("//*[@text='存储']")more_button = driver.find_element_by_xpath("//*[@text='更多']")driver.scroll(save_button, more_button,5000)

2.3 drag_and_drop拖拽事件

从一个元素滑动到另一个元素,第二个元素代替第一个元素原本屏幕上的位置。

方法:​​​​​​​

driver.drag_and_drop(origin_el, destination_el) :参数分别是滑动开始的元素和滑动结束的元素。

将“存储”拖拽到“更多”​​​​​​​

save_button = driver.find_element_by_xpath("//*[@text='存储']")more_button = driver.find_element_by_xpath("//*[@text='更多']")driver.drag_and_drop(save_button, more_button)

2.4 滑动和拖拽的选择​​​​​​​

滑动和拖拽无非就是考虑是否具有“惯性”,以及传递的参数是“元素”还是“坐标”。可以分为三种情况:无 “惯性” ,传入 “元素”:drag_and_drop。有 “惯性” ,传入 “坐标”:swipe,并且设置较短的duration时间。有 “惯性” ,传入 “元素”:scroll,并且设置较短的duration时间。

3、高级手势

高级手势TouchAction可以实现一些针对手势的操作,比如滑动、长按、拖动等。我们可以将这些基本手势组合成一个相对复杂的手势。比如,我们解锁手机或者一些应用软件都有手势解锁的这种方式。

想要使用TouchAction,必须要创建TouchAction对象,通过对象调用想要执行的手势,通过perform()执行动作。

需要导入的模块:

from appium.webdriver.common.touch_action import TouchAction

3.1 轻敲操作

模拟手指对某个元素或坐标按下并快速抬起。比如,固定点击(100, 100)的位置。

方法:​​​​​​​

TouchAction(driver).tap(element=None, x=None,y=None).perform() :参数可以是元素,也可以是x,y坐标

实例:

打开《设置》,轻敲“WLAN”​​​​​​​

# coding:utf-8from appium import webdriverfrom time import sleepfrom appium.webdriver.common.touch_action importTouchAction# 初始化desired_caps = {}# 使用哪种移动平台desired_caps['platformName'] = 'Android'# Android版本desired_caps['platformVersion'] = '7.1.2'#使用adb devices -l 查询,当有多台设备时,需要声明desired_caps['deviceName'] = '127.0.0.1:21503'#包名desired_caps['appPackage'] = 'com.android.settings'#界面名desired_caps['appActivity'] = '.Settings'# 启动服务driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)el = driver.find_element_by_xpath("//*[contains(@text,'WLAN')]")TouchAction(driver).tap(el).perform()sleep(5)#退出driverdriver.quit()

3.2 按下和抬起操作

模拟手指一直按下,模拟手指抬起。可以用来组合成轻敲或长按操作。

方法:

TouchAction(driver).press(el=None, x=None,y=None).perform() :模拟手指按下,参数和轻敲操作一样
TouchAction(driver).release().perform() :模拟手指对元素或坐标的抬起操作

实例1:

使用坐标的形式按下 WLAN(650, 650),2 秒后,按下(650, 650)的位置​​​​​​​

# coding:utf-8from appium import webdriverfrom time import sleepfrom appium.webdriver.common.touch_action importTouchAction# 初始化desired_caps = {}# 使用哪种移动平台desired_caps['platformName'] = 'Android'# Android版本desired_caps['platformVersion'] = '7.1.2'#使用adb devices -l 查询,当有多台设备时,需要声明desired_caps['deviceName'] = '127.0.0.1:21503'#包名desired_caps['appPackage'] = 'com.android.settings'#界面名desired_caps['appActivity'] = '.Settings'# 启动服务driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)TouchAction(driver).press(x=650, y=650).perform()sleep(2)TouchAction(driver).press(x=650, y=650).perform()sleep(5)#退出driverdriver.quit()

实例2:

使用坐标的形式按下 WLAN (650, 650),2 秒后,按下(650, 650)的位置,并抬起​​​​​​​

# coding:utf-8from appium import webdriverfrom time import sleepfrom appium.webdriver.common.touch_action importTouchAction# 初始化desired_caps = {}# 使用哪种移动平台desired_caps['platformName'] = 'Android'# Android版本desired_caps['platformVersion'] = '7.1.2'#使用adb devices -l 查询,当有多台设备时,需要声明desired_caps['deviceName'] = '127.0.0.1:21503'#包名desired_caps['appPackage'] = 'com.android.settings'#界面名desired_caps['appActivity'] = '.Settings'# 启动服务driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)TouchAction(driver).press(x=650, y=650).perform()sleep(2)TouchAction(driver).press(x=650,y=650).release().perform()sleep(5)#退出driverdriver.quit()

3.3 等待操作

模拟手指等待,比如按下后等待5秒之后再抬起,方法:

TouchAction(driver).wait(ms=0).perform() :参数是暂停的毫秒数

实例:

使用坐标的形式点击 WLAN(650, 650),2 秒后,按下(650, 650)的位置,暂停2秒,并抬起​​​​​​​

# coding:utf-8from appium import webdriverfrom time import sleepfrom appium.webdriver.common.touch_action importTouchAction# 初始化desired_caps = {}# 使用哪种移动平台desired_caps['platformName'] = 'Android'# Android版本desired_caps['platformVersion'] = '7.1.2'#使用adb devices -l 查询,当有多台设备时,需要声明desired_caps['deviceName'] = '127.0.0.1:21503'#包名desired_caps['appPackage'] = 'com.android.settings'#界面名desired_caps['appActivity'] = '.Settings'# 启动服务driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)TouchAction(driver).tap(x=650, y=650).perform()sleep(2)TouchAction(driver).press(x=650,y=650).wait(2000).release().perform()sleep(5)#退出driverdriver.quit()

3.4 长按操作

模拟手指移动操作,比如,手势解锁需要先按下,再移动,方法:

TouchAction(driver).move_to(el=None, x=None,y=None).perform() :参数同上

实例:

在手势解锁中,画一个解锁的图案。

手势解锁的包名和界面名:

com.android.settings/.ChooseLockPattern
# coding:utf-8from appium import webdriverfrom time import sleepfrom appium.webdriver.common.touch_action importTouchAction# 初始化desired_caps = {}# 使用哪种移动平台desired_caps['platformName'] = 'Android'# Android版本desired_caps['platformVersion'] = '7.1.2'#使用adb devices -l 查询,当有多台设备时,需要声明desired_caps['deviceName'] = '127.0.0.1:21503'#包名desired_caps['appPackage'] = 'com.android.settings'#界面名desired_caps['appActivity'] = '.ChooseLockPattern'# 启动服务driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)TouchAction(driver).press(x=150, y=525).move_to(x=450,y=525).move_to(x=750,y=525).move_to(x=750, y=825).move_to(x=450,y=825).move_to(x=150,y=825).move_to(x=450, y=1125).release().perform()sleep(5)#退出driverdriver.quit()

4、手机操作

4.1 获取手机分辨率

自动化测试可能会需要根据当前设备的屏幕分辨率来计算一些点击或者滑动的坐标,方法:

driver.get_window_size()

实例:

输出当前设备的屏幕分辨率:

print(driver.get_window_size())

4.2 手机截图

有些自动化的操作可能没有反应,但并不报错。此时我们就可以将操作过后的关键情况,截图留存,后期也可以根据图片发现问题。方法:

get_screenshot_as_file(filename) :参数是将截图保存为指定路径下、指定格式的图片

实例:

打开《设置》界面,截图当前页面保存到当前目录,命名为screen.png

driver.get_screenshot_as_file("screen.png")

4.3 获取和设置手机网络

视频应用在使用流量看视频的时候,大部分都会提示用户正在是否继续播放。作为测试人员,我们可能需要用自动化的形式来判断是否有对应的提示。即,用流量的时候应该有提示,使用WIFI的时候应该没有提示。

4.3.1 获取手机网络

driver.network_connection

实例:

获取当前网络类型,并打印到控制台

print(driver.network_connection)

4.3.2 设置手机网络

driver.set_network_connection(connectionType) :参数为网络类型

实例:

设置当前设备为飞行模式

driver.set_network_connection(1)

又将网络设置为全部打开

driver.set_network_connection(6)

4.4 发送键到设备

模拟按 “返回键” “home键” 等等操作,比如,很多应用有按两次返回键退出应用的功能,如果这个功能 需要我们做自动化,那么一定会用到这个方法。​​​​​​​

driver.press_keycode(keycode, metastate=None) :第一个参数是发送给设备的关键代码,第二个是关键代码的元信息,一般是默认值

实例:

点击三次音量加,再点击返回,再点击两次音量减。(为了让效果明显,我设置了暂停)​​​​​​​

driver.press_keycode(24)sleep(1)driver.press_keycode(24)sleep(1)driver.press_keycode(24)sleep(1)driver.press_keycode(4)sleep(1)driver.press_keycode(25)sleep(1)driver.press_keycode(25)

4.5 操作手机通知栏

测试即时通信类软件的时候,如果A给B发送一条消息,B的通知栏肯定会显示对应的消息。我们想通过通知栏来判断B是否收到消息,一定要先操作手机的通知栏。方法:

driver.open_notifications() :打开手机通知栏

appium官方并没有为我们提供关闭通知的api,那么现实生活中怎么关闭,就怎样操作就行,比如,手指从下往上滑动,或者,按返回键。

实例:

打开通知栏,两秒后,关闭通知栏​​​​​​​

driver.open_notifications()sleep(2)driver.press_keycode(4)

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

最后: 可以在公众号:自动化测试老司机 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

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

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

相关文章

日报表定时任务优化历程

报表需求背景 报表是一个很常见的需求,在项目中后期往往会需要加多种维度的一些统计信息,今天就来谈谈上线近10个月后的一次报表优化优化之路(从一天报表跑需要五分钟,优化至秒级) 需求:对代理商进行日统计…

基础I/O:文件系统调用接口

文章目录 文件系统调用接口open系统调用接口和C语言封装文件描述符fd重定向 文件系统调用接口 open NAME//打开、创建 - 打开并可能创建文件或设备open, creat - open and possibly create a file or deviceSYNOPSIS#include <sys/types.h>#include <sys/stat.h>…

【C++算法】队列相关经典算法题

1. N叉树的层序遍历 首先我们遇到这个题目&#xff0c;没有任何思路&#xff0c;我们就可以来模拟一下层序的流程&#xff0c;首先我们肯定是访问根节点1&#xff0c;访问之后呢就是访问下一层的最左节点3&#xff0c;此时第一层的节点1已经访问过了就可以不要了&#xff0c;然…

[GESP样题 四级] 填幻方和幸运数

B3940 [GESP样题 四级] 填幻方 题目 在一个NN 的正方形网格中&#xff0c;每个格子分别填上从 1 到 NN 的正整数&#xff0c;使得正方形中任一行、任一列及对角线的几个数之和都相等&#xff0c;则这种正方形图案就称为“幻方”&#xff08;输出样例中展示了一个33 的幻方&am…

ICode国际青少年编程竞赛- Python-4级训练场-嵌套for循环练习

ICode国际青少年编程竞赛- Python-4级训练场-嵌套for循环练习 1、 for i in range(3):Spaceship.step(4)for j in range(4):Dev.step(2)Dev.turnRight()Spaceship.turnLeft()Spaceship.step(4)Spaceship.turnRight()2、 for i in range(4):Spaceship.step(6)for j in range(3):…

Nginx或Tengine服务器配置SSL证书

目录 前提条件 步骤一&#xff1a;下载SSL证书 步骤二&#xff1a;在Nginx服务器安装证书 步骤三&#xff1a;验证SSL证书是否配置成功 前提条件 已通过数字证书管理服务控制台签发证书SSL证书绑定的域名已完成DNS解析&#xff0c;即您的域名与主机IP地址相互映射已在Web服…

Lazada、Shopee测评自养号,快速出单技巧全解析!

每个人都憧憬着自己的店铺能够拥有一款或多款引人注目的热销商品&#xff0c;这些商品不仅能为店铺带来可观的收益&#xff0c;更重要的是它们能够成为吸引顾客的强大磁石&#xff0c;显著提升店铺的整体流量。一旦这样的爆款商品成功吸引顾客&#xff0c;其他产品也将随之受到…

C++11:并发新纪元 —— 深入理解异步编程的力量(1)

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的Linux高性能服务器编程系列之《C11&#xff1a;并发新纪元 —— 深入理解异步编程的力量》&#xff0c;在这篇文章中&#xff0c;你将会学习到C新特性以及异步编程的好处&#xff0c;以及其如何带来的高性能的魅力&…

Python:通过接口获取公众号的文章列表(但是开发文档没有这个接口)

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️感谢大家点赞&#x1f44d;&…

力扣HOT100 - 35. 搜索插入位置

解题思路&#xff1a; 二分法模板 class Solution {public int searchInsert(int[] nums, int target) {int left 0;int right nums.length - 1;while (left < right) {int mid left ((right - left) >> 1);if (nums[mid] target)return mid;else if (nums[mid…

【qt】设计器实现界面

设计器实现界面 一.总体思路二.具体操作1.创建项目2.粗略拖放3.水平布局4.垂直布局5.修改名字6.转到槽7.实现槽函数 一.总体思路 二.具体操作 1.创建项目 这次咱们一定要勾选Generate form哦。 因为我们要使用设计器进行拖放。 2.粗略拖放 这里用到了复选框&#xff1a;C…

[数据集][目标检测]管道焊缝质量检测数据集VOC+YOLO格式1134张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1134 标注数量(xml文件个数)&#xff1a;1134 标注数量(txt文件个数)&#xff1a;1134 标注…

“我们坚持开源!”阿里云发布“地表最强”中文大模型:半年一迭代、性能翻倍?

5 月 9 日&#xff0c;在通义大模型发布一周年之际&#xff0c;阿里云大模型生态迎来一次重大升级&#xff0c;主要有“四个最”&#xff1a; 通义千问 2.5 正式发布&#xff0c;“模型性能全面赶超 GPT-4 Turbo&#xff0c;成为地表最强中文大模型”&#xff1b;Qwen1.5-110B…

卷积特征图与感受野

特征图尺寸和感受野是卷积神经网络中非常重要的两个概念&#xff0c;今天来看一下&#xff0c;如何计算特征尺寸和感受野。 特征图尺寸 卷积特征图&#xff0c;是图片经过卷积核处理之后的尺寸。计算输出特征的尺寸&#xff0c;需要给出卷积核的相关参数包括&#xff1a; 输…

PC端与bluetooth蓝牙虚拟串口通信

应该采用RFCOMM虚拟串口方式来进行通信&#xff0c;原理跟socket通信类似&#xff0c;不同的是使用的通信协议不同&#xff0c;本人结合相关的API&#xff0c;做了以下最简单的封装。 1、获取本地蓝牙设备与附近蓝牙设备信息 2、通信类 /* 通信类&#xff1a;只是对于客户端通…

抽空学学go

2024年5月9日11:14:24 学习go 看课8小时转职Golang工程师(如果你想低成本学习Go语言)_哔哩哔哩_bilibili 文档[8小时转职Golang工程师 (yuque.com)]( 1.安装go 2024年5月9日11:27:16 2.安装 vscode go配置环境 vs code配置go开发环境 (zhihu.com) vscode里面配置代理&…

全志ARM-SG90舵机

控制转角 向黄色信号线“灌入”PWM信号。 PWM波的频率不能太高&#xff0c;50hz&#xff0c;即周期1/频率1/500.02s&#xff0c;20ms左右数据&#xff1a; 不同的PWM波形对应不同的旋转角度&#xff0c;以20ms为周期&#xff0c;50hz为频率的PWM波 定时器需要定时20ms,关心的单…

vue阶段案例,练习filter、map、forEach,双向绑定,三元表达式,以及图片滚动,文字跳动等等。

阶段案例 通过案例来练习双向绑定&#xff0c;三元表达式&#xff0c;以及图片滚动&#xff0c;文字跳动等等。 代码如下&#xff1a; <template><table class"bjtp" ><div class"title" >{{title}}</div><div class"s…

【解决Android Studio】cmake报错找不到vulkan包

1 报错信息 CMake Error at D:/Android/project/cmake/3.10.2.4988404/share/cmake-3.10/Modules/FindPackageHandleStandardArgs.cmake:137 (message): Could NOT find Vulkan (missing: Vulkan_LIBRARY) Call Stack (most recent call first): 2. 错误原因 minSdk版本不对&am…

18.Blender 渲染工程、打光方法及HDR贴图导入

HDR环境 如何导入Blender的HDR环境图 找到材质球信息 在右上角&#xff0c;点击箭头&#xff0c;展开详细部分 点击材质球&#xff0c;会出现下面一列材质球&#xff0c;将鼠标拖到第二个材质球&#xff0c;会显示信息 courtyard.exr 右上角打开已渲染模式 左边这里选择世界…