Python使用Selenium进行Web自动化测试详解

目录

引言

一、Selenium简介

Selenium的核心组件

二、环境搭建

1. 安装Python

2. 安装Selenium库

3. 下载并配置浏览器驱动

三、基础用法

1. 启动浏览器

2. 定位页面元素

3. 元素操作

4. 等待元素加载

1. 测试目的

2. 测试步骤与代码实现

3. 注意事项

结论


引言

在软件开发过程中,自动化测试是提高效率、确保软件质量的关键环节。Selenium作为一款强大的Web自动化测试工具,因其跨浏览器兼容性、多语言支持以及高度的灵活性和可扩展性,成为业界广泛使用的工具之一。本文旨在详细介绍如何使用Python结合Selenium进行Web自动化测试,通过丰富的案例和详细的代码,帮助新手朋友快速上手。

一、Selenium简介

Selenium是一个用于Web应用程序自动化测试的工具集,它直接运行在浏览器中,就像真正的用户在操作一样。Selenium支持多种浏览器(如Chrome、Firefox、Safari、Edge等)和多种编程语言(如Java、Python、C#等),这使得它成为跨平台和跨语言的自动化测试解决方案。

Selenium的核心组件

Selenium主要包括以下几个核心组件:

  • Selenium WebDriver:WebDriver是Selenium的核心组件,负责直接与浏览器进行通信,控制浏览器执行各种操作。
  • Selenium IDE:一个用于录制和回放用户交互的浏览器插件,虽然它不如WebDriver强大,但对于简单的自动化测试任务非常有用。
  • Selenium Grid:一个用于分布式测试的工具,允许同时在多台机器上运行测试,提高测试效率。

二、环境搭建

1. 安装Python

确保你的计算机上已安装Python。Python可以从其官方网站下载并安装。安装完成后,在命令行中输入python --version来验证是否安装成功。

2. 安装Selenium库

使用pip命令安装Selenium库。在命令行中输入以下命令:

pip install selenium

3. 下载并配置浏览器驱动

Selenium需要与浏览器的驱动(如ChromeDriver、GeckoDriver等)配合工作。以下以Chrome为例说明如何下载并配置ChromeDriver:

访问ChromeDriver下载页面,根据你的Chrome浏览器版本下载对应版本的ChromeDriver。
将下载的ChromeDriver可执行文件解压,并将其路径添加到系统的PATH环境变量中,或者将其放在Python脚本所在的目录下。

三、基础用法

1. 启动浏览器

使用Selenium启动浏览器的基本代码如下:

from selenium import webdriver  # 创建Chrome浏览器的WebDriver实例  
driver = webdriver.Chrome()  # 打开网页  
driver.get('https://www.example.com')  # 关闭浏览器  
driver.quit()

2. 定位页面元素

Selenium提供了多种方法来定位页面元素,如ID、类名、标签名、XPath、CSS选择器等。以下是一些常用的定位方法:

# 使用ID定位  
element = driver.find_element_by_id("element_id")  # 使用XPath定位  
element = driver.find_element_by_xpath("//div[@class='example']")  # 使用CSS选择器定位  
element = driver.find_element_by_css_selector(".example")  # 使用类名定位(注意:这在新版Selenium中已不推荐使用)  
# element = driver.find_element_by_class_name("example")  # 使用标签名定位  
element = driver.find_element_by_tag_name("div")

3. 元素操作

定位到元素后,可以对其进行各种操作,如输入文本、点击按钮、获取文本等:

# 输入文本  
element.send_keys("Hello, Selenium!")  # 点击按钮  
button = driver.find_element_by_id("submit_button")  
button.click()  # 获取元素文本  
text = element.text

4. 等待元素加载

在Web自动化测试中,经常需要等待某个元素加载完成后再进行操作。Selenium提供了两种等待方式:显式等待和隐式等待。

from selenium.webdriver.common.by import By  
from selenium.webdriver.support.ui import WebDriverWait  
from selenium.webdriver.support import expected_conditions as EC  # 显式等待  
element = WebDriverWait(driver, 10).until(  EC.presence_of_element_located((By.ID, "element_id"))  
)  # 隐式等待(设置全局等待时间,对后续所有find_element方法生效)  
driver.implicitly_wait(10)  # 设置最大等待时间为10秒

四、实战案例:网站登录自动化测试

1. 测试目的

测试某网站的登录功能,包括以下几种情况:

  • 输入正确的用户名和密码,验证是否登录成功。
  • 输入正确的用户名但错误的密码,验证是否显示错误提示。
  • 输入错误的用户名但正确的密码(假设这种情况在大多数系统中不允许,但为演示完整性),验证是否显示错误提示。
  • 输入空的用户名和密码,验证是否显示错误提示。

2. 测试步骤与代码实现

首先,我们假设登录页面的URL是https://www.example.com/login,用户名和密码输入框的ID分别是username和password,登录按钮的ID是login_button,以及登录成功和错误提示的某些标识元素(这里我们假设登录成功会跳转到主页,错误提示会显示在某个ID为error_message的元素中)。

from selenium import webdriver  
from selenium.webdriver.common.keys import Keys  
from selenium.webdriver.common.by import By  
from selenium.webdriver.support.ui import WebDriverWait  
from selenium.webdriver.support import expected_conditions as EC  def test_login(driver, valid_username, valid_password):  # 打开登录页面  driver.get('https://www.example.com/login')  # 正确的用户名和密码  test_cases = [  (valid_username, valid_password, True),  # 预期登录成功  (valid_username, 'wrong_password', False),  # 预期显示错误  ('wrong_username', valid_password, False),  # 假设系统不允许这种情况,但为演示  ('', '', False)  # 空的用户名和密码  ]  for username, password, expect_success in test_cases:  # 清除输入框内容(如果有的话)  driver.find_element_by_id('username').clear()  driver.find_element_by_id('password').clear()  # 输入用户名和密码  driver.find_element_by_id('username').send_keys(username)  driver.find_element_by_id('password').send_keys(password)  # 点击登录按钮  driver.find_element_by_id('login_button').click()  # 根据预期结果验证  if expect_success:  # 预期登录成功,验证是否跳转到主页(这里以URL变化为例)  assert "https://www.example.com/home" in driver.current_url, "登录成功但未跳转到主页"  else:  # 预期登录失败,验证是否显示错误提示  try:  error_message = WebDriverWait(driver, 5).until(  EC.presence_of_element_located((By.ID, 'error_message'))  )  assert "error" in error_message.text.lower(), "登录失败但未显示错误提示"  except Exception as e:  print(f"登录失败验证失败: {e}")  assert False, "登录失败但未捕获到错误提示"  # 如果需要,可以在这里添加代码来重置测试环境(如清除cookies、重定向到登录页面等)  # 实例化WebDriver  
driver = webdriver.Chrome()  # 调用测试函数,假设有有效的用户名和密码  
test_login(driver, 'valid_user', 'valid_password')  # 关闭浏览器  
driver.quit()

3. 注意事项

  • 环境差异:不同机器和浏览器版本可能导致行为差异,特别是JavaScript执行速度和渲染差异。
  • 错误处理:在实际应用中,应该增加更全面的错误处理机制,比如处理元素未找到、页面加载超时等情况。
  • 数据驱动测试:对于复杂的测试场景,考虑使用数据驱动测试,将测试用例和数据分离,提高测试的可维护性和可扩展性。
  • 日志记录:在测试过程中记录详细的日志,有助于问题追踪和调试。

结论

通过Python结合Selenium进行Web自动化测试,可以大大提高测试效率和准确性。本文介绍了Selenium的基本用法,并通过一个实际的登录功能测试案例,展示了如何编写自动化测试脚本。对于新手来说,建议从简单的测试案例开始,逐步深入学习和实践,同时结合官方文档和社区资源,不断提升自己的技能水平。

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

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

相关文章

ViT笔记学习

1.VIT ViT原理讲解 ViT结合代码 1.3 ViT模型架构 我们先结合下面的动图来粗略地分析一下ViT的工作流程,如下: 将一张图片分成patches将patches铺平将铺平后的patches的线性映射到更低维的空间添加位置embedding编码信息将图像序列数据送入标准Transfor…

labview经验分享1-任意16进制字符类型匹配

系列文章目录 1、任意16进制字符类型匹配 文章目录 系列文章目录问题导入实现任意16进制字符类型匹配在这里插入图片描述 总结 问题导入 labveiw的字符串匹配,使用的是正则表达式,可以让我们很方便的对字符串进行字符处理操作。 但是某些情况下&#…

【python】Python实现XGBoost算法的详细理论讲解与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

encoding with ‘idna‘ codec failed (UnicodeError: label empty or too long)

今天在使用Flask连接mysql的时候,遇到了一个报错:encoding with ‘idna’ codec failed (UnicodeError: label empty or too long) 网上查了一下说是字符集的问题,然后尝试修改了一下字符集,结果还是不行。 最后去翻阅SQLAlchemy…

使用docker-compose运行kafka及验证(无需zookpeer)

前言:要求安装docker-compose kafka镜像版本:apache/kafka:3.8.0 可能存在镜像拉不下来的情况: 1、vim /etc/docker/daemon.json {"data-root":"/data/docker","registry-mirrors": ["https://docker.m…

力扣第 411 场周赛题解

3258. 统计满足 K 约束的子字符串数量 I 给你一个 二进制 字符串 s 和一个整数 k。 如果一个 二进制字符串 满足以下任一条件,则认为该字符串满足 k 约束: 字符串中 0 的数量最多为 k。字符串中 1 的数量最多为 k。 返回一个整数,表示 s …

【数据结构-哈希前缀】力扣2845. 统计趣味子数组的数目

给你一个下标从 0 开始的整数数组 nums ,以及整数 modulo 和整数 k 。 请你找出并统计数组中 趣味子数组 的数目。 如果 子数组 nums[l…r] 满足下述条件,则称其为 趣味子数组 : 在范围 [l, r] 内,设 cnt 为满足 nums[i] % mod…

JVM -垃圾回收器

本人在这篇文章中讲解了垃圾回收机制,这为前置知识 美团一面面经:Threadlocal(线程局部变量的原理)->内存泄漏问题->垃圾回收机制_threadlocal回收-CSDN博客 首先对前置知识漏洞做一个补充:ja…

open Euler22.03系统安装宝塔面板

环境:华为云open Euler22.03操作系统 配置:2核4G 1、安装宝塔面板。 登录弹性云服务器。 执行以下命令,下载并安装宝塔面板。 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh &&…

STM32裸机和RTOS中的线程安全问题及STM32cubeMX中的线程安全策略

STM32线程安全问题 术语“线程” 和“多线程” 适用于裸机和基于RTOS的应用程序,线程安全问题并不只存在于基于RTOS的应用程序中;裸机应用程序中也存在这个问题,在裸机应用程序中,中断服务程序允许调用C库函数。线程安全问题可能…

Python实现水果忍者(开源)

一、整体介绍: 1.1 前言: 游戏代码基于Python制作经典游戏案例-水果忍者做出一些改动,优化并增加了一些功能。作为自己Python阶段学习的结束作品,文章最后有源码链接。 1.2 Python主要知识: (1&#xf…

Python爬虫——爬取某网站的视频

爬取视频 本次爬取,还是运用的是requests方法 首先进入此网站中,选取你想要爬取的视频,进入视频播放页面,按F12,将网络中的名称栏向上拉找到第一个并点击,可以在标头中,找到后续我们想要的一些…

qt-15综合实例(电子时钟)-多态重写鼠标单击和移动事件

综合实例-电子时钟 知识点digiclock.hdigiclock.cppmain.cpp运行图 知识点 setWindowOpacity(0.5);//设置窗体透明度 QTimer* Timer new QTimer(this);//新建一个定时器 connect(Timer,SIGNAL(timeout()),this,SLOT(ShowTime())); Timer->start(1000);//启动定时器 digic…

稚晖君发布5款全能人形机器人,开源创新,全能应用

8月18日,智元机器人举行“智元远征 商用启航” 2024年度新品发布会,智元联合创始人彭志辉主持并发布了“远征”与“灵犀”两大系列共五款商用人形机器人新品——远征A2、远征A2-W、远征A2-Max、灵犀X1及灵犀X1-W,并展示了在机器人动力、感知、…

猫头虎分享:练习提示词Prompt有什么好方法?提高Prompt水平和质量

猫头虎是谁? 大家好,我是 猫头虎,别名猫头虎博主,擅长的技术领域包括云原生、前端、后端、运维和AI。我的博客主要分享技术教程、bug解决思路、开发工具教程、前沿科技资讯、产品评测图文、产品使用体验图文、产品优点推广文稿、…

深扒大模型微调密码 - 从入门到技术小白都能看懂的神操作

朋友们,你们有没有听说过"大模型"和"微调"这两个概念呢?别着急,我们今天就来好好聊一聊! 想象一下,你有一个非常勤奋的小助理,它会尽最大努力帮你完成各种任务。不过有时候,它的知识储备和能力肯定有限,所以你得适时给它一些专门的…

树莓派5 笔记25:第一次启动与配置树莓派5_8G

今日继续学习树莓派5 8G:(Raspberry Pi,简称RPi或RasPi) 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 与 python 版本如下: 今日购得了树莓派5_8G版本,性能是同运…

springboot航班进出港管理系统--论文源码调试讲解

第2章 开发环境与技术 本章节对开发航班进出港管理系统管理系统需要搭建的开发环境,还有航班进出港管理系统管理系统开发中使用的编程技术等进行阐述。 2.1 Java语言 Java语言是当今为止依然在编程语言行业具有生命力的常青树之一。Java语言最原始的诞生&#xff…

SQL每日一练-0815

今日SQL题难度:🌟☆☆☆☆☆☆☆☆☆ 1、题目要求 计算每个产品类别在每个月的总销售额和总销量。找出每个月销售额最高的产品类别,显示类别名称、销售月份、总销售额和总销量。 2、表和虚拟数据 现有两个表:Products 和…

牛客网习题——通过C++实现

一、目标 实现下面4道练习题增强C代码能力。 1.求123...n_牛客题霸_牛客网 (nowcoder.com) 2.计算日期到天数转换_牛客题霸_牛客网 (nowcoder.com) 3.日期差值_牛客题霸_牛客网 (nowcoder.com) 4.打印日期_牛客题霸_牛客网 (nowcoder.com) 二、对目标的实现 1.求123...n_…