UI自动化测试案例——简单的Google搜索测试
以下是一个UI自动化测试的经典案例:
import unittest
from selenium import webdriverclass GoogleSearchTest(unittest.TestCase):def setUp(self):# 创建Chrome浏览器实例self.driver = webdriver.Chrome()self.driver.maximize_window() # 最大化浏览器窗口def tearDown(self):self.driver.quit() # 关闭浏览器实例def test_google_search(self):self.driver.get("https://www.google.com") # 打开Google首页self.assertEqual(self.driver.title, "Google") # 校验页面标题是否为"Google"search_box = self.driver.find_element_by_name("q") # 找到搜索框元素search_box.send_keys("Selenium WebDriver") # 在搜索框中输入"Selenium WebDriver"search_box.submit() # 提交搜索请求search_results = self.driver.find_elements_by_css_selector("div.g") # 找到搜索结果元素列表self.assertGreater(len(search_results), 0) # 校验搜索结果列表是否不为空first_result = search_results[0] # 取出第一个搜索结果元素first_result_link = first_result.find_element_by_tag_name("a") # 找到第一个搜索结果元素中的链接元素first_result_link.click() # 点击链接self.assertIn("Selenium - Web Browser Automation", self.driver.title) # 校验新页面标题是否包含"Selenium - Web Browser Automation"
具体的测试步骤如下:
- 打开Google首页
- 校验页面标题是否为"Google"
- 在搜索框中输入"Selenium WebDriver"
- 提交搜索请求
- 校验搜索结果列表是否不为空
- 取出第一个搜索结果元素
- 找到第一个搜索结果元素中的链接元素
- 点击链接
- 校验新页面标题是否包含"Selenium - Web Browser Automation"
这个测试案例使用了Python的unittest测试框架和Selenium WebDriver库。在测试开始前,会在setUp()方法中创建Chrome浏览器实例,并将浏览器窗口最大化。在测试结束后,会在tearDown()方法中关闭浏览器实例。
测试方法test_google_search()中,首先打开Google首页,然后校验页面标题是否为"Google"。接着,在搜索框中输入"Selenium WebDriver",并提交搜索请求。然后,通过CSS选择器找到搜索结果元素列表,并校验列表是否不为空。接着,取出第一个搜索结果元素,并找到其中的链接元素,点击链接。最后,校验新页面标题是否包含"Selenium - Web Browser Automation"。
在测试过程中,如果有任何一个断言失败,测试框架会抛出AssertionError异常,测试将会失败。如果所有断言都通过,测试将会通过。
接下来我们来分析一下这个测试案例的代码。
首先,在setUp()方法中,我们创建了一个Chrome浏览器实例,并将浏览器窗口最大化:
def setUp(self):# 创建Chrome浏览器实例self.driver = webdriver.Chrome()self.driver.maximize_window() # 最大化浏览器窗口
这里我们使用了Selenium WebDriver库中的webdriver.Chrome()方法来创建Chrome浏览器实例。然后,通过调用maximize_window()方法,将浏览器窗口最大化。
在tearDown()方法中,我们关闭了浏览器实例:
def tearDown(self):self.driver.quit() # 关闭浏览器实例
这里我们使用了Selenium WebDriver库中的quit()方法来关闭浏览器实例。
在test_google_search()方法中,我们执行了一个完整的Google搜索的UI自动化测试:
def test_google_search(self):self.driver.get("https://www.google.com") # 打开Google首页self.assertEqual(self.driver.title, "Google") # 校验页面标题是否为"Google"search_box = self.driver.find_element_by_name("q") # 找到搜索框元素search_box.send_keys("Selenium WebDriver") # 在搜索框中输入"Selenium WebDriver"search_box.submit() # 提交搜索请求search_results = self.driver.find_elements_by_css_selector("div.g") # 找到搜索结果元素列表self.assertGreater(len(search_results), 0) # 校验搜索结果列表是否不为空first_result = search_results[0] # 取出第一个搜索结果元素first_result_link = first_result.find_element_by_tag_name("a") # 找到第一个搜索结果元素中的链接元素first_result_link.click() # 点击链接self.assertIn("Selenium - Web Browser Automation", self.driver.title) # 校验新页面标题是否包含"Selenium - Web Browser Automation"
首先,我们打开了Google首页,并校验了页面标题是否为"Google":
self.driver.get("https://www.google.com") # 打开Google首页
self.assertEqual(self.driver.title, "Google") # 校验页面标题是否为"Google"
这里我们使用了Selenium WebDriver库中的get()方法来打开Google首页,然后使用unittest框架中的assertEqual()方法来校验页面标题是否为"Google"。
接下来,我们找到了搜索框元素,并在搜索框中输入了"Selenium WebDriver":
search_box = self.driver.find_element_by_name("q") # 找到搜索框元素
search_box.send_keys("Selenium WebDriver") # 在搜索框中输入"Selenium WebDriver"
search_box.submit() # 提交搜索请求
这里我们使用了Selenium WebDriver库中的find_element_by_name()方法来找到搜索框元素,然后使用send_keys()方法来在搜索框中输入关键字,最后使用submit()方法来提交搜索请求。
然后,我们找到了搜索结果元素列表,并校验了列表是否不为空:
search_results = self.driver.find_elements_by_css_selector("div.g") # 找到搜索结果元素列表
self.assertGreater(len(search_results), 0) # 校验搜索结果列表是否不为空
这里我们使用了Selenium WebDriver库中的find_elements_by_css_selector()方法来找到搜索结果元素列表,然后使用unittest框架中的assertGreater()方法来校验列表长度是否大于0。
接着,我们取出了第一个搜索结果元素,并找到了其中的链接元素,并点击了链接:
first_result = search_results[0] # 取出第一个搜索结果元素
first_result_link = first_result.find_element_by_tag_name("a") # 找到第一个搜索结果元素中的链接元素
first_result_link.click() # 点击链接
这里我们使用了Python的列表索引和Selenium WebDriver库中的find_element_by_tag_name()方法来取出第一个搜索结果元素,并找到其中的链接元素。然后,使用click()方法来点击链接。
最后,我们校验了新页面标题是否包含"Selenium - Web Browser Automation":
self.assertIn("Selenium - Web Browser Automation", self.driver.title) # 校验新页面标题是否包含"Selenium - Web Browser Automation"
这里我们使用了unittest框架中的assertIn()方法来校验页面标题是否包含指定的文本。
总的来说,这个测试案例很简单,但是覆盖了UI自动化测试的基本流程和常用操作,适合初学者练习。
相关文章:
UI自动化测试案例——简单的Google搜索测试
以下是一个UI自动化测试的经典案例: import unittest from selenium import webdriverclass GoogleSearchTest(unittest.TestCase):def setUp(self):# 创建Chrome浏览器实例self.driver webdriver.Chrome()self.driver.maximize_window() # 最大化浏览器窗口def t…...
C++之虚函数原理
对象数据和函数的存储方式 注意说的是对象。 C中的对象存储方式是 每个对象占用的存储空间只是该对象的数据部分(虚函数指针和虚基类指针也属于数据部分),函数属于公共部分。 虚函数表 虚函数是通过虚函数表实现的。 C实现虚函数的方法是…...
Windows Information Protection(WIP)部署方案
目录 前言 一、方案准备工作 1、确定哪些数据需要保护 2、选择合适的加密方式...
细说Hibernate的缓存机制
Hibernate 的缓存机制主要包括一级缓存和二级缓存。 1. 一级缓存(Session 缓存): 一级缓存是 Hibernate 的 Session 级别的缓存,与每个 Session 对象相关联。当您通过 Session 对象执行查询、保存或更新操作时,Hibern…...
初识C++之线程库
目录 一、C中的线程使用 二、C的线程安全问题 1. 加锁 2. 变为原子操作 3. 递归里面的锁 4. 定时锁 5. RAII的锁 三、条件变量 1. 为什么需要条件变量 2. 条件变量的使用 2.1 条件变量的相关函数 2.2 wait函数 一、C中的线程使用 线程的概念在linux中的线程栏已经…...
ChatGLM-LLaMA-chinese-insturct 学习记录(含LoRA的源码理解)
ChatGLM-LLaMA-chinese-insturct 前言一、实验记录1.1 环境配置1.2 代码理解1.2.1 LoRA 1.4 实验结果 二、总结 前言 介绍:探索中文instruct数据在ChatGLM, LLaMA等LLM上微调表现,结合PEFT等方法降低资源需求。 Github: https://github.com/27182812/Ch…...
JuiceFS-K8s部署
目录 1、部署JuiceFS-CSI驱动2、创建OBS认证信息Secret3、创建存储类4、创建PVC--PVC创建时会自动创建PV5、创建测试Pod--测试Pod创建容器内是否挂载成功 官网文档地址:https://juicefs.com/docs/zh/csi/introduction/ 1、部署JuiceFS-CSI驱动 部署yaml如下&#x…...
2023最新版本Camtasia电脑录屏软件好不好用?
在当今数字化时代,屏幕录制成为了许多用户制作教学视频、演示文稿、游戏攻略等内容的首选。本文将为您介绍几款常用的电脑录屏软件,包括Camtasia、OBS Studio、Bandicam等,并对其进行功能和用户体验方面的比较,同时给出10款电脑录…...
第三章 Linux 初步
第三章 Linux 初步 一、 基本操作 ①登录: Linux 是多用户系统,必须用正确的用户名和口令登录后才能 进入 Linux Shell 提示符状态。 默认的文本界面 Shell 提示符有两种: •root 用户登录后的提示符: # •普通用户登录后的…...
linux环境安装使用mysql详解
01-安装MySQL并启动 1.1 环境准备 # 1.卸载mariadb,否则安装mysql会出现冲突 (1).执行命令rpm -qa | grep mariadb 会列出所有被安装的mariadb rpm 包; (2).执行命令rpm -e --nodeps mariadb-libs-5.5.56…...
SUNTANS模型学习(9)——学习Tidal forcing算例
学习Tidal forcing算例 简介网格配置与地形定解条件设置初始条件设置边界条件设置开边界处的通量计算(OpenBoundaryFluxes)开边处的速度、水位(BoundaryVelocities) 其它参数配置模拟结果 简介 SUNTANS中 tidal forcing 算例的全…...
力扣解法汇总1010. 总持续时间可被 60 整除的歌曲
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接: 力扣 描述: 在歌曲列表中,第 i 首歌曲的持续时间为 time[i] 秒。 返回其总持…...
利用老毛桃pe启动U盘启动ubuntu.iso,完成ubuntu系统的安装
1.双U盘,一个是老毛桃pe启动盘,可以启动grub4dos,加载了run模块,很好用(尤其是对不熟悉grub的小白) 2.大容量U盘存放ubuntu-desktop-i386.iso,U盘的格式是ntfs格式(其实这个不好&am…...
分享2个教学视频录制的方法!
案例:如何录制教学视频? 【我是一名老师,我想录制一些教学视频发布在网络平台上,但是我不知道如何操作。有没有人知道录制教学视频需要什么工具?如何录制?】 随着在线教育的普及,越来越多的教…...
「SQL面试题库」 No_63 报告的记录 II
🍅 1、专栏介绍 「SQL面试题库」是由 不是西红柿 发起,全员免费参与的SQL学习活动。我每天发布1道SQL面试真题,从简单到困难,涵盖所有SQL知识点,我敢保证只要做完这100道题,不仅能轻松搞定面试࿰…...
【事务】怎么去理解事务?
1、什么是事务? 事务是指作为单个逻辑工作单元执行的一系列操作,这些操作要么全做,要么全不做,是一个不可分割的工作单元。 2、事务具有哪些特性? 一个逻辑工作单元要成为事务,在关系型数据库管理系统中…...
camunda流程变量如何使用
Camunda是一个流程引擎,它支持在流程执行期间存储和操作流程变量。流程变量是一个值或对象,可以与Camunda中的流程实例、任务或执行相关联。 流程变量在Camunda中有很多用途。以下是一些常见的用途: 1、传递数据:流程变量可以用于…...
CMIP6:WRF模式动力降尺度、单点降尺度、统计方法区域降尺度
专题一 CMIP6中的模式比较计划 1.1 GCM介绍 1.2 相关比较计划介绍 专题二数据下载 2.1方法一:手动人工 利用官方网站 2.2方法二:自动 利用Python的命令行工具 2.3方法三:半自动购物车 利用官方网站 2.4 裁剪netCDF文件 …...
2023建筑设计师们有哪些好用的AI设计工具?
目前,建筑师要么单独工作,要么团队合作来完成设计过程,这可能需要数月甚至数年的时间。设计和准备用于开发的建筑物可能需要很长时间,有时甚至数年。一些比较繁琐的步骤可以自动化,但整个过程仍然需要大量的人工和时间…...
mysql主从复制与读写分离
mysql主从复制与读写分离 MySQL主从复制是一种常见的数据复制技术,用于将一个MySQL数据库服务器的数据复制到其他服务器上。 单台mysql在安全性,高并发方面都无法满足实际需求 配置多台主从数据库服务器以实现读写分离 读写分离,主数据库的…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...
