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

news2024/9/28 7:02:09

目录

引言

一、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自动化测试,并在实际项目中灵活运用。

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

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

相关文章

vioovi视与视标准工时工具与ECRS工时分析软件:精益生产的新纪元

在当今快速变化的市场环境中,企业面临着前所未有的挑战,其中成本控制与效率提升成为制约其发展的关键因素。传统的标准工时工具在应对这些挑战时显得力不从心,其局限性日益凸显。而vioovi视与视标准工时工具的出现,则为企业实现精…

西门子触摸屏下载时提示缺少面板映像的解决方法汇总

西门子触摸屏下载时提示缺少面板映像的解决方法汇总 使用V15/V15.1/V16/V17/V18/V19下载精智(Comfort)系列屏的项目时有时会提示“由于缺少面板映像,下载失败。请安装缺少的面板映像”,造成上述异常的主要原因是V15/V15.1/V16/V17/V18/V19的软件缺少对应的映像文件。常见问题…

《Linux从小白到高手》开篇:脱胎换骨之为什么要深度学习Linux?

List item 这一篇字数比较多,可能会比较枯燥。但是,如果你想学习Linux或者你想进一步提升自己的Linux专业水平,那么,还是请你坚持看完。这倒不是说文笔有多好,而是作为一个学习并使用了Linux 十多年的老司机&#xff…

PHP Swoole 基本使用

背景 在项目中,我们使用了PHP语言,但由于存在长耗时的任务,所以需要服务器端异步响应。为了实现异步响应,我们有多种方案可选,包括MQ(消息队列)、fsocket(文件套接字)、…

【Redis】渐进式遍历 数据库管理命令 RESP协议

目录 渐进式遍历 scan 数据库管理命令 切换数据库 获取当前数据库key的个数 删除当前数据库所有的key 删除所有数据库中所有的key RESP协议 渐进式遍历 Redis使用scan命令进行渐进式遍历键,进而解决直接使用keys获取键时可能出现的阻塞问题(因为…

多旋翼无人机光伏发电站吊运技术详解

随着清洁能源技术的快速发展,光伏发电站作为可再生能源的重要组成部分,其建设与维护对效率、安全性和成本控制的要求日益提高。多旋翼无人机光伏发电站吊运技术应运而生,该技术利用多旋翼无人机强大的垂直起降能力、灵活的飞行控制以及高效的…

CSS中的字体样式、文本样式、列表样式以及背景和渐变

一、字体样式和文本样式 1.span标签 span标签的作用&#xff1a;能让某几个文字或者是词语凸显出来 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-…

【深度学习基础模型】门控循环单元 (Gated Recurrent Units, GRU)详细理解并附实现代码。

【深度学习基础模型】门控循环单元 (Gated Recurrent Units, GRU) 【深度学习基础模型】门控循环单元 (Gated Recurrent Units, GRU) 文章目录 【深度学习基础模型】门控循环单元 (Gated Recurrent Units, GRU)1.门控循环单元 (Gated Recurrent Units, GRU) 原理详解1.1 GRU 概…

一个任务的一辈子

总览 孕育&#xff1a;这一步是生命的起源&#xff0c;对应"任务"就是&#xff1a;申办人因为办理业务而发起一个流程。这是任务产生的摇篮。 任务的使命就是为了完成业务;生产&#xff1a;这是新生命产生的过程&#xff0c;对应"任务"就是&#xff1a;任务…

IT运维挑战与对策:构建高效一体化运维管理体系

在当今数字化时代&#xff0c;IT运维作为企业运营的核心支撑&#xff0c;其重要性不言而喻。然而&#xff0c;随着业务规模的扩大和技术的不断革新&#xff0c;IT运维团队面临着前所未有的挑战。本文旨在深度剖析当前IT运维中存在的主要问题&#xff0c;并探索一体化解决方案&a…

1500PLC使用EPOS控制伺服电机

硬件配置与参数 硬件配置 名称 型号 数量 PLC 1512C-1 PN 1个 伺服放大器 V90 PN 1个 伺服电机 SIMOTICS 1个 V90 PN伺服驱动器&#xff1a; 伺服驱动器硬件参数 使用软件&#xff1a;V-ASSISTANT 软件连接时可选择USB连接或者Ethernet连接&#xff0c;根据实际…

【ComfyUI】生成图细节更清晰——Consistency_Decoder

原文&#xff1a;https://github.com/openai/consistencydecoder comfyui: https://github.com/gameltb/Comfyui_Consistency_Decoder_VAE 博文资料下载&#xff1a;https://pan.baidu.com/s/1SwfA4T6iMsA8IrRrGXm4sg?pwd0925 安装 【秋葉aaaki】comfyui一键运行包 夸克网盘…

Vue下载静态文件

1、需求&#xff1a;将静态文件放在本地&#xff0c;让用户进行下载。 2、文件位置&#xff1a; ① 原生js&#xff1a;直接将文件放在某个目录或者根目录下 ② Vue&#xff1a;将文件放在根目录的public文件夹下面 3、代码示例&#xff1a; const url "/模板.xlsx"…

音视频入门基础:AAC专题(9)——FFmpeg源码中计算AAC裸流每个packet的duration和duration_time的实现

音视频入门基础&#xff1a;AAC专题系列文章&#xff1a; 音视频入门基础&#xff1a;AAC专题&#xff08;1&#xff09;——AAC官方文档下载 音视频入门基础&#xff1a;AAC专题&#xff08;2&#xff09;——使用FFmpeg命令生成AAC裸流文件 音视频入门基础&#xff1a;AAC…

前言 动手学深度学习课程安排及介绍

前言 动手学深度学习课程安排及介绍 文章目录 前言 动手学深度学习课程安排及介绍课程预告课程安排深度学习介绍 课程预告 学习深度学习关键是动手。 深度学习是人工智能最热的领域核心是神经网络神经网络是一门语言应该像学习Python/C一样学习深度学习 课程安排 【动手学深…

Mysql 存储List类型的数据

python request 爬到的数据里面有一部分是List&#xff0c;一开始在建表时想当然地使用 create table if not exists demo (id TEXT, short_id TEXT, parent_ids LIST)结果报错syntax error&#xff0c;查半天才发现Mysql里没有LIST这个类型 所以存储一个List只能将List数据…

第十六章 模板与泛型编程

16.1 定义模板 模板是C泛型编程的基础。为模板提供足够的信息&#xff0c;就能生成特定的类或函数。 16.1.1 函数模板 在模板定义中&#xff0c;模板参数列表不能为空。 //T的实际类型在编译时根据compare的使用情况来确定 template <typename T> int compare(const …

乱篇弹(54)让子弹飞

创作者在知乎能挣到钱吗&#xff1f; 芝士平台的答案&#xff1a;“当然能&#xff0c;在知乎&#xff0c;无论是各领域的优秀回答者&#xff0c;还是拥有几百或几千关注者的潜力创作者&#xff0c;甚至是只在知乎创作过几篇回答的新人创作者&#xff0c;都有可能在知乎赚钱 。…

[Linux]从零开始的Linux的远程方法介绍与配置教程

一、为什么需要远程Linux 相信大家在学习Linux时&#xff0c;要么是使用Linux的虚拟机或者在物理机上直接安装Linux。这样确实非常方便&#xff0c;我们也能直接看到Linux的桌面或者终端。既然我们都能直接看到终端或者Linux的桌面了&#xff0c;那我们为什么还要远程Linux呢&a…

WebSocket消息防丢ACK和心跳机制对信息安全性的作用及实现方法

WebSocket消息防丢ACK和心跳机制对信息安全性的作用及实现方法 在现代即时通讯&#xff08;IM&#xff09;系统和实时通信应用中&#xff0c;WebSocket作为一种高效的双向通信协议&#xff0c;得到了广泛应用。然而&#xff0c;在实际使用中&#xff0c;如何确保消息的可靠传输…