Selenium Web UI自动化测试:从入门到实战
引言
在当今快速迭代的软件开发周期中,自动化测试已成为保障产品质量、提升测试效率的核心手段之一。而针对Web应用的UI自动化测试,Selenium作为最流行的开源工具之一,凭借其跨浏览器、多语言支持(Python、Java、C#等)和强大的社区生态,成为测试工程师和开发者的首选。本文将详细介绍Selenium的核心功能、环境搭建、实战技巧及最佳实践,助你快速掌握Web UI自动化测试的核心技能。
一、Selenium简介与环境搭建
1. Selenium的组成
-
Selenium WebDriver:核心组件,通过浏览器驱动直接操作浏览器,模拟用户行为。
-
Selenium Grid:支持分布式测试,在多台机器上并行运行测试用例。
-
Selenium IDE:浏览器插件,支持录制和回放测试脚本(适合快速原型设计)。
2. 环境搭建(以Python为例)
-
安装Python
访问Python官网下载并安装Python,配置环境变量。 -
安装Selenium库
bash
复制
pip install selenium
-
下载浏览器驱动
-
Chrome:下载ChromeDriver,版本需与本地Chrome浏览器匹配。
-
将驱动文件路径添加到系统环境变量,或直接在代码中指定路径。
-
-
验证环境
python
复制
from selenium import webdriverdriver = webdriver.Chrome() # 若驱动在环境变量中,无需指定路径 driver.get("https://www.baidu.com") print(driver.title) driver.quit()
二、Selenium核心操作
1. 元素定位
Selenium提供8种元素定位方式,常用方法如下:
-
ID定位:
find_element(By.ID, "id_value") -
XPath定位:
find_element(By.XPATH, "//div[@class='example']") -
CSS选择器:
find_element(By.CSS_SELECTOR, ".class_name")
python
复制
from selenium.webdriver.common.by import Bysearch_input = driver.find_element(By.ID, "kw") search_button = driver.find_element(By.XPATH, "//input[@id='su']")
2. 常用操作
-
输入文本:
element.send_keys("text") -
点击元素:
element.click() -
获取文本:
element.text -
页面导航:
driver.get(url)、driver.back()、driver.forward()
3. 等待机制
-
隐式等待:全局等待,设置一次即可。
python
复制
driver.implicitly_wait(10) # 最多等待10秒
-
显式等待:针对特定条件灵活等待。
python
复制
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as ECelement = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "target_element")) )
三、实战案例:电商网站自动化测试
案例1:用户登录
python
复制
def test_login():driver.get("https://example.com/login")driver.find_element(By.ID, "username").send_keys("test_user")driver.find_element(By.ID, "password").send_keys("password123")driver.find_element(By.CSS_SELECTOR, ".login-btn").click()assert "Welcome" in driver.page_source
案例2:购物车操作
python
复制
def test_add_to_cart():driver.get("https://example.com/product/123")driver.find_element(By.XPATH, "//button[text()='Add to Cart']").click()WebDriverWait(driver, 10).until(EC.alert_is_present())alert = driver.switch_to.alertassert "added" in alert.textalert.accept()
四、高级技巧与最佳实践
1. 处理复杂场景
-
iframe切换:
python
复制
driver.switch_to.frame("iframe_id") # 操作iframe内元素 driver.switch_to.default_content() # 切回主文档 -
文件上传:
python
复制
driver.find_element(By.ID, "file_input").send_keys("/path/to/file.txt")
2. 使用Page Object模式
Page Object Model (POM) 将页面元素和操作封装成类,提升代码复用性和可维护性。
python
复制
class LoginPage:def __init__(self, driver):self.driver = driverself.username = (By.ID, "username")self.password = (By.ID, "password")self.login_btn = (By.CSS_SELECTOR, ".login-btn")def login(self, user, pwd):self.driver.find_element(*self.username).send_keys(user)self.driver.find_element(*self.password).send_keys(pwd)self.driver.find_element(*self.login_btn).click()
3. 集成测试框架
结合pytest或unittest管理测试用例,生成报告:
python
复制
import pytest@pytest.fixture
def browser():driver = webdriver.Chrome()yield driverdriver.quit()def test_homepage(browser):browser.get("https://example.com")assert "Home" in browser.title
4. 持续集成(CI)
通过Jenkins、GitHub Actions等工具实现自动化测试流水线:
yaml
复制
# GitHub Actions 示例 jobs:test:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: Run Selenium Testsrun: |pip install -r requirements.txtpytest tests/
五、常见问题与优化
-
元素定位失败
-
检查元素是否在iframe或Shadow DOM中。
-
使用相对XPath或CSS选择器避免依赖绝对路径。
-
-
跨浏览器兼容性
-
使用
WebDriverManager自动管理浏览器驱动版本。 -
在Selenium Grid中配置多浏览器测试。
-
-
提升执行速度
-
减少不必要的等待时间,优先使用显式等待。
-
启用浏览器无头模式(Headless):
python
复制
options = webdriver.ChromeOptions() options.add_argument("--headless") driver = webdriver.Chrome(options=options)
-
六、总结
Selenium作为Web UI自动化测试的标杆工具,其灵活性和扩展性使其成为测试领域的“瑞士军刀”。通过本文的学习,读者可掌握从环境搭建到复杂场景处理的完整流程,并结合最佳实践构建高效、稳定的自动化测试体系。未来可进一步探索:
-
移动端测试:Appium框架。
-
云测试平台:BrowserStack、Sauce Labs。
-
AI驱动的测试:应用机器学习优化元素定位与异常检测。
相关资源
-
Selenium官方文档
-
Pytest官方教程
-
Page Object模式详解
版权声明
本文遵循CC 4.0 BY-SA版权协议,转载请注明出处!
相关文章:
Selenium Web UI自动化测试:从入门到实战
引言 在当今快速迭代的软件开发周期中,自动化测试已成为保障产品质量、提升测试效率的核心手段之一。而针对Web应用的UI自动化测试,Selenium作为最流行的开源工具之一,凭借其跨浏览器、多语言支持(Python、Java、C#等)…...
【实战指南】用MongoDB存储文档和图片等大文件(Java实现)
一、前言 在现代应用开发中,经常需要处理和存储大量的文档、图片等大文件。传统的关系型数据库在处理这类大文件时,往往会面临性能瓶颈、存储成本高等问题。而 MongoDB 作为一款流行的 NoSQL 数据库,提供了 GridFS 规范,能够很好地解决大文件存储的问题。GridFS 可以将大文…...
Jetpack Compose 显示时间
Jetpack Compose 显示时间 介绍主体代码使用 介绍 在软件中实时显示时间 主体代码 import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStat…...
vue3中,通过获取路由上的token直接进入首页,跳过登录页面
1.需求 A系统想快速进入到B系统,但又不想输入账号密码,A系统的token与B系统共用token,因此在访问B系统就会在路径上携带token(https://magictool-box.com/login?token《token》),通过token直接进入B系统首…...
软考通关利器:中级软件设计师结构化开发核心考点
简介: 作为国家软考中级认证的核心科目,“软件设计师” 结构化开发能力是职业进阶的黄金敲门砖。本模块聚焦考试大纲高频考点,深度解析需求建模、结构化分析方法(SA/SD)、模块设计原则、数据流图(DFD&#…...
[思考记录]两则:宏观视角、理想化
#宏观视角# 昨天听金老师讲解了他初步整理的大模型宏观概念关系图,受益不少。图上不仅是涵盖了诸多概念,更厉害的应该在于把概念之间的关系进行了描述,更直观展现了概念是如何与其他概念相互作用的。帮助从整体的角度去理解,以及透…...
MySQL 性能优化方向
MySQL 性能优化是一个系统性的工作,涉及数据库设计、查询优化、索引优化、硬件配置等多个方面。以下是 MySQL 性能优化的主要方向和具体优化方案: 一、数据库设计优化 1. 合理设计表结构 规范化设计:避免数据冗余,确保数据一致性。适度反规范化:在查询频繁的场景下,适当…...
3-22 vector的使用详解---STL C++
C中的vector容器展开系统讲解,具体内容如下: 1. vector的定义和特性(基础概念) 讲解vector作为动态数组的核心特性:自动内存管理、动态扩容机制(倍增策略)对比普通数组:支持随机访…...
Collectors.toList / list 转 list
前言 略 Collectors.toList List<User> userList ...; List<Long> userIdList userList.stream().map(User::getUserId).collect(Collectors.toList());...
uniapp 和 webview 之间的通信
1.背景 应用使用了uniapp开发跨端应用,在uniapp中内嵌webview页面实现页面热更新效果,不需要用户单独重新安装软件即可实现页面的版本更新。 2.webview通知uniapp 在开发过程中我们难会遇到需要uniapp和webview来实现数据通信的场景,接下来…...
【Linux】Hadoop-3.4.1的伪分布式集群的初步配置
配置步骤 一、检查环境 JDK # 目前还是 JDK8 最适合 Hadoop java -version echo $JAVA_HOME Hadoop hadoop version echo $HADOOP_HOME 二、配置SSH免密登录 Hadoop需要通过SSH管理节点(即使在伪分布式模式下) sudo apt install openssh-server …...
【Java】深入了解下Java Bitset
【Java】深入了解下Java Bitset 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战 目录 【Java】深入了解下Java Bitset引言如果Java Bitset不是布尔数组,那它是什么…...
Linux CentOS7 安装 ffmpeg教程
官网:FFmpeg 操作 先用uname -a 查看内核版本,如果是 3.2.0或者以上就可以按照此办法来安装 cd /tmp wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz# 2. 解压 tar xvf ffmpeg-release-amd64-static.tar.xz# 3. 将…...
楼宇自控系统的结构密码:总线与分布式结构方式的差异与应用
在现代建筑中,为了实现高效、智能的管理,楼宇自控系统变得越来越重要。它就像建筑的 智能管家,可自动控制照明、空调、通风等各种机电设备,让建筑运行更顺畅,还能节省能源成本。而在楼宇自控系统里,有两种关…...
Fourier-Lerobot——把斯坦福人形动作策略iDP3封装进了Lerobot(含我司七月人形研发落地实践)
前言 近期在抠lerobot源码时,看到其封装了ALOHA ACT、diffusion policy、π0时,我就在想,lerobot其实可以再封装下idp3 我甚至考虑是否从我联合带的那十几个具身研究生中选几个同学做下这事,对他们也是很好的历练然当25年3.18日…...
系统架构设计知识体系总结
1.技术选型 1.什么是技术选型? 技术选型是指评估和选择在项目或系统开发中使用的最合适的技术和工具的过程。这涉及考虑基于其能力、特性、与项目需求的兼容性、可扩展性、性能、维护和其他因素的各种可用选项。技术选型的目标是确定与项目目标相符合、能够有效解…...
计划管理工具应该具备的能(甘特图)
在当今快节奏的项目管理环境中,高效地规划和跟踪项目进度是至关重要的。甘特图,作为项目管理领域的经典工具,以其直观的时间轴和任务分配方式,深受项目管理者的青睐。 随着数字化时代的到来,甘特图线上编辑器应运而生&…...
简单实用!百度AI + Raphael AI = 免费生图
简单实用!百度AI Raphael AI 免费生图 --  第一步:下载或截取一些好看的图片当参考图片 第二步:用百度AI描述你想要的图片&…...
2 相交链表
1 常规思路 比较两个链表的长度,然后让较短的链表走二者长度之差,此时两个链表就一样长了,开始用双指针遍历,如果有相等返回,没有返回null; 为了减少冗余代码,我们设置一个minCur和maxCur分别…...
2025-03-22 学习记录--C/C++-C 库函数 - getchar()
C 库函数 - getchar() ⭐️ C 标准库 - <stdio.h> (一)、函数声明 🍭 int getchar(void)从标准输入 stdin 获取一个字符(一个无符号字符)。 参数:🎀 NA 返回值:Ἰ…...
APM 仿真遥控指南
地面站开发了一段时间了,由于没有硬件,所以一直在 APM 模拟器中验证。我们已经实现了 MAVLink 消息接收和解析,显示无人机状态,给无人机发送消息,实现一键起飞,飞往指定地点,降落,返…...
如何防止大语言模型生成有害内容?技术与非技术手段解析
目录 如何防止大语言模型生成有害内容?技术与非技术手段解析 1. 技术手段 方法 1:使用内容过滤(Content Filtering) 方法 2:基于模型的有害内容检测(Toxicity Classification) 方法 3&#…...
BBR 和 CUBIC 对长肥管道的不同反应
有个关于 CUBIC(等一众 AIMD-based cc) 和 BBR 在长肥管道中的行为比较挺有趣,它们的表现竟然截然相反: CUBIC 流共存,RTT 越大,Goodput 越低;BBR 流共存,RTT 越大,Goodput 越高。 前一个被看…...
架构师面试(十九):IM 架构
问题 IM 系统从架构模式上包括 【介绍人模式】和 【代理人模式】。介绍人模式也叫直连模式,消息收发不需要服务端的参与,即客户端之间直连的方式;代理人模式也叫中转模式,消息收发需要服务端进行中转。 下面关于这两类模式描述的…...
Spring框架入门指南:从Hello World到IOC容器
第一章:Spring框架的介绍 1. Spring框架的概述 Spring是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。 Spring是于2003 年兴起的一个轻量级的Java开发框架&…...
嵌入式电路设计软件个人安装步骤分享
各位小伙伴大家好,今天给大家分享一个,电路设计软件的安装方法,希望对大家有所帮助。 一、下载【Multisim14.0安装包】: 链接:夸克网盘分享 提取码:kHSP 电脑安装Multisim14.0并且汉化 准备安装包以及汉化包双击“NI_Circuit_Design_Suite_14_0【海量免费资源:kebaiwan…...
git | 回退版本 并保存当前修改到stash,在进行整合。[git checkout | git stash 等方法 ]
目录 一些常见命令: git 回退版本 一、临时回退(不会修改历史,可随时回到当前版本) 方法1:git checkout HEAD~1 二、永久回退(改变分支指向) 方法2:git reset 1. 保留修改&am…...
学习笔记:黑马程序员JavaWeb开发教程(2025.3.22)
11.1 案例-员工管理-新增员工 考试完之后,时隔一个月再次运行项目,出现了报错: class lombok.javac.apt.LombokProcessor (in unnamed module 0x5d7f1e59) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironme…...
Java IO性能优化:字节流与缓冲流的对比与实战分析
引言 在Java开发中,文件读写和网络数据传输是高频操作。然而,许多开发者在使用FileInputStream、FileOutputStream等基础字节流时,常因忽略IO性能问题导致程序效率低下。本文将深入分析普通字节流与**缓冲字节流(BufferedInputSt…...
【Java SE】单例设计模式
参考笔记:深入理解Java设计模式:单例模式及其饿汉式与懒汉式的对比,-CSDN博客 目录 1.什么是设计模式 2.经典设计模式 3.单例设计模式(static属性/方法经典使用场景 ) 3.1 饿汉式单例模式 3.2 懒汉式单例模式 4.补充 1.什么…...
