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

2024-04-28 20:36

本文主要是介绍涨薪技术 —— 搞定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自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

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

 

这篇关于涨薪技术 —— 搞定Appium工作中常见应用操作!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/944198

相关文章

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

java中long的一些常见用法

《java中long的一些常见用法》在Java中,long是一种基本数据类型,用于表示长整型数值,接下来通过本文给大家介绍java中long的一些常见用法,感兴趣的朋友一起看看吧... 在Java中,long是一种基本数据类型,用于表示长整型数值。它的取值范围比int更大,从-922337203685477

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

详解Linux中常见环境变量的特点与设置

《详解Linux中常见环境变量的特点与设置》环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧... 目录前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变

Java Multimap实现类与操作的具体示例

《JavaMultimap实现类与操作的具体示例》Multimap出现在Google的Guava库中,它为Java提供了更加灵活的集合操作,:本文主要介绍JavaMultimap实现类与操作的... 目录一、Multimap 概述Multimap 主要特点:二、Multimap 实现类1. ListMult

Java中常见队列举例详解(非线程安全)

《Java中常见队列举例详解(非线程安全)》队列用于模拟队列这种数据结构,队列通常是指先进先出的容器,:本文主要介绍Java中常见队列(非线程安全)的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一.队列定义 二.常见接口 三.常见实现类3.1 ArrayDeque3.1.1 实现原理3.1.2

MyBatis设计SQL返回布尔值(Boolean)的常见方法

《MyBatis设计SQL返回布尔值(Boolean)的常见方法》这篇文章主要为大家详细介绍了MyBatis设计SQL返回布尔值(Boolean)的几种常见方法,文中的示例代码讲解详细,感兴趣的小伙伴... 目录方案一:使用COUNT查询存在性(推荐)方案二:条件表达式直接返回布尔方案三:存在性检查(EXI

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化: