基于 Python 的自动化框架示例

以下是一个基于Python的自动化测试代码框架示例,包含了 app_lib(库模块,用于存放通用功能相关代码)、app_test(测试用例相关模块)、config(配置文件及配置读取相关部分)等模块,整体框架结构清晰,便于扩展和维护,可以根据实际需求进一步调整和完善。

一、项目目录结构

my_app_auto_test/
├── app_lib/
│   ├── base/
│   │   ├── __init__.py
│   │   ├── base_driver.py
│   │   └── base_page.py
│   ├── pages/
│   │   ├── __init__.py
│   │   └── main_page.py
│   └── operations/
│       ├── __init__.py
│       └── main_operations.py
├── app_test/
│   ├── __init__.py
│   ├── test_main.py
│   └── conftest.py
├── config/
│   ├── __init__.py
│   └── config.ini
└── run_tests.py

二、各部分详细介绍

1. app_lib 模块

这是整个自动化框架的核心库模块,存放了各类基础功能、页面操作相关以及对象库相关的代码,按照功能进一步细分了不同的子目录。

  • app_lib/base 子目录
    • __init__.py:使 base 目录成为一个Python包,可用于导入相关模块,也可以在其中进行一些初始化操作或者模块级别的变量定义等(如果需要的话)。
    • base_driver.py:用于初始化自动化测试所需的驱动程序,例如在移动端自动化使用Appium或者Web自动化使用Selenium时,相关代码示例如下:
import appium.webdriver
import selenium.webdriverclass BaseDriver:def __init__(self, platform):if platform == "android":# 配置Appium相关的Desired Capabilities用于安卓设备desired_caps = {"platformName": "Android","deviceName": "your_device_name","appPackage": "your_app_package","appActivity": "your_app_activity"}self.driver = appium.webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)elif platform == "ios":# 配置Appium相关的Desired Capabilities用于iOS设备desired_caps = {"platformName": "iOS","deviceName": "your_device_name","bundleId": "your_bundle_id"}self.driver = appium.webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)elif platform == "web":# 配置Selenium相关的WebDriver,以Chrome为例self.driver = selenium.webdriver.Chrome()else:raise ValueError("Unsupported platform")

这段代码根据传入的平台类型(androidiosweb)来初始化对应的驱动对象,用于后续与目标应用(移动应用或Web应用)进行交互。

  • base_page.py:定义了页面操作的一些基础类和方法,比如通用的元素查找方法、等待元素加载方法等,示例如下:
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import Byclass BasePage:def __init__(self, driver):self.driver = driverdef find_element(self, by, value, timeout=10):"""根据定位方式和定位值查找元素,等待元素出现,超时时间默认为10秒"""wait = WebDriverWait(self.driver, timeout)return wait.until(EC.presence_of_element_located((by, value)))

这里的 BasePage 类接收一个驱动对象作为参数,然后提供了 find_element 方法用于在页面上查找元素,通过 WebDriverWait 机制等待元素出现,确保操作的稳定性。

  • app_lib/pages 子目录
    • __init__.py:同样是使 pages 目录成为Python包,便于导入其中的页面类。
    • main_page.py:针对具体的应用主页面定义元素定位信息以及相关的获取元素方法等,例如对于一个视频编辑应用的主页面:
from app_lib.base.base_page import BasePage
from selenium.webdriver.common.by import Byclass MainPage(BasePage):def __init__(self, driver):super().__init__(driver)self.edit_button = (By.XPATH, "//button[@id='edit_btn']")self.start_create_button = (By.XPATH, "//button[@id='start_create_btn']")def find_edit_button(self):return self.find_element(*self.edit_button)def find_start_create_button(self):return self.find_element(*self.start_create_button)

在这个类中,继承自 BasePage 类,定义了主页面上“编辑按钮”和“开始创作按钮”的 XPATH 定位信息,并提供了对应的获取元素方法,方便后续操作层调用进行点击等操作。

  • app_lib/operations 子目录
    • __init__.py:使 operations 目录成为Python包。
    • main_operations.py:基于页面类中获取到的元素,定义具体的操作方法,实现对页面元素的交互功能,示例如下:
from app_lib.pages.main_page import MainPage
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import timeclass MainOperations:def __init__(self, driver):self.main_page = MainPage(driver)def click_edit_button(self):"""点击编辑按钮的操作方法"""edit_button = self.main_page.find_edit_button()edit_button.click()def click_start_create_button(self):"""点击开始创作按钮的操作方法"""start_create_button = self.main_page.find_start_create_button()start_create_button.click()def input_text(self, element_locator, text):"""向指定元素输入文本内容:param element_locator: 元素的定位信息,格式为 (By.定位方式, 定位表达式),例如 (By.ID, "input_box_id"):param text: 要输入的文本内容"""element = self.main_page.find_element(*element_locator)element.clear()  # 先清空原有内容(如果有)element.send_keys(text)def get_element_text(self, element_locator):"""获取指定元素的文本内容:param element_locator: 元素的定位信息,格式为 (By.定位方式, 定位表达式),例如 (By.ID, "text_element_id"):return: 元素的文本内容,如果元素不存在或获取失败返回None"""try:element = self.main_page.find_element(*element_locator)return element.textexcept:return Nonedef is_element_visible(self, element_locator, timeout=10):"""判断指定元素是否可见:param element_locator: 元素的定位信息,格式为 (By.定位方式, 定位表达式),例如 (By.ID, "visible_element_id"):param timeout: 等待元素可见的超时时间,默认为10秒:return: True如果元素在超时时间内可见,False则表示不可见"""try:wait = WebDriverWait(self.main_page.driver, timeout)wait.until(EC.visibility_of_element_located(element_locator))return Trueexcept:return Falsedef wait_for_element_to_be_clickable(self, element_locator, timeout=10):"""等待指定元素变为可点击状态:param element_locator: 元素的定位信息,格式为 (By.定位方式, 定位表达式),例如 (By.ID, "clickable_element_id"):param timeout: 等待元素可点击的超时时间,默认为10秒:return: 可点击的元素对象,如果超时未变为可点击状态则返回None"""try:wait = WebDriverWait(self.main_page.driver, timeout)return wait.until(EC.element_to_be_clickable(element_locator))except:return Nonedef scroll_to_element(self, element_locator):"""将页面滚动到指定元素位置(适用于移动端或有滚动条的Web页面情况):param element_locator: 元素的定位信息,格式为 (By.定位方式, 定位表达式),例如 (By.ID, "scrolled_element_id")"""# 以下是一种简单的滚动逻辑示例,不同的驱动(如Appium、Selenium针对不同浏览器)可能有不同的实现方式# 这里假设是基于JavaScript在Web页面上实现滚动,对于移动端也可以通过Appium提供的相关滚动方法来替换element = self.main_page.find_element(*element_locator)self.main_page.driver.execute_script("arguments[0].scrollIntoView();", element)time.sleep(1)  # 稍作停顿,确保滚动效果生效(可根据实际情况调整停顿时间)

在上述代码中:MainOperations 类接收驱动对象,实例化 MainPage 类,然后定义了点击编辑按钮和点击开始创作按钮的操作方法,将页面元素查找和实际操作进行了封装整合。
 

  • input_text 方法用于向指定的页面元素(比如输入框)中输入文本内容,先清空原有内容再通过 send_keys 方法输入新的文本。
  • get_element_text 方法用于获取页面元素展示的文本内容,通过查找元素后返回其 text 属性获取文本,如果查找过程出现异常则返回 None
  • is_element_visible 方法借助 WebDriverWaitEC.visibility_of_element_located 条件来判断元素在指定的超时时间内是否可见,返回对应的布尔值结果。
  • wait_for_element_to_be_clickable 方法等待元素变为可点击状态,同样使用 WebDriverWait 机制,超时未可点击则返回 None,可点击时返回对应的元素对象,方便后续进行点击操作等。
  • scroll_to_element 方法实现将页面滚动到指定元素位置,示例中给出了一种基于 JavaScript 在 Web 页面上滚动的简单逻辑,对于移动端可根据 Appium 相关的滚动功能进行相应替换,滚动后还添加了短暂的停顿时间以确保滚动效果生效。

这些操作方法可以在自动化测试用例中灵活组合使用,更加全面地模拟用户在应用页面上的各种交互行为,对页面元素进行操作、判断和处理,以验证应用功能是否符合预期。

2. app_test 模块

用于存放自动化测试用例以及相关的测试配置和夹具(fixture)等代码。

  • __init__.py:使 app_test 目录成为Python包。
  • test_main.py:编写具体的自动化测试用例,使用 pytest 测试框架(这里假设使用 pytest,你也可以选择其他测试框架如 unittest 等),示例如下:
import pytest
from app_lib.operations.main_operations import MainOperations@pytest.fixture
def setup_driver():# 这里可以调用app_lib/base/base_driver.py中的BaseDriver类初始化驱动对象# 假设初始化一个移动端安卓的驱动,你可以根据实际需求修改平台类型driver = BaseDriver("android").driveryield driverdriver.quit()def test_start_creation(setup_driver):main_operations = MainOperations(setup_driver)main_operations.click_edit_button()main_operations.click_start_create_button()

在这个测试用例中,首先通过 setup_driver 夹具函数初始化并获取驱动对象,然后利用 MainOperations 类的实例对页面上的按钮进行点击操作,模拟用户在应用主页面上进行“编辑”后“开始创作”的操作流程,验证功能是否正常。

  • conftest.py:用于定义一些全局的测试夹具或者配置,这些夹具可以在多个测试用例中共享使用,例如可以在这里配置测试的全局环境变量、设置测试的超时时间等,示例(简单配置 setup_driver 夹具在不同测试模块中的共享情况):
import pytest
from app_lib.base.base_driver import BaseDriver@pytest.fixture(scope="module")
def setup_driver():# 初始化驱动对象,这里同样可以根据实际需求调整平台类型等配置driver = BaseDriver("android").driveryield driverdriver.quit()

这里将 setup_driver 夹具的作用域设置为 module(模块级别),使得在同一个测试模块中的多个测试用例都可以共享使用这个夹具获取到的驱动对象,避免重复初始化驱动带来的资源浪费和可能出现的问题。

3. config 模块

用于存放配置文件以及配置读取相关的代码,便于统一管理应用自动化测试过程中的各种配置信息。

  • __init__.py:使 config 目录成为Python包。
  • config.ini:配置文件示例,采用常见的 INI 格式,内容可以包含如应用相关的信息、测试环境相关的配置等,例如:
[Appium]
server_url = http://127.0.0.1:4723/wd/hub
platform = android[Android]
deviceName = emulator-5554
appPackage = com.example.app
appActivity = com.example.app.MainActivity[Web]
base_url = https://www.example.com

这里定义了 Appium 相关的服务器地址和平台类型,安卓设备的具体名称、应用的包名和启动Activity等信息,以及如果是Web应用时的基础访问网址等配置内容,在代码中可以通过相应的配置读取模块来获取这些配置值进行使用。

4. run_tests.py

这是一个用于启动自动化测试的入口脚本,可以根据实际需求配置测试的执行方式、选择要执行的测试用例范围等,示例如下:

import pytestif __name__ == "__main__":pytest.main(["-v", "-s", "app_test"])

这段代码使用 pytestmain 函数启动测试,通过传入参数 -v(显示详细的测试执行信息)和 -s(允许在测试执行过程中输出标准输出信息,比如打印一些调试语句等)以及指定测试用例所在的目录 app_test,来运行所有位于 app_test 目录下的自动化测试用例。

通过这样的代码框架结构,将自动化测试相关的功能按照不同的职责进行了清晰的划分,app_lib 提供核心的功能支持,app_test 编写具体的测试用例,config 管理配置信息,run_tests.py 启动测试,各部分协同工作,方便在不同的应用自动化测试场景下进行扩展和维护,提高测试效率和代码质量。

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

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

相关文章

二分法篇——于上下边界的扭转压缩间,窥见正解辉映之光(1)

前言 二分法,这一看似简单却又充满哲理的算法,犹如一道精巧的数学之门,带领我们在问题的迷雾中找到清晰的道路。它的名字虽简单,却深藏着智慧的光辉。在科学的浩瀚星空中,二分法如一颗璀璨的星辰,指引着我们…

基于 FFmpeg/Scrcpy 框架构建的一款高性能的安卓设备投屏管理工具-供大家学习研究参考

支持的投屏方式有:USB,WIFIADB,OTG,投屏之前需要开启开发者选项里面的USB调试。 主要功能有: 1.支持单个或多个设备投屏。 2.支持键鼠操控。 3.支持文字输入。 4.支持共享剪切板(可复制粘贴电脑端文字到手机端,也可导出手机剪切板到电脑端)。 5.支持视频图片上传,可单…

【Go底层】time包Ticker定时器原理

目录 1、背景2、go版本3、源码解释【1】Ticker结构【2】NewTicker函数解释 4、代码示例5、总结 1、背景 说到定时器我们一般想到的库是cron,但是对于一些简单的定时任务场景,标准库time包下提供的定时器就足够我们使用,本篇文章我们就来研究…

Docker 部署Nginx 数据卷挂载 配置文件挂载

启动容器 docker run -d --name nginx \-v /etc/local/nginx/dist:/usr/share/nginx/html \-p 80:80 \--restart always \nginx宿主机站点 /etc/local/nginx/dist 容器内html /usr/share/nginx/html 复制配置文件到主机 docker cp nginx:/etc/nginx/nginx.conf /etc/local/n…

【论文笔记】A Token-level Contrastive Framework for Sign Language Translation

🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: A Token-level Contrastiv…

ROS2教程 - 3 HelloWorld

更好的阅读体验:https://www.foooor.com 3 HelloWorld 下面从 HelloWorld 开始,讲解 ROS2 的开发。 ROS 开发主要使用 C 或 Python 实现,如果要实现的功能,对性能有要求,可以使用 C 实现,如果对性能没有…

洛谷 B3626 跳跃机器人 C语言 记忆化搜索

题目: https://www.luogu.com.cn/problem/B3626 题目描述 地上有一排格子,共 n 个位置。机器猫站在第一个格子上,需要取第 n 个格子里的东西。 机器猫当然不愿意自己跑过去,所以机器猫从口袋里掏出了一个机器人!这…

【AI】Sklearn

长期更新,建议关注、收藏、点赞。 友情链接: AI中的数学_线代微积分概率论最优化 Python numpy_pandas_matplotlib_spicy 建议路线:机器学习->深度学习->强化学习 目录 预处理模型选择分类实例: 二分类比赛 网格搜索实例&…

⭐️ GitHub Star 数量前十的工作流项目

文章开始前,我们先做个小调查:在日常工作中,你会使用自动化工作流工具吗?🙋 事实上,工作流工具已经变成了提升效率的关键。其实在此之前我们已经写过一篇博客,跟大家分享五个好用的工作流工具。…

Tree搜索二叉树、map和set_数据结构

数据结构专栏 如烟花般绚烂却又稍纵即逝的个人主页 本章讲述数据结构中搜索二叉树与HashMap的学习,感谢大家的支持!欢迎大家踊跃评论,感谢大佬们的支持! 目录 搜索二叉树的概念二叉树搜索模拟实现搜索二叉树查找搜索二叉树插入搜索二叉树删除…

Swift实现高效链表排序:一步步解读

文章目录 前言摘要问题描述题解解题思路Swift 实现代码代码分析示例测试与结果 时间复杂度空间复杂度总结关于我们 前言 本题由于没有合适答案为以往遗留问题,最近有时间将以往遗留问题一一完善。 148. 排序链表 不积跬步,无以至千里;不积小流…

【开篇】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

qt QAnimationDriver详解

1、概述 QAnimationDriver是Qt框架中提供的一个类,它主要用于自定义动画帧的时间控制和更新。通过继承和实现QAnimationDriver,开发者可以精确控制动画的时间步长和更新逻辑,从而实现丰富和灵活的动画效果。QAnimationDriver与QAbstractAnim…

何时在 SQL 中使用 CHAR、VARCHAR 和 VARCHAR(MAX)

在管理数据库表时,考虑 CHAR、VARCHAR 和 VARCHAR(MAX) 是必不可少的。此外,使用正确的工具(例如dbForge Studio for SQL Server) ,与数据库相关的任务都会变得更加容易。它是针对 SQL Server 专业人员的强大的一体化解…

20241127 给typecho文章编辑附件 添加视频 图片预览

Typecho在写文章时,如果一次性上传太多张图片可能分不清哪张,因为附件没有略缩图,无法实时阅览图片,给文章插入图片时很不方便。 编辑admin/file-upload.php 大约十八行的位置 一个while 循环里面,这是在进行html元素更新操作,在合…

YOLO的框架及版本迭代

YOLO(You Only Look Once)是一种非常流行的实时目标检测算法,其特点是将目标检测任务转换为一个回归问题,通过一次前向传播就可以同时完成目标的分类和定位。以下是YOLO框架的整体架构和工作原理: 一、YOLO的基本框架…

Linux命令系列-常见查看系统资源命令

Linux命令系列-常见查看命令 进程管理内存管理磁盘空间管理网络管理主机系统 摘要:本文将对linux系统上常见的查看系统各种资源的命令进行介绍,包括du,df,netstat等命令。所有这些命令都有相关实验截图,实验平台为ubun…

【Python网络爬虫笔记】6- 网络爬虫中的Requests库

一、概述 Requests 是一个用 Python 语言编写的、简洁且功能强大的 HTTP 库。它允许开发者方便地发送各种 HTTP 请求,如 GET、POST、PUT、DELETE 等,并且可以轻松地处理请求的响应。这个库在 Python 生态系统中被广泛使用,无论是简单的网页数…

SolarCube: 高分辨率太阳辐照预测基准数据集

太阳能作为清洁能源在减缓气候变化中的作用日益凸显,其稳定的供应对电网管理至关重要。然而,太阳辐照受云层和天气变化的影响波动较大,给光伏电力的管理带来挑战,尤其是在调度、储能和备用系统管理方面。因此,精确的太…

对拍详细使用方法

对拍的作用 对于我们在学校OJ,cf,牛客…各种只提供少量测试数据的题目,常常交上代码常常超时,能写出正确的暴力代码而题目要求的时间复杂度更低。然而这时你写出了能通过样例且时间复杂度更低的代码,但交上去就是错误…