当前位置: 首页 > news >正文

自动化测试框架集成:将Selenium集成到pytest与unittest中

目录

引言

一、Selenium简介

二、Selenium与pytest的集成

1. 安装pytest和Selenium

2. 编写测试用例

3. 运行测试

三、Selenium与unittest的集成

1. 编写测试类

2. 运行测试

四、Selenium自动化测试的最佳实践

1. 使用Page Object模式

2. 合理利用等待机制

3. 跨浏览器测试

4. 编写清晰的测试报告

五、总结


引言

随着软件开发的日益复杂,自动化测试在软件开发周期中的重要性愈发凸显。自动化测试不仅提高了测试效率,还确保了软件质量的一致性和可重复性。Selenium作为Web自动化测试领域的佼佼者,以其强大的跨浏览器支持和灵活的API设计,在自动化测试领域占据了重要地位。本文将详细探讨如何将Selenium集成到两种常见的Python测试框架——pytest和unittest中,并通过丰富的案例和代码示例,帮助新手朋友快速上手。

一、Selenium简介

Selenium是一个用于Web应用程序自动化测试的工具集,它直接运行在浏览器中,模拟用户的操作行为,如点击、输入、导航等。Selenium支持多种浏览器和平台,包括Chrome、Firefox、Edge、Safari等,且支持多种编程语言,如Java、Python、C#等。Selenium主要由几个部分组成:

  • Selenium IDE:一个用于记录、编辑和调试测试用例的图形界面工具。
  • Selenium WebDriver:提供了一套API,允许开发者编写代码来控制浏览器。
  • Selenium Grid:支持分布式测试用例执行,可以将测试用例分布到不同的测试机器上执行。
  • Selenium WebDriver API 概览
  • Selenium WebDriver API提供了丰富的功能,用于定位页面元素、模拟用户输入、处理弹窗、执行JavaScript代码等。

以下是一些常用的API示例:

from selenium import webdriver  
from selenium.webdriver.common.by import By  
from selenium.webdriver.common.keys import Keys  # 初始化WebDriver  
driver = webdriver.Chrome()  # 打开网页  
driver.get("http://www.example.com")  # 定位元素并输入文本  
search_box = driver.find_element(By.ID, "search-box")  
search_box.send_keys("Selenium")  # 模拟点击搜索按钮  
search_button = driver.find_element(By.ID, "search-button")  
search_button.click()  # 执行JavaScript代码  
driver.execute_script("alert('Hello, Selenium!');")  # 关闭浏览器  
driver.quit()

二、Selenium与pytest的集成

pytest是Python的一个非常流行的测试框架,以其简单、灵活和可扩展性著称。将Selenium集成到pytest中,可以使Web自动化测试更加高效和灵活。

1. 安装pytest和Selenium

首先,需要确保安装了pytest和Selenium。可以通过pip安装:

bash
pip install pytest selenium

2. 编写测试用例

使用pytest编写Selenium测试用例时,通常会在测试文件中定义多个测试函数,每个函数代表一个测试用例。每个测试函数都会接收一个fixture作为参数,该fixture负责初始化WebDriver并管理其生命周期。

示例:百度搜索测试

# test_baidu.py  
import pytest  
from selenium import webdriver  
from selenium.webdriver.common.by import By  
from selenium.webdriver.support.ui import WebDriverWait  
from selenium.webdriver.support import expected_conditions as EC  # 定义WebDriver fixture  
@pytest.fixture(scope="function")  
def driver():  chrome_options = webdriver.ChromeOptions()  chrome_options.add_argument("--headless")  # 无头模式运行  driver = webdriver.Chrome(options=chrome_options)  yield driver  driver.quit()  def test_baidu_search(driver):  driver.get("https://www.baidu.com")  search_box = driver.find_element(By.ID, "kw")  search_box.send_keys("Selenium")  search_button = driver.find_element(By.ID, "su")  search_button.click()  # 等待搜索结果加载  WebDriverWait(driver, 10).until(  EC.presence_of_element_located((By.CLASS_NAME, "result-op"))  )  # 验证搜索结果  assert "Selenium" in driver.title  # 运行测试  
# pytest test_baidu.py

3. 运行测试

使用pytest命令运行测试文件,pytest会自动发现并执行所有以test_开头的函数。

pytest test_baidu.py

三、Selenium与unittest的集成

unittest是Python自带的单元测试框架,虽然不如pytest灵活,但在一些项目中仍然被广泛使用。将Selenium集成到unittest中,可以实现Web自动化测试的基本需求。

1. 编写测试类

在unittest中,测试通常以测试类的形式组织,每个测试方法都以test_开头。测试类需要继承自unittest.TestCase。

示例:百度搜索测试

# test_baidu_unittest.py  
import unittest  
from selenium import webdriver  
from selenium.webdriver.common.by import By  
from selenium.webdriver.support.ui import WebDriverWait  
from selenium.webdriver.support import expected_conditions as EC  class TestBaidu(unittest.TestCase):  def setUp(self):  self.driver = webdriver.Chrome()  def test_baidu_search(self):  self.driver.get("https://www.baidu.com")  search_box = self.driver.find_element(By.ID, "kw")  search_box.send_keys("Selenium")  search_button = self.driver.find_element(By.ID, "su")  search_button.click()  # 等待搜索结果加载  WebDriverWait(self.driver, 10).until(  EC.presence_of_element_located((By.CLASS_NAME, "result-op"))  )  # 验证搜索结果  self.assertIn("Selenium", self.driver.title)  def tearDown(self):  self.driver.quit()  if __name__ == '__main__':  unittest.main()

2. 运行测试

使用unittest自带的unittest.main()函数运行测试。

python test_baidu_unittest.py

四、Selenium自动化测试的最佳实践

1. 使用Page Object模式

Page Object模式是一种将页面上的元素和操作封装成一个类的设计模式。这样做的好处是可以减少代码重复,提高测试的可维护性。例如,可以将百度首页的搜索功能封装成一个类,然后在多个测试用例中重复使用。

# baidu_page.py  
from selenium.webdriver.common.by import By  class BaiduPage:  def __init__(self, driver):  self.driver = driver  def search(self, keyword):  search_box = self.driver.find_element(By.ID, "kw")  search_box.send_keys(keyword)  search_button = self.driver.find_element(By.ID, "su")  search_button.click()  # test_baidu_with_page_object.py  
import unittest  
from selenium import webdriver  
from selenium.webdriver.support.ui import WebDriverWait  
from selenium.webdriver.support import expected_conditions as EC  
from baidu_page import BaiduPage  class TestBaiduWithPageObject(unittest.TestCase):  def setUp(self):  self.driver = webdriver.Chrome()  self.baidu_page = BaiduPage(self.driver)  def test_baidu_search(self):  self.baidu_page.search("Selenium")  WebDriverWait(self.driver, 10).until(  EC.presence_of_element_located((By.CLASS_NAME, "result-op"))  )  self.assertIn("Selenium", self.driver.title)  def tearDown(self):  self.driver.quit()  if __name__ == '__main__':  unittest.main()

2. 合理利用等待机制

在Web自动化测试中,经常需要等待页面元素加载完成后再进行操作。Selenium提供了显示等待(Explicit Wait)和隐式等待(Implicit Wait)两种机制。显示等待可以根据具体的条件等待元素,更加灵活;隐式等待则是在整个WebDriver的生命周期内设置等待时间,较为简单但不够灵活。

3. 跨浏览器测试

Selenium支持多种浏览器,可以通过修改WebDriver的初始化代码来实现跨浏览器测试。例如,通过修改webdriver.Chrome()为webdriver.Firefox(),即可在Firefox浏览器中运行测试。

4. 编写清晰的测试报告

测试报告是测试结果的重要展示形式。pytest和unittest都支持生成测试报告,但有时候可能需要更详细的HTML报告。可以使用HTMLTestRunner(一个第三方库)来生成HTML格式的测试报告。

pip install HTMLTestRunner

然后,在unittest的测试脚本中添加生成HTML报告的代码。

五、总结

Selenium作为Web自动化测试的强大工具,与pytest和unittest等测试框架的集成,可以极大地提升Web应用的测试效率和测试质量。通过合理的测试设计、Page Object模式的应用、等待机制的使用以及跨浏览器测试,可以构建出稳定、可靠的自动化测试体系。希望本文的介绍和示例能够帮助新手朋友快速入门Selenium自动化测试,并在实际项目中灵活运用。

相关文章:

自动化测试框架集成:将Selenium集成到pytest与unittest中

目录 引言 一、Selenium简介 二、Selenium与pytest的集成 1. 安装pytest和Selenium 2. 编写测试用例 3. 运行测试 三、Selenium与unittest的集成 1. 编写测试类 2. 运行测试 四、Selenium自动化测试的最佳实践 1. 使用Page Object模式 2. 合理利用等待机制 3. 跨浏…...

华为GaussDB数据库(单机版)在ARM环境下的安装指南

一、软件版本 机器配置:8核16G,CPU: Huawei Kunpeng 920 2.9GHz操作系统:EulerOS 2.8 64bit with ARM数据库版本:GaussDB Kernel 505.1.0 build 44f4fa53 二、部署流程 2.1 新建用户 ① 以omm用户为例,添加一个omm用…...

计算机网络笔记002

### 课堂讨论对话 **学生A**: 老师,计算机网络的组成是怎样的?🤔 **老师**: 非常好的问题!计算机网络主要由硬件、软件和通信协议三部分组成。我们先从硬件开始讨论吧。 **学生B**: 硬件包括哪些设备呢?&#x1f60…...

Unity 的Event的Use()方法

对于Event的Use方法,其在调用后将不会再判断同类型的事件 这种情况下,第二个MosueDown不会进入,因为已经Use 如果把Use注释掉 依旧能进入第二个MosueDown 也就是说当使用了Use方法,相同的事件类型不会进第二遍...

数据分析师之Excel数据清洗

前言 目前,掌握一定的Excel技能时,怎么通过自己的技能实现数据分析的操作,就需要进行具体项目的实战,本身数据分析这个行业是非常吃经验的,既然我们是小白入坑,就需要多做实战演练,才能够实际的…...

手机解压软件加密指南:让文件更安全

在数字化时代,文件加密对于保护个人隐私和敏感信息的重要性不言而喻。随着互联网的飞速发展,我们的生活和工作越来越依赖于数字设备和网络。 然而,这也带来了一系列的安全风险,如黑客攻击、数据泄露等。文件加密技术成为了保护我…...

python yield generator 详解

目录 generator基础 generator应用 generator基础应用   generator高级应用 注意事项: 正文 本文将由浅入深详细介绍yield以及generator,包括以下内容:什么generator,生成generator的方法,generator的特点&#…...

MATLAB矩阵下标引用

在MATLAB中,普通的二维数组元素的数字索引分为双下标索引和单下标索引。双下标索引是通过一个二元数组对来对应元素在矩阵中的行列位置,例如A(2,3)表示矩阵A中第2行第3列的元素。单下标索引的方式是采用列元素优先的原则,对m行n列的矩阵按列排…...

syn洪水攻击原理是什么

在网络世界中,正常的网络访问就像一场有序的对话。当我们访问网站时,客户端与服务器要进行 TCP 三次握手来建立连接。首先,客户端向服务器发送一个 SYN 包,请求建立连接,这就如同向服务器打招呼说“我想连接”&#xf…...

前缀和(4)_除自身以外数组的乘积

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 前缀和(4)_除自身以外数组的乘积 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌 目录…...

第二十一节:学习Redis缓存数据库的Hash操作(自学Spring boot 3.x的第五天)

这节记录下Redis的Hash操作。主要是opsForHash方式和boundHashOps方式。 boundHashOps和opsForHash都是Spring Data Redis中用于操作Redis哈希数据结构的方法,但它们在使用方式和场景上存在一些区别。 boundHashOps 使用方式: boundHashOps方法通过Redi…...

OpenCV视频I/O(1)视频采集类VideoCapture介绍

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 用于从视频文件、图像序列或摄像头捕获视频的类。 该类提供了用于从摄像头捕获视频或读取视频文件和图像序列的 C API。 以下是该类的使用方法&a…...

CVE-2024-46103

前言 CVE-2024-46103 SEMCMS的sql漏洞。 漏洞简介 SEMCMS v4.8中,SEMCMS_Images.php的search参数,以及SEMCMS_Products.php的search参数,存在sql注入漏洞。 (这个之前就有两个sql的cve,这次属于是捡漏了&#x1f6…...

三,MyBatis-Plus 的各种查询的“超详细说明”,比如(等值查询,范围查询,模糊查询...)

三,MyBatis-Plus 的各种查询的“超详细说明”,比如(等值查询,范围查询,模糊查询…) 文章目录 三,MyBatis-Plus 的各种查询的“超详细说明”,比如(等值查询,范围查询,模糊查询...)1. …...

Linux 冯诺依曼体系结构与操作系统概念

目录 0.前言 1. 冯诺依曼体系结构概述 1.1 输入单元 1.2 中央处理单元(CPU) 1.3 输出单元 2. 冯诺依曼体系结构的关键特性 2.1 所有数据流向内存 2.2 数据流动示例:QQ聊天过程 3. 操作系统 3.1 概念 3.2 设计操作系统的目的 3.3 操作系统的“…...

UE4中 -skipbuild -nocompile 有什么区别

在项目开发中,我看到了在调用 Engine\\Build\\BatchFiles\\RunUAT.bat 相关的命令行中,有 -skipbuild、 -nocompile 两个很像的参数,于是想探究一下它们的区别与含义。 -skipbuild 参数 到底有没有 -skipbuild 这个参数?根据 http…...

k8s篇之数据挂载类型及区别

一、K8S集群数据挂载类型及区别 在 Kubernetes 中,数据挂载类型主要有以下几种,每种类型适用于不同的场景。以下是主要的挂载类型及其应用场景的详细说明: 1. emptyDir 描述:emptyDir 是一个空目录,其生命周期与 Pod 相同。 它在 Pod 创建时被创建,并在 Pod 删除时被清…...

LiveQing视频点播流媒体RTMP推流服务功能-支持电子放大拉框放大直播视频拉框放大录像视频流拉框放大电子放大

LiveQing视频点播流媒体RTMP推流服务功能-支持电子放大拉框放大直播视频拉框放大录像视频流拉框放大电子放大 1、鉴权直播2、视频点播3、RTMP推流视频直播和点播流媒体服务 1、鉴权直播 鉴权直播-》播放 ,左键单击可以拉取矩形框,放大选中的范围&#x…...

fetch怎么使用

fetch 是一个现代、强大的、基于 Promise 的网络请求 API,用于在浏览器中发起网络请求(如异步获取资源)。它提供了一种更加简洁和灵活的方式来替代 XMLHttpRequest。下面是 fetch 的基本使用方法和一些示例。 基本语法 fetch(url, options)…...

回归预测 | Matlab基于SO-SVR蛇群算法优化支持向量机的数据多输入单输出回归预测

回归预测 | Matlab基于SO-SVR蛇群算法优化支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab基于SO-SVR蛇群算法优化支持向量机的数据多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab基于SO-SVR蛇群算法优化支持向量机的数据多…...

光耦知识分享:如何挑选合适的可控硅光耦型号

可控硅光耦是一种光电耦合器件,它结合了光敏元件(通常是光敏二极管)和可控硅器件(如普通可控硅或三端可控硅)的特性。它的工作原理是利用光信号控制可控硅的导通和截止,从而实现对电路的控制。 可控硅光耦…...

MySql Explain优化命令使用

MySql Explain优化命令使用 truncate table student // 自增id 从 0 开始 delete from student // 自增id 会保留 , 108 区别: 1:自增id 2:delete 可以恢复 truncate 无法恢复 前言 EXPLAIN 是一个用于获取 SQL 语句执行计划的…...

Android NestedScrollView+TabLayout+ViewPager+ 其它布局,ViewPager 不显示以及超出屏幕不显示问题

前言 此场景为 NestedScrollView 嵌套多个布局 ,大致结构为 NestedScrollViewTabLayoutViewPagerfragment 其它View,如下图 , 一、ViewPager 设置高度才会显示内容问题 原因:NestedScrollView 计算高度先于 ViewPager 渲染前,所…...

Linux开机logo设置

本文介绍Linux开机logo设置。 常用的Linux开机logo设置工具有fbi(Linux Framebuffer Imageviewer),plymouth等,本文针对fbi工具进行开机logo设置。 1.fbi工具安装 命令行下,输入: sudo apt-get install fbi -y 安装完毕后&am…...

webpack插件开发 模拟vue系统登录后,获取a标签下的文件

浏览器插件开发中,在webpack插件开发中,模拟Vue系统登录后获取a标签下的文件,可以通过监听某个登录事件,并在事件处理函数中修改Webpack的输出配置来实现。以下是一个简化的示例代码: // 假设有一个插件构造函数 Logi…...

大规模数据处理:分库分表与数据迁移最佳实践

什么是分库分表 分库分表是一种数据库架构优化策略,它将数据分散存储在多个数据库或表中,以此来提高系统的可扩展性和性能。 虽然分库分表能够提升系统的整体性能,但是也不要一上来就分库分表,如果系统在单表的情况下&#xff0…...

TCP网络编程概述、相关函数、及实现超详解

文章目录 TCP网络编程概述1. TCP协议的特点2. TCP与UDP的差异3. TCP编程流程 TCP网络编程相关函数详解1. socket():创建套接字参数说明:返回值:示例: 2. connect():客户端连接服务器参数说明:返回值&#x…...

Cluade 3.5 Sonnet 提示词泄露

prompt 翻译: The notebook currently demonstrates support for a two agent setup. Support for GroupChat is currently in development....

git clone代码报错Permission denied (publickey)

git clone gerrit SSH的Clone with commit-msg hook代码连接,报错Permission denied (publickey). 一般在C:\Users\用户名.ssh文件夹下有一个id_rsa.pub文件 把文件里的内容复制 到gerrit网站上User Settings的SSH keys里 在New SSH key里粘贴刚刚复制的内容&…...

QT设计中文输入法软键盘DLL给到C#开发步骤

开发目的:本文提供解决触摸屏C#程序中无法输入中文问题,中文拼音采用开源的谷歌输入法程序、使用QT编译中文输入法界面和中文输入法接口给到C#使用。 开发步骤: 1、QT中设计字母和字符输入界面 2、QT中设计数字输入界面 3、QT中封装调用谷歌…...