深入探索Selenium自动化测试:基础、代码实战与最佳实践【第90篇—Selenium自动化测试】

文章目录

  • 深入探索Selenium自动化测试:基础、代码实战与最佳实践
    • 什么是Selenium?
    • 安装Selenium
    • 基础用法
      • 启动浏览器
      • 查找元素
      • 操作元素
    • 代码实战:模拟登录
    • 进阶用法
      • 等待元素出现
      • 处理弹窗
      • 执行JavaScript
    • 高级应用:Selenium Grid
      • 启动Selenium Grid Hub
      • 启动Selenium Grid节点
      • 编写并运行分布式测试
    • 与测试框架整合:Selenium和pytest
      • 安装pytest
      • 编写测试用例
      • 运行测试用例
      • 生成测试报告
    • 高效调试:使用Selenium调试技巧
      • 1. 添加日志输出
      • 2. 手动暂停
      • 3. 使用浏览器开发者工具
      • 4. 截图
      • 5. 异常处理
      • 6. 执行JavaScript
      • 7. 使用断点调试器
    • 最佳实践和性能优化
      • 1. 使用显式等待
      • 2. 页面对象模型(Page Object Model)
      • 3. 避免硬等待
      • 4. 并行执行测试
      • 5. 避免频繁的浏览器启动和关闭
      • 6. 配置浏览器选项
      • 7. 定期清理浏览器缓存
    • 安全性注意事项
      • 1. 不要硬编码敏感信息
      • 2. 谨慎处理截图和日志
      • 3. 使用安全的浏览器配置
      • 4. 使用安全的传输方式
      • 5. 定期审查和更新依赖
      • 6. 使用测试环境
      • 7. 访问控制
    • 持续集成与部署(CI/CD)
      • 1. 选择合适的CI/CD工具
      • 2. 创建自动化测试任务
      • 3. 配置测试环境
      • 4. 执行自动化测试
      • 5. 集成静态分析和代码检查
      • 6. 集成通知和报告
      • 7. 触发部署
      • 8. 定期清理测试环境
  • 总结:

深入探索Selenium自动化测试:基础、代码实战与最佳实践

在Web开发和测试领域,自动化测试工具的使用变得越来越重要。Selenium是一款强大的自动化测试工具,可以用于模拟用户在浏览器中的操作。本文将介绍Selenium的基础知识,并通过代码实例演示如何使用Selenium进行自动化操作浏览器。

image-20240220131020705

什么是Selenium?

Selenium是一个用于自动化浏览器的开源工具集,支持多种浏览器(Chrome、Firefox、Edge等)和多种编程语言(Java、Python、C#等)。它允许开发人员模拟用户在浏览器中的操作,如点击按钮、填写表单、导航等。

安装Selenium

首先,我们需要安装Selenium。如果你使用Python,可以通过以下命令安装:

pip install selenium

基础用法

启动浏览器

from selenium import webdriver

# 创建Chrome浏览器驱动
driver = webdriver.Chrome()

# 打开网页
driver.get("https://www.example.com")

# 关闭浏览器
driver.quit()

查找元素

Selenium提供了丰富的方法来定位网页元素,如find_element_by_idfind_element_by_namefind_element_by_xpath等。

# 通过ID定位元素
element = driver.find_element_by_id("element_id")

# 通过XPath定位元素
element = driver.find_element_by_xpath("//div[@class='example']")

操作元素

可以对查找到的元素执行各种操作,如点击、输入文本等。

# 点击按钮
element.click()

# 输入文本
element.send_keys("Hello, Selenium!")

代码实战:模拟登录

让我们通过一个实际例子来演示Selenium的应用:模拟登录一个网站。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

# 创建Chrome浏览器驱动
driver = webdriver.Chrome()

# 打开登录页面
driver.get("https://www.example.com/login")

# 定位用户名和密码输入框,并输入信息
username = driver.find_element_by_name("username")
password = driver.find_element_by_name("password")

username.send_keys("your_username")
password.send_keys("your_password")

# 提交登录表单
password.send_keys(Keys.RETURN)

# 等待页面加载
driver.implicitly_wait(10)

# 打印当前页面标题
print("Logged in - Title:", driver.title)

# 关闭浏览器
driver.quit()

这个例子演示了如何使用Selenium模拟用户在登录页面的操作,输入用户名和密码,然后提交登录表单。

进阶用法

除了基本用法外,Selenium还提供了一些进阶的功能,如等待元素出现、处理弹窗、执行JavaScript等。让我们通过代码实例进一步了解这些功能。

等待元素出现

在实际应用中,页面元素可能需要一些时间才能加载完成。使用等待功能可以解决这个问题,确保在进行操作之前元素已经出现。

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, "example_element"))
)

# 执行操作
element.click()

处理弹窗

有时,浏览器中会出现弹窗,需要使用Selenium处理。例如,下面的代码演示了如何处理一个简单的JavaScript提示框:

# 等待弹窗出现
alert = WebDriverWait(driver, 10).until(EC.alert_is_present())

# 获取弹窗文本
print("Alert Text:", alert.text)

# 确认弹窗
alert.accept()

执行JavaScript

Selenium允许执行JavaScript代码,这对于处理一些特殊情况或操作不可见元素非常有用。

# 执行JavaScript代码
driver.execute_script("document.getElementById('hidden_element').style.display='block';")

高级应用:Selenium Grid

Selenium Grid是Selenium的一个组件,用于实现在多个机器上并行运行测试。这对于大规模测试和跨浏览器测试非常有用。下面是一个简单的Selenium Grid示例。

启动Selenium Grid Hub

首先,你需要启动Selenium Grid Hub,该Hub将负责协调所有测试执行的节点。

java -jar selenium-server-standalone.jar -role hub

启动Selenium Grid节点

然后,你可以启动多个Selenium Grid节点,每个节点代表一个浏览器实例。

java -Dwebdriver.chrome.driver=chromedriver.exe -jar selenium-server-standalone.jar -role node -hub http://localhost:4444/grid/register

编写并运行分布式测试

现在,你可以编写测试代码,并通过指定Grid Hub的地址运行测试,测试将分布式执行在不同的节点上。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

# 指定浏览器和Grid Hub地址
capabilities = DesiredCapabilities.CHROME.copy()
driver = webdriver.Remote(command_executor='http://localhost:4444/wd/hub', desired_capabilities=capabilities)

# 进行测试操作
driver.get("https://www.example.com")
element = driver.find_element_by_name("search")
element.send_keys("Selenium Grid")
element.send_keys(Keys.RETURN)

# 打印页面标题
print("Page Title:", driver.title)

# 关闭浏览器
driver.quit()

通过Selenium Grid,你可以充分利用多个机器资源,提高测试的效率和可靠性。

与测试框架整合:Selenium和pytest

在实际的自动化测试中,通常会结合测试框架来组织和运行测试用例,其中pytest是一个常用的Python测试框架。下面演示如何将Selenium与pytest整合,以更好地管理测试用例和生成测试报告。

安装pytest

首先,确保你已经安装了pytest。你可以通过以下命令进行安装:

pip install pytest

编写测试用例

创建一个pytest测试文件,例如test_selenium.py,并编写测试用例。

import pytest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

@pytest.fixture
def browser():
    driver = webdriver.Chrome()
    yield driver
    driver.quit()

def test_search_on_example(browser):
    browser.get("https://www.example.com")
    element = browser.find_element_by_name("search")
    element.send_keys("Selenium with pytest")
    element.send_keys(Keys.RETURN)
    assert "Search Results" in browser.title

运行测试用例

在项目根目录下运行以下命令,pytest将自动发现并执行你的测试用例:

pytest test_selenium.py

生成测试报告

可以使用pytest的插件pytest-html来生成漂亮的HTML测试报告。首先安装插件:

pip install pytest-html

然后运行测试并生成报告:

pytest --html=report.html test_selenium.py

打开生成的report.html文件,你将看到详细的测试结果和统计信息。

高效调试:使用Selenium调试技巧

在开发和维护自动化测试脚本时,调试是一个不可避免的环节。以下是一些使用Selenium时的调试技巧,帮助你更快地发现和解决问题。

1. 添加日志输出

在测试脚本中添加日志输出,记录关键步骤的执行情况和变量的值。这样有助于在执行过程中追踪问题。

import logging

logging.basicConfig(level=logging.INFO)

# 在关键步骤添加日志输出
logging.info("Navigating to the website")
driver.get("https://www.example.com")

2. 手动暂停

在脚本执行的特定位置插入time.sleep,以便在需要时手动检查浏览器的状态。

import time

# 在需要暂停的地方插入sleep
time.sleep(10)  # 暂停10秒

3. 使用浏览器开发者工具

在脚本执行时,通过浏览器开发者工具检查元素、执行JavaScript等操作,可以帮助你更深入地了解页面和定位问题。

4. 截图

在发生问题的地方添加截图功能,以便后续分析。Selenium提供了截图方法:

driver.save_screenshot("screenshot.png")

5. 异常处理

在关键操作中添加异常处理,捕获可能发生的异常并记录日志。

try:
    element = driver.find_element_by_id("example_element")
    element.click()
except Exception as e:
    logging.error(f"Error occurred: {e}")

6. 执行JavaScript

使用execute_script方法在脚本中执行JavaScript代码,以便在需要时调试或修改页面状态。

driver.execute_script("console.log('Hello from JavaScript!');")

7. 使用断点调试器

一些集成开发环境(IDE)支持在Python代码中设置断点,这样你可以逐步执行代码并检查变量。

这些调试技巧可以根据具体情况和问题进行灵活组合使用,帮助你更快速、有效地调试Selenium脚本。通过不断优化调试方法,你将更加熟练地处理各种自动化测试中可能遇到的问题。

最佳实践和性能优化

在使用Selenium进行自动化测试时,一些最佳实践和性能优化可以提高测试脚本的可维护性和执行效率。

1. 使用显式等待

替代隐式等待,使用显式等待(WebDriverWait)可以更加灵活地等待特定条件的出现,而不是等待固定时间。这有助于提高脚本的稳定性。

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, "example_element"))
)

2. 页面对象模型(Page Object Model)

使用页面对象模型将页面的元素和操作封装到单独的类中,提高代码的可维护性和可重用性。

class LoginPage:
    def __init__(self, driver):
        self.driver = driver

    def login(self, username, password):
        username_field = self.driver.find_element_by_name("username")
        password_field = self.driver.find_element_by_name("password")

        username_field.send_keys(username)
        password_field.send_keys(password)
        password_field.submit()

3. 避免硬等待

尽量避免使用硬等待(time.sleep)来等待页面加载完成,而是使用等待机制等待特定元素的出现。

4. 并行执行测试

对于大型测试套件,考虑使用并行执行测试,这可以显著缩短测试执行时间。Selenium Grid是一个适合并行执行测试的工具。

5. 避免频繁的浏览器启动和关闭

浏览器的启动和关闭是相对昂贵的操作,尽量避免在每个测试用例中都进行浏览器的启动和关闭。考虑在测试套件的开始和结束时执行一次。

6. 配置浏览器选项

根据需要配置浏览器选项,例如禁用或启用浏览器的图片加载、设置浏览器分辨率等,以提高执行效率。

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--disable-images")
driver = webdriver.Chrome(chrome_options=chrome_options)

7. 定期清理浏览器缓存

定期清理浏览器缓存可以确保测试执行的一致性,并减少可能的问题。

这些最佳实践和性能优化策略可以帮助你更好地组织和管理Selenium测试脚本,提高自动化测试的效率和稳定性。在实际项目中,结合具体需求和场景,选择适合的优化策略。

安全性注意事项

在使用Selenium进行自动化测试时,特别是在处理敏感信息和与真实环境交互时,需要注意一些安全性方面的问题。

1. 不要硬编码敏感信息

避免在代码中硬编码敏感信息,如用户名、密码等。考虑使用配置文件、环境变量或专门的安全存储来管理这些信息。

2. 谨慎处理截图和日志

当测试失败时,生成的截图和日志可能包含敏感信息。确保在实际运行时合理地处理这些信息,例如在生成报告时过滤或去除敏感信息。

3. 使用安全的浏览器配置

在自动化测试中,禁用浏览器的弹出窗口、启用安全策略、以及限制访问本地文件等安全配置都是很重要的。

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--disable-popup-blocking")
chrome_options.add_argument("--disable-local-file-access")

4. 使用安全的传输方式

确保在与服务端进行通信时使用安全的传输方式,例如使用HTTPS。在处理敏感数据时,避免使用不安全的连接方式。

5. 定期审查和更新依赖

定期审查和更新Selenium及其相关库,以保持系统的安全性。及时应用安全更新,避免使用已知的有安全隐患的版本。

6. 使用测试环境

在测试中使用专门的测试环境,避免在生产环境中执行自动化测试。确保测试中的操作不会对生产环境造成不必要的影响。

7. 访问控制

确保只有授权人员能够访问和执行自动化测试脚本,以防止未经授权的访问和操纵。

综合考虑这些安全性注意事项,可以更好地确保自动化测试的安全性和可靠性。在处理敏感信息时,要谨慎对待,并采取适当的措施来降低潜在的风险。

持续集成与部署(CI/CD)

将Selenium自动化测试集成到持续集成与部署(CI/CD)流程中,可以使测试更加自动化、及时、可靠,有助于提高软件交付的质量和效率。

1. 选择合适的CI/CD工具

选择一个适合你项目的CI/CD工具,例如Jenkins、Travis CI、GitLab CI等。这些工具可以帮助你配置和管理自动化测试的执行流程。

2. 创建自动化测试任务

在CI/CD工具中创建一个自动化测试任务,配置任务的触发条件(如每次代码提交、定时触发等),以及构建、测试和部署的步骤。

3. 配置测试环境

确保CI/CD工具能够在一个干净的测试环境中执行自动化测试。这可能包括安装浏览器驱动、设置环境变量等。

4. 执行自动化测试

在CI/CD流程中配置自动化测试的执行,包括启动浏览器、执行测试用例、生成测试报告等。确保测试覆盖率和执行结果被记录。

5. 集成静态分析和代码检查

在CI/CD流程中集成静态代码分析工具和代码检查,以确保代码质量和风格符合规范。这有助于及早发现潜在问题。

6. 集成通知和报告

配置CI/CD工具发送通知,包括测试执行结果、代码覆盖率等信息。生成并存档测试报告,方便回溯和审查。

7. 触发部署

如果测试通过,触发部署流程。自动部署到测试环境、预生产环境或生产环境,确保软件的及时交付。

8. 定期清理测试环境

在CI/CD流程中添加任务,定期清理测试环境,防止环境状态的累积影响测试结果。

通过将Selenium自动化测试集成到CI/CD流程中,可以实现更高效、更自动化的软件开发和交付过程。这不仅有助于快速发现和修复问题,还提高了软件的稳定性和可维护性。

总结:

本文深入介绍了Selenium自动化测试的基础知识、代码实战以及相关的进阶和高级用法。通过学习Selenium的基本用法,我们了解了如何启动浏览器、查找元素、操作元素等基础操作。随后,通过实际的代码示例,我们演示了如何模拟登录、使用显式等待、处理弹窗、执行JavaScript等进阶用法。

进一步,我们学习了如何将Selenium与pytest测试框架整合,以及如何使用Selenium Grid实现测试的分布式执行。这使得我们能够更好地组织和管理测试用例,生成详细的测试报告,并在大型项目中提高测试效率。

文章还介绍了高效调试技巧,帮助开发者在脚本编写和执行过程中更容易发现和解决问题。接着,我们分享了一系列最佳实践和性能优化策略,以提高测试脚本的可维护性和执行效率。

最后,文章提到了Selenium在持续集成与部署(CI/CD)中的应用,强调了将自动化测试集成到软件开发的流程中的重要性。通过CI/CD工具的配置,我们可以实现自动化测试的触发、执行、报告生成,以及软件的自动部署。

综合来看,通过学习本文的内容,读者可以建立起对Selenium自动化测试全面而深入的理解,同时了解如何将其应用于实际项目,提高软件开发和交付的质量和效率。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

压缩感知常用的测量矩阵

测量矩阵的基本概念 在压缩感知(Compressed Sensing,CS)理论中,测量矩阵(也称为采样矩阵)是实现信号压缩采样的关键工具。它是一个通常为非方阵的矩阵,用于将信号从高维空间映射到低维空间&…

基于vue框架的环保知识普及平台设计与实现

项目:基于vue框架的环保知识普及平台设计与实现 目 录 摘要 I Abstract II 第1章 引言 1 1.1 研究的背景 1 1.2 目的和意义 1 1.3 设计思路 1 1.4 研究的主要内容 2 第2章 相关原理和技术 3 2.1 B/S 模式体系结构 3 2.2 Springboot技术 4 2.3 访问数据库…

“中国国安部紧急警告”!境外公司利用加密货币诱使人员非法采集空间数据!当心不慎成“帮凶”!

随着加密货币的普及,每天都有新的区块链项目出现,目前市场上已经有成千上万种不同的加密货币 一些项目可能因其名人光环、运作机制、出色的代币经济学、或是提供优良的服务而受到市场亲睐,但也有很多项目缺乏大众的关注,或是尚未有…

机器学习——强化学习作业

作业内容 成功降落在两个黄色旗子中间为成功,其他为失败 Policy Gradient方法 Actor-Critic方法 范例结果 baseline Policy Gradient实现

初阶数据结构之---顺序表和链表(C语言)

引言-线性表 线性表: 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构。线性表在逻辑上是线性结构,也就是说是连续的一条直线。但在物理上并不一定是连续的。线性表在物理上…

OSQP文档学习

OSQP官方文档 1 QSQP简介 OSQP求解形式为的凸二次规划: x ∈ R n x∈R^n x∈Rn:优化变量 P ∈ S n P∈S^n_ P∈Sn​:半正定矩阵 特征 (1)高效:使用了一种自定义的基于ADMM的一阶方法,只需…

【Flink精讲】Flink内核源码分析:命令执行入口

官方推荐per-job模式,一个job一个集群,提交时yarn才分配集群资源; 主要的进程:JobManager、TaskManager、Client 提交命令:bin/flink run -t yarn-per-job /opt/module/flink-1.12.0/examples/streaming/SocketWind…

什么是CODESYS开发系统

CODESYS是一种用于工业自动化领域的开发系统软件,提供了一个完整集成的开发环境。该软件由德国CODESYS GmbH(原 3S-Smart Software Solutions GmbH)公司开发,其最新版本为CODESYS V3。 CODESYS开发系统具有多种特性和优点。首先&a…

Linux内核解读

来自鹅厂架构师 作者:aurelianliu 工作过程中遇到的调度、内存、文件、网络等可以参考。 1.os运行态 X86架构,用户态运行在ring3,内核态运行在ring0,两个特权等级。 (1)内核、一些特权指令,例…

JS实现根据数组对象的某一属性排序

JS实现根据数组对象的某一属性排序 一、冒泡排序(先了解冒泡排序机制)二、根据数组对象的某一属性排序(引用sort方法排序) 一、冒泡排序(先了解冒泡排序机制) 以从小到大排序为例,冒泡排序的原…

typescript映射类型

ts映射类型简介 TypeScript中的映射类型(Mapped Type)是一种高级类型,它允许我们基于现有类型创建新的类型,同时对新类型的每个属性应用一个转换函数。通过使用映射类型,我们可以方便地对对象的属性进行批量操作&…

人工智能深度学习

目录 人工智能 深度学习 机器学习 神经网络 机器学习的范围 模式识别 数据挖掘 统计学习 计算机视觉 语音识别 自然语言处理 机器学习的方法 回归算法 神经网络 SVM(支持向量机) 聚类算法 降维算法 推荐算法 其他 机器学习的分类 机器…

文献速递:GAN医学影像合成--用生成对抗网络生成 3D TOF-MRA 体积和分割标签

文献速递:GAN医学影像合成–用生成对抗网络生成 3D TOF-MRA 体积和分割标签 01 文献速递介绍 深度学习算法在自然图像分析中的成功近年来已被应用于医学成像领域。深度学习方法已被用于自动化各种耗时的手动任务,如医学图像的分割和分类(G…

软件测试面试,大厂上岸究竟有什么秘诀?

最后,总结一下个人认为比较重要的知识点:接口自动化测试 :测试框架,多个有关联的接口的用例编写,用例的组织及存储,接口测试的覆盖率,RESTAssured 的封装等。UI 自动化测试 :iOS 和 …

【2024美赛】C题 Momentum in Tennis网球运动中的势头 25页中英文论文及Python代码

【2024美赛】C题 Momentum in Tennis网球运动中的势头 25页中文论文 1 题目 A题:2024MCM问题C:网球运动中的势头 在2023年温布尔登网球公开赛男子组决赛中,20岁的西班牙新星卡洛斯-阿尔卡拉斯击败了36岁的诺瓦克-德约科维奇。这是德约科维奇…

Hypervisor是什么

Hypervisor 通常指的是虚拟机监视器(VirtualMachine Monitor),它是一种软件或硬件,可以在物理服务器上创建和管理多个虚拟机(VirtualMachine)。 Hypervisor 提供了一个抽象层,将物理服务器的资源…

Nginx 配置详解

官网:http://www.nginx.org/ 序言 Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。从2004年发布至今,凭借开源的力量,已经接近成熟与完善。 Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务…

Git基础(22):创建私人令牌和下拉代码

如何创建令牌和拉取项目代码 创建一个令牌,这里以gitee为例,注意将生成的令牌复制保存下拉 打开git bash 窗口,使用命令拉取项目 git clone https://oauth2:你的令牌项目地址(不要带https) #示例 git clone https://oauth2:845579xxxxxxxxx…

A Survey for Foundation Models in Autonomous Driving

摘要 **基础模型(foundation models)**的出现彻底改变了自然语言处理和计算机视觉领域,为它们在自动驾驶(AD)中的应用铺平了道路。本调查对40多篇研究论文进行了全面回顾,展示了基础模型在增强AD中的作用。…

error Error: certificate has expired

解决方案: yarn config set "strict-ssl" false -g 我开发的chatgpt网站: https://chat.xutongbao.top