一篇长文教你进行全方位的使用appium【建议收藏】

news2024/12/24 2:21:22

随着移动应用的日益普及,移动应用的测试成为了软件开发的重要组成部分。Python,作为一种易于学习,功能强大的编程语言,特别适合进行这种测试。本文将详细介绍如何使用Python进行APP测试,并附带一个实例。

Python 和 Appium:一种强大的组合

在进行APP测试时,我们通常使用自动化测试工具。其中,Appium是一种非常流行的开源移动应用自动化测试工具,可以支持Android和iOS的应用测试。它的一个主要优点是,你可以使用任何你喜欢的编程语言来编写测试脚本,只要这种语言可以创建HTTP请求。其中,Python是Appium社区广泛推荐的一种语言。

准备工作

在开始之前,你需要安装一些必要的工具:

  1. Python:你可以从Python官方网站下载并安装。

  2. Appium:你可以从Appium官方网站下载并安装。

  3. Appium-Python-Client:这是一个Python库,让你可以用Python来控制Appium。你可以使用pip安装:pip install Appium-Python-Client

示例:使用Python和Appium进行APP测试

这是一个基础的测试实例,我们将测试一个简单的计算器APP。首先,我们需要导入必要的库:

from appium import webdriverfrom appium.webdriver.common.mobileby import MobileBy

接着,我们需要设置启动参数:

desired_caps = {}desired_caps['platformName'] = 'Android'  # 你的设备系统desired_caps['platformVersion'] = '8.1.0'  # 你的设备系统版本desired_caps['deviceName'] = 'emulator-5554'  # 你的设备名称desired_caps['appPackage'] = 'com.android.calculator2'  # 你的APP的包名desired_caps['appActivity'] = 'com.android.calculator2.Calculator'  # 你的APP的主Activity

然后,我们创建一个driver:

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

现在我们就可以开始编写我们的测试脚本了。比如,我们可以测试一下计算器的加法功能:

driver.find_element(MobileBy.ID, "com.android.calculator2:id/digit_2").click()driver.find_element(MobileBy.ID, "com.android.calculator2:id/op_add").click()driver.find_element(MobileBy.ID, "com.android.calculator2:id/digit_3").click()driver.find_element(MobileBy.ID, "com.android.calculator2:id/eq").click()
result = driver.find_element(MobileBy.ID, "com.android.calculator2:id/result").textassert result == '5'

最后,我们需要关闭driver:​​​​​​​

driver.quit()

通过这个简单的例子,你可以看到Python和Appium的强大之处。你可以很方便地定位元素,进行点击等操作,并检查结果是否符合预期。

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

高级用法:自动化测试

以上我们介绍的是一个简单的测试例子,但在实际开发中,我们可能需要进行大量的自动化测试。为了实现这个目标,我们可以使用一些高级的技术,比如Python的unittest模块。

unittest是Python的标准库之一,提供了丰富的断言方法和组织测试的方式。这是一个使用unittest进行APP自动化测试的基本示例:​​​​​​​

import unittestfrom appium import webdriverfrom appium.webdriver.common.mobileby import MobileBy

class TestCalculator(unittest.TestCase):    @classmethod    def setUpClass(cls):        desired_caps = {}        desired_caps['platformName'] = 'Android'        desired_caps['platformVersion'] = '8.1.0'        desired_caps['deviceName'] = 'emulator-5554'        desired_caps['appPackage'] = 'com.android.calculator2'        desired_caps['appActivity'] = 'com.android.calculator2.Calculator'        cls.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
    def test_addition(self):        self.driver.find_element(MobileBy.ID, "com.android.calculator2:id/digit_2").click()        self.driver.find_element(MobileBy.ID, "com.android.calculator2:id/op_add").click()        self.driver.find_element(MobileBy.ID, "com.android.calculator2:id/digit_3").click()        self.driver.find_element(MobileBy.ID, "com.android.calculator2:id/eq").click()
        result = self.driver.find_element(MobileBy.ID, "com.android.calculator2:id/result").text        self.assertEqual(result, '5')
    @classmethod    def tearDownClass(cls):        cls.driver.quit()

if __name__ == '__main__':    unittest.main()

这个示例中,我们创建了一个TestCalculator的类,它继承自unittest.TestCase。在这个类中,我们可以编写多个测试方法,每个方法都是一个完整的测试,可以独立运行。setUpClass和tearDownClass方法会在所有测试开始前和所有测试结束后运行,通常我们在这里进行一些初始化和清理工作。

1. 使用 Page Object Model(POM)

POM 是一种设计模式,用于创建更可读、更可维护的自动化测试代码。在这个模式中,你会为每个APP页面创建一个 Python 类,这个类包含了所有与这个页面相关的操作。这样,你的测试代码就不再直接和页面元素打交道,而是和这些抽象的 Page Object 打交道,这让你的代码更容易理解和修改。​​​​​​​

class LoginPage:    def __init__(self, driver):        self.driver = driver
    def enter_username(self, username):        self.driver.find_element(MobileBy.ID, "username_field").send_keys(username)
    def enter_password(self, password):        self.driver.find_element(MobileBy.ID, "password_field").send_keys(password)
    def click_login_button(self):        self.driver.find_element(MobileBy.ID, "login_button").click()
# 在测试中使用login_page = LoginPage(driver)login_page.enter_username('testuser')login_page.enter_password('testpass')login_page.click_login_button()

2. 使用 Appium 的 Touch Action 和 Multi Touch

Appium 提供了 Touch Action 和 Multi Touch API,让你可以模拟各种复杂的用户手势,比如滑动、拖拽、多点触控等。这些功能让你可以更真实地模拟用户的操作,测试更多的使用场景。​​​​​​​

from appium.webdriver.common.touch_action import TouchAction
# 执行一个滑动操作action = TouchAction(driver)action.press(x=100, y=100).move_to(x=200, y=200).release().perform()
# 多点触控示例from appium.webdriver.common.multi_action import MultiActionaction1 = TouchAction(driver).press(x=100, y=100).move_to(x=200, y=200).release()action2 = TouchAction(driver).press(x=200, y=200).move_to(x=100, y=100).release()
multi_action = MultiAction(driver)multi_action.add(action1, action2)multi_action.perform()
3. 使用 Appium 的定位策略

除了基本的 id、class name 和 xpath 定位策略,Appium 还提供了许多高级的定位策略。比如,你可以使用 image 定位策略来定位那些没有明确 id 或 class name 的元素,你还可以使用 accessibility id 来定位那些为了提高无障碍访问性而添加了特殊标签的元素。​​​​​​​

# 使用 image 定位driver.find_element(MobileBy.IMAGE, "path_to_your_image.png")
# 使用 accessibility id 定位driver.find_element(MobileBy.ACCESSIBILITY_ID, "your_accessibility_id")
4. 使用 Appium 的日志和报告

Appium 提供了丰富的日志和报告功能,让你可以更方便地调试你的测试代码,了解测试的执行情况。你可以使用 Appium 的 server log 来查看测试的详细执行过程,你还可以使用各种第三方的报告工具,比如 Allure,生成更美观、更详细的测试报告。​​​​​​​

# 启动 Appium server 时设置 log 参数appium --log /path/to/your/logfile.txt
​​​​​​​
# 使用 pytest 和 Allure 生成测试报告def test_example():    driver.find_element(MobileBy.ID, "some_id").click()    assert driver.find_element(MobileBy.ID, "another_id").text == 'expected_text'

然后,运行 pytest 并使用 Allure 插件:​​​​​​​

pytest --alluredir=/your/allure/result/directoryallure serve /your/allure/result/directory
5. 使用 Python 的并行和异步功能

Python 提供了丰富的并行和异步功能,让你可以更高效地运行你的测试。比如,你可以使用 threading 或 multiprocessing 模块来并行运行多个测试,你还可以使用 asyncio 模块来编写异步的测试代码,这样你的测试就可以同时处理多个任务,提高测试效率。​​​​​​​

# 使用 threading 并行运行测试import threading
def test_one():    ...
def test_two():    ...
thread_one = threading.Thread(target=test_one)thread_two = threading.Thread(target=test_two)
thread_one.start()thread_two.start()
thread_one.join()thread_two.join()

异步编程就更复杂了,可能需要更深入的学习。这是一个简单的例子:​​​​​​​

import asyncio
async def test_one():    ...
async def test_two():    ...
await asyncio.gather(test_one(), test_two())

这些示例都很简单,只是为了给你一个大概的概念。在实际使用中,你可能需要根据你的实际情况进行更复杂的操作。

总结

使用Python进行APP测试是一种高效,强大的方法。无论你是一个软件开发者,还是一个测试工程师,都可以通过学习Python和Appium,提升你的工作效率,提高你的产品质量。希望这篇文章对你有所帮助。

作为一个软件测试的过来人,我想尽自己最大的努力,帮助每一个伙伴都能顺利找到工作。所以我整理了下面这份资源,现在免费分享给大家,有需要的小伙伴可以关注【公众号:开心螺蛳粉】自提!

软件测试面试文档

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

在这里插入图片描述

行动吧,在路上总比一直观望的要好,未来的你肯定会感谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入群:1150305204,里面有各种测试开发资料和技术可以一起交流哦。

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

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

相关文章

Docker快速入门和部署项目

1,Docker是一个,快速构建、运行、管理应用的工具 。 2,前面我们了解过在Linux操作系统的常见的命令以及如何在Linux中部署一个人单体的项目。感受如何呢??? 命令太多了,记不住 软件安装包名字复…

网络学习:数据的封装与解封装

目录 一、数据的封装与解封装 1. 数据的封装过程 2. 数据的解封装过程 二、数据的传输过程 1. 相关概念 2. 网络传输过程中数据封装和解封装模拟 一、数据的封装与解封装 1. 数据的封装过程 数据封装过程,在这里我们举例说明,以两台主机的通信为…

【docker基础学习之】镜像构建

下面是在工作过遇到的一些实际例子,谨以此作为笔记参考 目录 1.背景2. 寻找方案3. 如何解决4.解决步骤4.1 DockerFile4.2 现在要做的 5. 镜像相关命令 1.背景 部署(迁移)项目时发现,项目的excel导出功能报错,错误如下…

ChatGPT数据分析应用——同期群分析

ChatGPT数据分析应用——同期群分析 ​ 同期群分析在一定程度上属于分组分析的一个变种。顾名思义,同期群就是相同时期的群体,同期群分析就是针对相同时期的群体展开分析。接下来我们让ChatGPT解释这个方法的概念并提供相应的案例。发送如下内容给ChatG…

chrome插件webRequest拦截请求并获取post请求体requestBody数据raw内容,解决中文乱码问题

详细使用说明可以看官方文档:https://developer.chrome.com/docs/extensions/reference/api/webRequest?hlzh-cn 拦截操作 想要通过浏览器插件拦截请求的话,需要在manifest.json里面添加webRequet权限: 拦截请求代码放在background.js里面…

力扣--从前序与中序遍历序列构造二叉树

题目: 思想: 首先先序遍历能确定根节点的值,此时查看该值在中序遍历中的位置(如果索引为i),那么i左侧为左子树,i 右侧为右子树。从中序数组中即可看出左子树结点个数为 i,右子树节点…

王道机试C++第 3 章 排序与查找:排序问题 Day28(含二分查找)

查找 查找是另一类必须掌握的基础算法,它不仅会在机试中直接考查,而且是其他某些算法的基础。之所以将查找和排序放在一起讲,是因为二者有较强的联系。排序的重要意义之一便是帮助人们更加方便地进行查找。如果不对数据进行排序,…

ACM题解Day10|总结篇|进制转化,GCD ,LCM ,二分答案

🔥博客介绍: 27dCnc [Cstring中find_first_not_of()函数和find_last_not_of()函数-CSDN博客] 方差,期望 概率 今日打卡: 算法周总结 ACM题解Day3| To Crash or not To Crash,Integer Prefix ,I don’t want to pay for the Late Jar-CSDN博客 第3题:…

【LeetCode:2917. 找出数组中的 K-or 值 + 模拟+位运算】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

如何将 ONLYOFFICE 协作空间部署到 Kubernetes / OpenShift 集群中

需要 ONLYOFFICE 协作空间的可扩展实例吗?使用 Helm 轻松将其安装到 Kubernetes 或 OpenShift 集群中。阅读本文了解详情。 ONLYOFFICE 协作空间是什么 ONLYOFFICE 协作空间是一个协同办公平台,能够帮助用户更好地与客户、业务合作伙伴、承包商及第三方…

驱动调试第013期-G120XA驱动同步电机应用案例

概述 SINAMICS G120XA是西门子SINAMICS系列变频器的新成员, 功率范围覆盖0.75 kW~560 kW,内置风机和水泵行业应用功能,汇集了优异的高性能矢量控制算法,可以轻松的驱动风机、水泵及压缩机等负载。胜任各种应用场合,专…

【python基础学习11课_异常机制】

一、异常 1、异常的定义 异常:程序无法继续执行异常会中断程序执行异常处理,是为了不中断程序执行。而不是避免错误。有些代码是报错就是要暴露出来有了异常机制,错误的代码报错后抛出异常,代码从上到下,报错代码后面…

触发HTTP preflight预检及跨域的处理方法

最近在做需求的过程中,遇到了很多跨域和HTTP预检的问题。下面对我所遇到过的HTTP preflight和跨域的相关问题进行总结: 哪些情况会触发HTTP preflight preflight属于cors规范的一部分,在有跨域的时候,在一定情况下会触发preflig…

字节开启新一轮期权回购,价格又涨了(含算法原题)

字节期权 近日,字节跳动开启新一轮期权回购,价格微涨至 170 美元。 之前我们就写过 文章,分享历年来字节跳动的期权变化情况,这里再贴一下: 18年:10 19年:30 20年:60-70 21年&#x…

Linux系统编程(六)高级IO

目录 1. 阻塞和非阻塞 IO 2. IO 多路转接(select、poll、epoll) 3. 存储映射 IO(mmap) 4. 文件锁(fcntl、lockf、flock) 5. 管道实例 - 池类算法 1. 阻塞和非阻塞 IO 阻塞 IO:会等待操作的…

决定马里兰州地区版图的关键历史事件

1. 马里兰殖民地的建立: - 1632年,英国国王查理一世将一大片土地赐予塞西尔卡尔弗特男爵,这片土地是为了纪念国王的妻子亨丽埃塔玛丽亚而命名为“马里兰”。卡尔弗特和他的儿子随后建立了马里兰殖民地,这标志着马里兰作为一个独立…

车辆伤害VR安全教育培训复用性强

VR工地伤害虚拟体验是一种新兴的培训方式,它利用虚拟现实技术为参与者提供身临其境的体验。与传统的培训方式相比,VR工地伤害虚拟体验具有许多优势。 首先,VR工地伤害虚拟体验能够模拟真实的工作环境和事故场景,让参与者在安全的环…

hdu-2059(dp)

hdu-2059 龟兔赛跑 dp[i] 表示到第i个站所花费的最少时间,t[j][k]表示在第j个站充满电,直接开到第k个站所花的时间,那么状态转移为: dp[i] min(dp[i], dp[j] t[j][i]) 含义为,假设我们当前想知道到达第i个站的最少时间&#xff…

虽说主业搞前端,看到如此漂亮的网页UI,也是挪不开眼呀。

漂亮的网页UI能够吸引人的眼球,给人留下深刻的印象。作为前端开发人员,可以通过不断学习和掌握设计技巧和工具,提升自己的UI设计能力,为用户提供更好的视觉体验。 以下是一些提升网页UI设计能力的建议: 学习设计基础知…

苹果发布iOS17.4正式版升级,罕见带来一大波新功能!苹果数据备份软件 iOS系统管理软件 苹果数据备份到icloud iOS系统数据处理

近日,苹果发布了iOS17.4正式版,没想到的是居然有一大波新功能,如果你也是用iPhone的话,尤其是iPhone15新系列的,那么推荐你一定要升级下。下面让我给大家详细讲讲: 「电池健康」升级 电池设置界面得到了优…