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

web自动化测试-python+selenium+unitest

文章目录

      • Web自动化测试工具
        • 1. 主流的Web自动化测试工具
        • 2. Selenium家族史
      • Web自动化测试环境搭建
        • 基于Python环境搭建
        • 示例:通过程序启动浏览器,并打开百度首页,暂停3秒,关闭浏览器
      • 页面元素定位
        • 1. 如何进行元素定位?
        • 2. 元素定位方式
        • 例:id定位方式
        • 元素操作、浏览器操作方法
      • Unitest单元测试框架
        • 什么是Unitest框架
        • 为什么使用UnitTest框架
        • UnitTest核心要素
          • 案例:蛋糕商城购物系统登录功能自动化测试
          • Unitest断言方法
      • 生成HTML测试报告
      • 实验
        • 实验目的:
        • 实验环境
        • 实验准备
        • 实验内容
          • (1)实验脚本示例
          • (2)定位方式的其他实现方法
          • (3)测试用例设计
          • (4)使用Unittest框架的自动化测试脚本
        • 提高题(选做)
      • 实验总结

Web自动化测试工具

1. 主流的Web自动化测试工具
  • QTP: QTP是一个商业化的功能测试工具,收费,支持web和桌面自动化测试。
  • Selenium: Selenium是一个开源的web自动化测试工具,免费,主要做功能测试(本课学习)。
  • Robot Framework: Robot Framework是一个基于Python可扩展地关键字驱动的测试自动化框架。
2. Selenium家族史

Web自动化测试环境搭建

基于Python环境搭建
  1. Python 开发环境
  2. 安装selenium包:
    pip install selenium==3.141.0
    
  3. 安装浏览器
  4. 安装浏览器驱动: 保证能够用程序驱动浏览器,实现自动化测试(可放置在Python安装主目录或项目所在目录)。
示例:通过程序启动浏览器,并打开百度首页,暂停3秒,关闭浏览器

实现步骤:

  1. 导包:
    from selenium import webdriver
    import time
    
  2. 创建浏览器驱动对象:
    • Firefox浏览器:driver = webdriver.Firefox()
    • Chrome浏览器:driver = webdriver.Chrome()
    • Edge浏览器:driver = webdriver.Edge()
  3. 打开Web页面: driver.get("http://www.baidu.com/")
  4. 暂停: time.sleep(3)
  5. 关闭驱动对象: driver.quit()

页面元素定位

1. 如何进行元素定位?
  • HTML页面由标签构成,标签的基本格式如下:
    <tag_name attribute_name1="attribute_value1" attribute_name2="attribute_value2">text</tag_name>
    
  • 示例:
    <input id="username" type="text" name="username" placeholder="用户名" />
    <div id="my_cart"><span>我的购物车</span>
    </div>
    
  • 元素定位就是通过元素的信息或元素层级结构来定位元素的。
2. 元素定位方式

Selenium提供了八种定位元素方式:

  • id: element = driver.find_element_by_id(id)
  • name: element = driver.find_element_by_name(name)
  • class_name: element = driver.find_element_by_class_name(class_name)
  • tag_name: element = driver.find_element_by_tag_name(tag_name)
  • link_text: element = driver.find_element_by_link_text(link_text)
  • partial_link_text: element = driver.find_element_by_partial_link_text(partial_link_text)
  • XPath: element = driver.find_element_by_xpath(xpath)
  • CSS: element = driver.find_element_by_css_selector(css_selector)
例:id定位方式
  • id定位就是通过元素的id属性来定位元素,HTML规定id属性在整个HTML文档中必须是唯一的。
  • 前提:元素有id属性
  • id定位方法:element = driver.find_element_by_id(id)
    实现步骤:
  1. 导入selenium包: from selenium import webdriver
  2. 导入time包: import time
  3. 实例化浏览器驱动对象: driver = webdriver.Firefox()
  4. 打开登录页A.html: driver.get(url)
  5. 调用id定位方法: element = driver.find_element_by_id("")
  6. 使用send_keys()方法输入内容: element.send_keys("admin")
  7. 暂停3秒: time.sleep(3)
  8. 关闭浏览器驱动对象: driver.quit()
元素操作、浏览器操作方法

Unitest单元测试框架

什么是Unitest框架
  • 概念:UnitTest是Python自带的一个单元测试框架,用它来做单元测试。
为什么使用UnitTest框架
  1. 能够组织多个用例去执行
  2. 提供丰富的断言方法
  3. 能够生成测试报告
UnitTest核心要素
  1. TestCase
  2. TestSuite
  3. TestRunner
  4. Fixture
案例:蛋糕商城购物系统登录功能自动化测试

实现思路:

  1. 导包: import unittest
  2. 定义测试类: 新建测试类必须继承unittest.TestCase
  3. 定义测试方法: 测试方法名称命名必须以test开头
Unitest断言方法
序号断言方法断言描述
1assertTrue(expr, msg=None)验证expr是true,如果为false,则fail
2assertFalse(expr, msg=None)验证expr是false,如果为true,则fail
3assertEqual(expected, actual, msg=None)验证expected==actual,不等则fail 【掌握】
4assertNotEqual(first, second, msg=None)验证first != second, 相等则fail
5assertIsNone(obj, msg=None)验证obj是None,不是则fail
6assertIsNotNone(obj, msg=None)验证obj不是None,是则fail
7assertIn(member, container, msg=None)验证是否member in container【掌握】
8assertNotIn(member, container, msg=None)验证是否member not in container

生成HTML测试报告

  • HTMLTestReport: UnitTest框架本身不支持生成HTML格式的测试报告,网上有很多类库都可以实现,基本用法都类似,只是生成的HTML报告样式有差别。
  • HTML测试报告生成步骤:
    1. 导包: from htmltestreport import HTMLTestReport
    2. 封装测试套件
    3. 实例化HTMLTestReport对象
    4. 执行测试套件: report.run(suite)

实验

实验目的:
  1. 了解什么是自动化测试及其适用范围。
  2. 掌握使用Selenium进行Web自动化测试的流程和方法。
  3. 自动化测试脚本的编写。
实验环境
  1. Windows操作系统环境;
  2. Python编程环境或Java编程环境;
  3. Selenium自动化测试工具。
实验准备
  1. 准备好Python编程环境或Java编程环境配置;
  2. 安装好Selenium工具。
实验内容
(1)实验脚本示例

以下是使用Python和Selenium完成网上蛋糕商城购物系统登录的脚本示例:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time# 打开浏览器
driver = webdriver.Chrome()# 打开商城首页
driver.get("http://www.dangpu.com")# 定位登录链接并点击
login_link = driver.find_element_by_link_text("登录")
login_link.click()# 定位用户名输入框并输入用户名
username_input = driver.find_element_by_name("username")
username_input.send_keys("admin")# 定位密码输入框并输入密码
password_input = driver.find_element_by_xpath("//input[@type='password']")
password_input.send_keys("admin")# 定位登录按钮并点击
login_button = driver.find_element_by_css_selector("button.login-button")
login_button.click()# 停留5秒
time.sleep(5)# 关闭浏览器
driver.quit()
(2)定位方式的其他实现方法
  • 使用id属性:find_element_by_id()
  • 使用标签名:find_element_by_tag_name()
  • 使用类名:find_element_by_class_name()
  • 使用链接文本:find_element_by_link_text()
  • 使用部分链接文本:find_element_by_partial_link_text()
  • 使用XPath:find_element_by_xpath()
  • 使用CSS选择器:find_element_by_css_selector()
(3)测试用例设计

以下是登录功能的测试用例设计示例:

测试用例ID测试步骤预期结果实际结果状态(通过/失败)
TC001输入正确的用户名和密码成功登录[填写结果][填写状态]
TC002输入错误的用户名,正确的密码登录失败,提示用户名错误[填写结果][填写状态]
TC003输入正确的用户名,错误的密码登录失败,提示密码错误[填写结果][填写状态]
(4)使用Unittest框架的自动化测试脚本

以下是使用Unittest框架的自动化测试脚本示例:

import unittest
from selenium import webdriverclass TestDangpuLogin(unittest.TestCase):def setUp(self):self.driver = webdriver.Chrome()self.driver.get("http://www.dangpu.com")def test_login(self):# 测试登录功能driver = self.driver# ...(此处添加登录操作代码)self.assertEqual("主页", driver.title)  # 假设登录后页面标题为“主页”def tearDown(self):self.driver.quit()if __name__ == "__main__":unittest.main(verbosity=2)
提高题(选做)

使用PO(PageObject)模式完成第1题。
Page Object模式是一种设计模式,用于将页面元素和操作封装成一个对象,以提高测试代码的可维护性和可读性。以下是使用PO模式重构上述登录功能的示例:

首先,创建一个页面类,用于封装登录页面的元素和操作:

class LoginPage:def __init__(self, driver):self.driver = driver@propertydef username_input(self):return self.driver.find_element_by_name("username")@propertydef password_input(self):def find_password_input():return self.driver.find_element_by_xpath("//input[@type='password']")return find_password_input()@propertydef login_button(self):return self.driver.find_element_by_css_selector("button.login-button")def login(self, username, password):self.username_input.send_keys(username)self.password_input.send_keys(password)self.login_button.click()

然后,更新测试类,使用LoginPage类来执行登录操作:

import unittest
from selenium import webdriver
from login_page import LoginPage  # 假设LoginPage保存在login_page.py文件中class TestDangpuLogin(unittest.TestCase):def setUp(self):self.driver = webdriver.Chrome()self.driver.get("http://www.dangpu.com")self.login_page = LoginPage(self.driver)def test_login_success(self):# 测试登录成功self.login_page.login("admin", "admin")self.assertIn("主页", self.driver.title)  # 假设登录后页面标题包含“主页”def test_login_failure_wrong_username(self):# 测试用户名错误self.login_page.login("wrong_username", "admin")# 此处应添加验证登录失败的逻辑,例如检查错误消息等def tearDown(self):self.driver.quit()if __name__ == "__main__":unittest.main(verbosity=2)

使用Page Object模式的好处包括:

  • 降低耦合度:页面元素定位器和操作封装在页面类中,测试代码与页面结构分离,减少测试代码对页面结构的依赖。
  • 提高可读性:通过页面类的方法名称即可了解操作的意图,无需深入查找元素定位器。
  • 提高可维护性:当页面元素发生变化时,只需在页面类中更新相应的元素定位器,无需修改测试代码。

实验总结

  1. 请描述自动化测试流程。

  2. 你将如何学习自动化测试技术?

  3. 自动化测试流程

自动化测试流程通常包括以下几个主要步骤:

需求分析

  • 确定测试目标和范围。
  • 理解软件需求以确定哪些测试可以自动化。

测试计划

  • 制定自动化测试策略和计划。
  • 选择适合的自动化测试工具和框架。

环境搭建

  • 安装和配置所需的软件和硬件环境。
  • 包括编程语言环境、测试工具、依赖库等。

测试数据准备

  • 创建或获取测试数据。
  • 确保测试数据的有效性和覆盖面。

脚本开发

  • 编写自动化测试脚本。
  • 使用编码实现测试逻辑和断言。

测试用例设计

  • 设计可自动化的测试用例。
  • 将测试用例与自动化脚本关联。

测试执行

  • 运行自动化测试脚本。
  • 监控测试执行过程,确保脚本按预期运行。

结果验证

  • 检查测试结果是否符合预期。
  • 使用断言来验证输出。

报告生成

  • 生成测试报告,包括通过/失败的测试用例和测试覆盖率。

问题调试

  • 分析失败的测试用例,确定是测试问题还是代码缺陷。
  • 修复问题并重新运行测试。

维护和更新

  • 根据软件更新和需求变更维护和更新测试脚本。

持续集成

  • 将自动化测试集成到持续集成/持续部署(CI/CD)流程中。
  1. 学习自动化测试技术的方法

学习自动化测试技术可以通过以下途径:

在线资源和教程

  • 利用在线教程、博客文章、视频课程等资源学习基础知识。

参加培训和研讨会

  • 参加自动化测试相关的培训课程和研讨会,与行业专家交流。

阅读书籍

  • 阅读有关自动化测试的专业书籍,深入理解理论和实践。

实践项目

  • 通过实际项目练习自动化测试,将理论知识应用于实践。

参与开源项目

  • 加入开源项目,贡献代码,学习他人的测试策略和代码。

相关文章:

web自动化测试-python+selenium+unitest

文章目录 Web自动化测试工具1. 主流的Web自动化测试工具2. Selenium家族史 Web自动化测试环境搭建基于Python环境搭建示例&#xff1a;通过程序启动浏览器&#xff0c;并打开百度首页&#xff0c;暂停3秒&#xff0c;关闭浏览器 页面元素定位1. 如何进行元素定位&#xff1f;2.…...

LeetCode题练习与总结:组合两个表--175

一、题目描述 SQL Schema > Pandas Schema > 表: Person ---------------------- | 列名 | 类型 | ---------------------- | PersonId | int | | FirstName | varchar | | LastName | varchar | ---------------------- personId 是该表的主…...

数据结构:二叉搜索树(简单C++代码实现)

目录 前言 1. 二叉搜索树的概念 2. 二叉搜索树的实现 2.1 二叉树的结构 2.2 二叉树查找 2.3 二叉树的插入和中序遍历 2.4 二叉树的删除 3. 二叉搜索树的应用 3.1 KV模型实现 3.2 应用 4. 二叉搜索树分析 总结 前言 本文将深入探讨二叉搜索树这一重要的数据结构。二…...

深入理解Prompt工程

前言&#xff1a;因为大模型的流行&#xff0c;衍生出了一个小领域“Prompt工程”&#xff0c;不知道大家会不会跟小编一样&#xff0c;不就是写提示吗&#xff0c;这有什么难的&#xff0c;不过大家还是不要小瞧了Prompt工程&#xff0c;现在很多大模型把会“Prompt工程”作为…...

代码随想录算法训练营day6 | 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1.两数之和

文章目录 哈希表键值 哈希函数哈希冲突拉链法线性探测法 常见的三种哈希结构集合映射C实现std::unordered_setstd::map 小结242.有效的字母异位词思路复习 349. 两个数组的交集使用数组实现哈希表的情况思路使用set实现哈希表的情况 202. 快乐数思路 1.两数之和思路 总结 今天是…...

vue3 vxe-table 点击行,不显示选中状态,加上设置isCurrent: true就可以设置选中行的状态。

1、上个图&#xff0c;要实现这样的&#xff1a; Vxe Table v4.6 官方文档 2、使用 row-config.isCurrent 显示高亮行&#xff0c;当前行是唯一的&#xff1b;用户操作点击选项时会触发事件 current-change <template><div><p><vxe-button click"sel…...

Linux没有telnet 如何测试对端的端口状态

前段时间有人问uos没有telnet&#xff0c;又找不到包。 追问了一下为什么非要安装telnet&#xff0c;答复是要测试对端的端口号。 这里简单介绍一下&#xff0c;测试端口号的方法有很多&#xff0c;telent只是在windows上经常使用&#xff0c;linux已很少安装并使用该命令&…...

花几千上万学习Java,真没必要!(二十九)

1、基本数据类型包装类&#xff1a; 测试代码1&#xff1a; package apitest.com; //使用Integer类的不同方法处理整数。 //将字符串转换为整数&#xff08;parseInt&#xff09;和Integer对象&#xff08;valueOf&#xff09;&#xff0c; //将整数转换回字符串&#xff08;…...

C#如何引用dll动态链接库文件的注释

1、dll动态库文件项目生成属性中要勾选“XML文档文件” 注意&#xff1a;XML文件的名字切勿修改。 2、添加引用时XML文件要与DLL文件在同一个目录下。 3、如果要是添加引用的时候XML不在相同目录下&#xff0c;之后又将XML文件复制到相同的目录下&#xff0c;需要删除引用&am…...

WordPress原创插件:自定义文章标题颜色

插件设置截图 文章编辑时&#xff0c;右边会出现一个标题颜色设置&#xff0c;可以设置为任何颜色 更新记录&#xff1a;从输入颜色css代码&#xff0c;改为颜色选择器&#xff0c;更方便&#xff01; 插件免费下载 https://download.csdn.net/download/huayula/89585192…...

Unity分享:继承自MonoBehaviour的脚步不要对引用类型的字段在声明时就初始化

如果某些字段在每个构造函数中都要进行初始化&#xff0c;很多人都喜欢在字段声明时就进行初始化&#xff0c;对于一个非继承自MonoBehaviour的脚步&#xff0c;这样做是没有问题的&#xff0c;然而继承自MonoBehaviour后就会造成内存的浪费&#xff0c;为什么呢&#xff1f;因…...

.NET Core中如何集成RabbitMQ

在.NET Core中集成RabbitMQ主要涉及到几个步骤&#xff0c;包括安装RabbitMQ的NuGet包、建立连接、定义队列、发送和接收消息等。下面是一个简单的指南来展示如何在.NET Core应用程序中集成RabbitMQ。 目录 1. 安装RabbitMQ.Client NuGet包 2. 建立连接 3. 定义队列 4. 发…...

嵌入式C++、STM32、MySQL、GPS、InfluxDB和MQTT协议数据可视化:智能物流管理系统设计思路流程(附代码示例)

目录 项目概述 系统设计 硬件设计 软件设计 系统架构图 代码实现 1. STM32微控制器与传感器代码 代码讲解 2. MQTT Broker设置 3. 数据接收与处理 代码讲解 4. 数据存储与分析 5. 数据分析与可视化 代码讲解 6. 数据可视化 项目总结 项目概述 随着电子商务的快…...

.net core docker部署教程和细节问题

在.NET Core中实现Docker一键部署&#xff0c;通常涉及以下几个步骤&#xff1a;编写Dockerfile以定义镜像构建过程、构建Docker镜像、运行Docker容器&#xff0c;以及&#xff08;可选地&#xff09;使用自动化工具如Docker Compose或CI/CD工具进行一键部署。以下是一个详细的…...

php数据库链接

Php超全局变量 GET 和 POST 都创建一个数组&#xff08;例如 array&#xff08; key1 > value1&#xff0c; key2 > value2&#xff0c; key3 > value3&#xff0c; ...&#xff09;&#xff09;。此数组包含键/值对&#xff0c;其中 键是表单控件的名称&#xff0c;…...

python+vue3+onlyoffice在线文档系统实战20240726笔记,左侧菜单实现和最近文档基本实现

解决右侧高度过高的问题 解决方案&#xff1a;去掉右侧顶部和底部。 实现左侧菜单 最近文档&#xff0c;纯粹文档 我的文档&#xff0c;既包括文件夹也包括文件 共享文档&#xff0c;别人分享给我的 基本实现代码&#xff1a; 渲染效果&#xff1a; 简单优化 设置默认菜…...

vue中的nexttrick

Vue.js 是一个用于构建用户界面的渐进式框架&#xff0c;它允许开发者通过声明式的数据绑定来构建网页应用。在 Vue 中&#xff0c;nextTick 是一个非常重要的 API&#xff0c;它用于延迟回调的执行&#xff0c;直到下次 DOM 更新循环之后。 为什么使用 nextTick&#xff1f; …...

【BUG】已解决:ModuleNotFoundError: No module named ‘requests‘

ModuleNotFoundError: No module named ‘requests‘ 目录 ModuleNotFoundError: No module named ‘requests‘ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&a…...

深入理解JS中的发布订阅模式和观察者模式

发布/订阅模式(Publish/Subscribe)和观察者模式(Observer Pattern)在概念上非常相似,都是用于实现对象之间的松耦合通信。尽管它们在实现细节和使用场景上有所不同,但核心思想是相通的。 观察者模式 直接通信:在观察者模式中,观察者(Observer)直接订阅主题(Subject…...

网站IPv6支持率怎么检测?

在当今数字化的时代&#xff0c;IPv6的推广和应用已经成为网络发展的重要趋势。IPv6拥有更大的地址空间、更高的安全性和更好的性能&#xff0c;对于满足日益增长的网络需求至关重要。对于网站所有者和管理员来说&#xff0c;了解其网站对IPv6的支持率是评估网站性能和兼容性的…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

命令行关闭Windows防火墙

命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)​方法二:CMD命令…...