一篇长文教你进行全方位的使用appium

news2024/11/24 6:31:13

随着移动应用的日益普及,移动应用的测试成为了软件开发的重要组成部分。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的强大之处。你可以很方便地定位元素,进行点击等操作,并检查结果是否符合预期。

高级用法:自动化测试

以上我们介绍的是一个简单的测试例子,但在实际开发中,我们可能需要进行大量的自动化测试。为了实现这个目标,我们可以使用一些高级的技术,比如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,提升你的工作效率,提高你的产品质量。希望这篇文章对你有所帮助。

END配套学习资源分享

最后: 为了回馈铁杆粉丝们,我给大家整理了完整的软件测试视频学习教程,朋友们如果需要可以自行免费领取 【保证100%免费】

加入我的软件测试交流群:110685036免费获取~(同行大佬一起学术交流,每晚都有大佬直播分享技术知识点)

软件测试面试文档

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

在这里插入图片描述

全套资料获取方式:

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

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

相关文章

CVE漏洞复现-CVE-2021-2109 Weblogic Server远程代码执行

CVE-2021-2109 Weblogic Server远程代码执行 漏洞背景 2021年1月20日,Oracle官方发布了漏洞补丁,修了包括 CVE-2021-2109 Weblogic Server远程代码执行漏洞在内的多个高危严重漏洞。CVE-2021-2109 中,攻击者可构造恶意请求,造成J…

多媒体库SDL以及实时音视频库WebRTC中的多线程问题实战详解

目录 1、概述 2、开源跨平台多媒体库SDL介绍 3、开源音视频实时通信库WebRTC介绍 4、在国产化Linux桌面系统中遇到的SDL多线程问题 5、在给WebRTC新增外部音频插件库时遇到的多线程问题 6、最后 VC常用功能开发汇总(专栏文章列表,欢迎订阅&#xf…

【云原生】创建容器的方法

1)基于现有镜像的创建 先使用现有镜像创建容器 docker run 再进入容器进行内容更新 docker exec 最后提交成新的镜像 docker commit 2)基于模板创建 可以从本地容器导出模板文件 docker export 或者从网上下载现成的模板文件 http://openvz…

C++继承相关内容(二)

目录 一.拷贝构造函数 第一种情况:基类没有拷贝构造函数,派生类也没有拷贝构造函数 结果: 原因: 第二种情况:基类没有拷贝构造函数,派生类有拷贝构造函数 结果: 原因: 第三种情况…

【文生图系列】 Stable Diffusion v2复现教程

文章目录 xformersbug 记录 txt2imgdiffusers参考 基础环境承接Stable Diffusion v1, 详情请见我的博文【文生图系列】 Stable Diffusion v1复现教程。然后更新pytorch和torchvision的版本,因为要使用GPU和xformers,需要下载gpu版本的pytorch。再下载ope…

学习笔记之微服务(一)

一、了解微服务 1、服务架构演变 **单体架构:**所有业务功能都集中在一个项目中开发,打成一个包部署。 优点:架构简单、部署成本低 缺点:耦合度高 分布式架构:根据业务拆分系统功能,每个业务模块独立项…

微信小程序map 之个性化地图(日出日落主题)

微信小程序map 之个性化地图(日出日落主题) 个性化地图之根据日出日落时间动态变换地图主题个性化前的准备进入腾讯地址服务官网小程序开发html 代码. layer-style 编号为样式名称js代码. 注意的是,layer-style只能定义一次,所以值…

Yarn【常用命令】

1、yarn application 查看Application运行情况 1.1、列出所有Application yarn application -list 可以通过Web UI端来查看: 1.2、根据Application状态过滤: yarn application -list -appStates (所有状态: ALL 、 NEW 、 NEW…

Spring Cloud Alibaba 同时兼容dubbo与openfeign

一、前言 dubbo与springcloud都可以单独作为微服务治理框架在生产中进行使用,但使用过springcloud的同学大概了解到,springcloud生态的相关组件这些年已经逐步停更,这就导致在服务架构演进过程中的迭代断层,以至于一些新的技术组…

聚合/组合

谨慎使用继承的方式来进行扩展,优先使用聚合/组合的方式来实现。 Father类里有两个方法A和方法B,并且A调用了B。子类Son重写了方法B,这时候如果子类调用继承来的方法A,那么方法A调用的就不再是Father.B(),而是子类中的…

使用kali里的dnschef进行DNS欺骗

1. 前言 DNSChef是针对渗透测试人员和恶意软件分析师的高度可配置的DNS代理。它能够精细配置哪些DNS回复以修改或简单地代理真实响应。为了利用该工具,您必须手动配置DNS服务器以指向DNSChef。 2. 执行参数 选项参数: -h,--help显示帮助信息并退出--f…

C语言:计算 1! + 2! + 3! + ... + n!

题目: 从键盘输入一个值n,计算 1的阶乘 至 n的阶乘 的和, 如:输入10,计算 1的阶乘 至 n的阶乘 的和 --> 计算:1! 2! 3! ... 10! 思路一: 效率比较低,会重复计算之前计算过的…

Stable Diffusion 从听说到超神日记

1.安装模型(B站搜秋叶) 2.下载模型,安装好的界面有模型下载 有了上面模型已经可以根据模型风格去生成一些照片了 3.使用Additional Networks/lora模型 模型大多都是继承了很多网友自行训练的图库模型,各类风格都有! …

分享一个卡通人物

这几天较忙&#xff0c;像它一样&#xff1a; 代码在这里&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>卡通打字</title><script src"https://s3-us-west-2.amazonaws…

《MySQL(五):基础篇- 多表查询》

文章目录 5. 多表查询5.1 多表关系5.1.1 一对多5.1.2 多对多5.1.3 一对一 5.2 多表查询概述5.2.1 数据准备5.2.2 概述5.2.3 分类 5.3 内连接5.4 外连接5.5 自连接5.5.1 自连接查询5.5.2 联合查询5.6.2 标量子查询5.6.3 列子查询5.6.5 表子查询 5.7 多表查询案例 5. 多表查询 我…

【Sql】根据字段分组排序,取其第一条数据

【Sql】根据字段分组排序&#xff0c;取组内第一条数据 【一】问题描述【二】解决方案&#xff08;oracle和mysql都可用&#xff09;【三】总结 【一】问题描述 &#xff08;1&#xff09;问题描述 有时候我们需要对数据进行去重处理&#xff0c;例如查询结果里的文件名有重复…

常用模拟低通滤波器的设计——契比雪夫I型滤波器

目录 常用模拟低通滤波器的设计——契比雪夫I型滤波器 1、cheb1ap 函数 2、cheb1ord 函数 3、cheby1函数 4、实例演示 常用模拟低通滤波器的设计——契比雪夫I型滤波器 巴特沃斯滤波器的频率特性曲线在通带和阻带内&#xff0c;幅度特性是单调下降的&#xff0c;如果阶次一…

RISC-V体系结构的U-Boot引导过程

RISC-V体系结构的U-Boot引导过程 flyfish BootLoader Boot是Bootstrap&#xff08;鞋带&#xff09;的缩写&#xff0c;它来自于一句谚语&#xff1a;“Pull oneself up by one’s own bootstraps”&#xff0c;直译的意思是“拽着鞋带把自己拉起来” 干这件事&#xff0c;得…

文心一言 VS 讯飞星火 VS chatgpt (33)-- 算法导论5.2 5题

五、设A[1…n]是由n个不同数构成的数列。如果i<j且A[i]>A[j]&#xff0c;则称(i&#xff0c;j)对为A的一个逆序对(inversion)。(参看思考题2-4 中更多关于逆序对的例子。)假设A的元素构成(1&#xff0c;2&#xff0c;… &#xff0c;n)上的一个均匀随机排列。请用指示器随…

Win11配置Anaconda-Cuda-Pytorch-Tenserflow环境

之前搞了一个月左右时间用WSL2跑模型&#xff0c;后来发现还是不太习惯&#xff08;其实用不明白&#xff09;&#xff0c;就转成Windows了。这次也是记录一下自己配环境的过程&#xff0c;以免下次还需要 安装Anaconda 下载方式 Anaconda官网清华镜像下载 tip&#xff1a;…