selenium之文件下载

Selenium 自动化测试:轻松搞定文件下载

在 Web 自动化测试中,经常会遇到需要验证文件下载功能的场景。例如,测试报告的导出、用户上传文件的下载、PDF 文档的生成与下载等等。Selenium 本身并没有直接处理文件下载的内置方法,但我们可以通过一些巧妙的配置和技巧来轻松实现文件下载的自动化测试。

本文将深入探讨在使用 Selenium 进行自动化测试时,如何处理文件下载,让你能够有效地验证 Web 应用程序的文件下载功能。

为什么 Selenium 本身不直接处理文件下载?

Selenium 的主要职责是驱动浏览器进行交互,模拟用户的行为。而文件的下载通常是由浏览器自身处理的,涉及到操作系统的文件系统。Selenium 无法直接干预浏览器底层的下载过程和文件保存行为。

处理文件下载的常见策略

虽然 Selenium 本身不直接处理,但我们可以通过配置浏览器行为或借助其他工具来间接实现文件下载的自动化测试。

配置浏览器设置,实现自动下载到指定目录

这是最常用且推荐的方法。通过修改浏览器的配置,我们可以指示浏览器在下载文件时,自动保存到我们预先指定的目录,而无需弹出“另存为”对话框。

可以看到,执行下面代码的时候;当前的目录会创建一个downloads文件夹;并且里面存放下载的文件

import time, os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Serviceclass browser_download:def __init__(self, path, options):self.path = pathself.service = Service(path)self.options = optionsself.driver = webdriver.Chrome(service=self.service, options=self.options)def get(self, url):self.driver.get(url)self.driver.implicitly_wait(5)def download_file(self):xpath = f'//*[@id="content"]/div/a[13]'self.driver.find_element(By.XPATH, xpath).click()def close(self):time.sleep(5)self.driver.quit()if __name__ == '__main__':serve_path = r'D:\Code_Study\driver\chromedriver-win64\chromedriver.exe'url = "https://the-internet.herokuapp.com/download"options = Options()# 设置下载路径download_dir = os.path.abspath("downloads")  # 指定下载目录perfs = {"download.default_directory": download_dir,}options.add_experimental_option("prefs", perfs)browser = browser_download(serve_path, options)browser.get(url)browser.download_file()browser.close()

自动化测试中文件下载的验证

一旦文件被下载到指定的目录,下一步就是验证下载是否成功以及文件的内容是否符合预期。常见的验证方法包括:

  • 检查文件是否存在: 使用 os.path.exists() 方法判断文件是否已成功下载到指定目录。
  • 检查文件大小: 使用 os.path.getsize() 方法获取文件大小,并与预期大小进行比较。
  • 检查文件类型: 使用 os.path.splitext() 获取文件扩展名,判断文件类型是否正确。
  • 读取文件内容并进行断言:
    • 对于文本文件(如 CSV、TXT),可以使用 Python 的文件操作读取内容并进行断言。
    • 对于 JSON 文件,可以使用 json 库解析并进行断言。
    • 对于 PDF 文件,可以使用第三方库(如 PyPDF2)读取文本内容或元数据进行断言。
    • 对于其他二进制文件,可能需要根据文件格式进行特定的解析和验证。

最佳实践和注意事项

  • 指定稳定的下载目录: 确保下载目录在测试执行过程中是可写且不会被清理的。可以使用绝对路径,方便管理。
  • 处理不同文件类型: 针对不同的文件类型,配置浏览器以正确处理,并在验证时使用相应的库进行解析。
  • 等待文件下载完成: 在触发下载后,需要等待一段时间才能进行文件验证。可以使用显式等待,例如轮询检查文件是否存在或文件大小是否稳定。
  • 清理下载目录: 在每个测试用例执行前后,清理下载目录,避免相互影响。
  • 考虑并发测试: 如果需要进行并发测试,确保每个测试用例使用独立的下载目录,避免文件冲突。
  • 处理下载失败的情况: 考虑网络问题、服务器错误等可能导致下载失败的情况,并在测试中进行适当的处理和断言。

总结

虽然 Selenium 本身不直接处理文件下载,但通过配置浏览器设置,我们可以实现将下载文件自动保存到指定目录,从而方便我们进行后续的验证。结合 Python 的文件操作和相关的第三方库,我们可以编写出可靠的自动化测试用例,有效地验证 Web 应用程序的文件下载功能。掌握这些技巧,将使你的自动化测试能力更上一层楼!

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

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

相关文章

基于迁移学习实现肺炎X光片诊断分类

大家好,我是带我去滑雪! 肺炎是全球范围内致死率较高的疾病之一,尤其是在老年人、免疫系统较弱的患者群体中,更容易引发严重并发症。传统上,肺炎的诊断依赖于医生的临床经验以及影像学检查,尤其是X光片&…

工业数据治理范式革新:时序数据库 TDengine虚拟表技术解析

小T导读:在工业数字化过程中,数据如何从设备采集顺利“爬坡”到上层应用,一直是个难题。传统“单列模型”虽贴合设备协议,却让上层分析举步维艰。TDengine 用一种更聪明的方法打通了这条数据通路:不强求建模、不手动转…

Redis面试——日志

一、RDB(Redis DataBase) RDB 全程是 Redis DataBase,它是一种将 Redis 在某一时刻内存中的数据以快照形式保存到磁盘的机制 ,相当于给执行save/bgsave命令时刻的内存数据库数据拍了一张快照我们如果通过save命令来执行快照&…

【Android】常用参数实践 用户界面UI 布局文件XML

本文将系统总结 Android XML 布局的通用参数和常用布局类型的专属规则 一、通用布局参数 这些参数适用于所有 View 和 ViewGroup,是布局设计的基石。 1. 尺寸控制 android:layout_width 与 android:layout_height 定义视图的宽度和高度,可选值&#xf…

解决 VSCode 中 NVM 配置后无法识别 Node 和 NPM 的问题

在开发中,我们经常需要使用 Node.js 和 NPM 来管理 JavaScript 项目依赖,而 NVM(Node Version Manager)是开发者在本地环境中管理多个 Node.js 版本的得力工具。不过,有时候在 VSCode 中配置完 NVM 后,可能…

BGP分解实验·23——BGP选路原则之路由器标识

在选路原则需要用到Router-ID做选路决策时,其对等体Router-ID较小的路由将被优选;其中,当路由被反射时,包含起源器ID属性时,该属性将代替router-id做比较。 实验拓扑如下: 实验通过调整路由器R1和R2的rout…

Linux: 线程同步

目录 一 前言 二 线程饥饿 三 线程同步 四 条件变量 1. cond ( condition) 2. pthread_cond_wait() : 3. pthread_cond_signal() 五 条件变量的使用 一 前言 在上篇文章Linux : 多线程互斥-CSDN博客我们讲解了线程互斥的概念&#xff…

MyBatisPlus-QueryWrapper的exists方法拼接SQL中的EXISTS子句

在 MyBatis-Plus 中,QueryWrapper 的 exists 方法用于拼接 SQL 中的 EXISTS 子句,通常用于构 建子查询条件。以下是具体用法和示例: ​​1. 基本语法​​ // 判断是否存在符合条件的记录 queryWrapper.exists(String existsSql); queryWrapper.notExists(String existsSq…

[数据结构]哈希表

目录 1、哈希表 1.1、概念 1.2、冲突 2、哈希函数设计 3、负载因子调节 4、闭散列 5、开散列/哈希桶(重点掌握) 6、实现哈希桶 6.1、put方法 6.2、HashMap的扩容机制 6.3、get方法 7、HashMap 8、HashSet 8.1、哈希表性能分析 9、hashcod…

VS-Code创建Vue3项目

1 创建工程文件 创建一个做工程项目的文件夹 如:h5vue 2 cmd 进入文件 h5vue 3 输入如下命令 npm create vuelatest 也可以输入 npm create vitelatest 4 输入项目名称 项目名称:自已输入 回车 可以按键盘 a (全选) 回车: Playwright…

linux休眠唤醒流程

1、框架 2、休眠流程 应用层通过echo mem > /sys/power/state写入休眠状态,给一张大概流程图 这个操作对应在kernel/power/main.c的state这个attr的store操作 static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr, …

Mysql--基础知识点--93--两阶段提交

1 两阶段提交 以update语句的具体执行过程为例: 具体更新一条记录 UPDATE t_user SET name ‘xiaolin’ WHERE id 1;的流程如下: 1.执行器负责具体执行,会调用存储引擎的接口,通过主键索引树搜索获取 id 1 这一行记录&#…

Windows 环境下 Apache 配置 WebSocket 支持

目录 前言1. 基本知识2. 实战前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn 原先写过apache的http配置:Apache httpd-vhosts.conf 配置详解(附Demo) 1. 基本知识 🔁 WebSocket 是 HTTP 的升级协议 客户…

UMAEA论文阅读

Preliminaries MMKG为一个五元组G{E, R, A, V, T},其中E、R、A和V分别表示实体集、关系集、属性集和图像集。 T⊆ERE是关系三元组集。 给定两个MMKG G1 {E1, R1, A1, V1, T1} 和 G2 {E2, R2, A2, V2, T2}, MMEA旨在识别每个实体对(e1…

AIGC-十款知识付费类智能体完整指令直接用(DeepSeek,豆包,千问,Kimi,GPT)

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列AIGC(GPT、DeepSeek、豆包、千问、Kimi)👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资…

Qt界面卡住变慢的解决方法

本质原因: 当Qt界面出现卡顿或无响应时,通常是因为主线程(GUI线程)被耗时操作阻塞。 完全忘了。。。 Qt Creater解决方法 1. 定位耗时操作 目标:找到阻塞主线程的代码段。 方法: 使用QElapsedTimer测量代码执行时间…

【LangChain4j快速入门】5分钟用Java玩转GPT-4o-mini,Spring Boot整合实战!| 附源码

【LangChain4j快速入门】5分钟用Java玩转GPT-4o-mini,Spring Boot整合实战! 前言:当Java遇上大模型 在AI浪潮席卷全球的今天,Java开发者如何快速拥抱大语言模型?LangChain4j作为专为Java打造的AI开发框架&#xff0c…

Vue 3 reactive 和 ref 区别及 失去响应性问题

在 Vue 3 中,reactive 和 ref 是实现响应式数据的两个核心 API,它们的设计目标和使用场景有所不同。以下是两者的详细对比: 1. 基本定义与核心功能 特性reactiveref作用创建对象类型的响应式代理(对象、数组、Map 等&#xff09…

第一节:Vben Admin 最新 v5.0初体验

系列文章目录 基础篇 第一节:Vben Admin介绍和初次运行 第二节:Vben Admin 登录逻辑梳理和对接后端准备 第三节:Vben Admin登录对接后端login接口 第四节:Vben Admin登录对接后端getUserInfo接口 第五节:Vben Admin权…

Nginx部署spa单页面的小bug

没部署过,都是给后端干的,自己尝试部署了一个下午终于成功了 我遇到的最大的bug是进入后只有首页正常显示 其他页面全是404,于是问问问才知道,需要这个 location / { try_files $uri $uri/ /index.html; } 让…