如何用C#和Selenium查看并验证Blob链接的XLSX报告文件?
Selenium验证Blob链接下载的XLSX文件内容的最佳方法
针对你遇到的场景(点击带blob:协议的下载按钮生成XLSX报告,需在回归测试中验证内容),推荐以下两种实用方案:
方案一:直接获取Blob内容(无需本地下载)
这种方法跳过浏览器下载流程,直接通过JS提取Blob对应的二进制数据,效率更高,尤其适合自动化测试和CI环境。
步骤:
- 用Selenium执行JavaScript,获取Blob的Base64编码数据
- 将Base64转成字节流,用Excel处理库读取内容
Python代码示例:
from selenium import webdriver import base64 import pandas as pd from io import BytesIO from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get("你的目标页面URL") # 执行JS获取Blob的Base64数据 js_script = """ const downloadLink = document.querySelector('a.n-pad.btn[download="test-report"]'); const xhr = new XMLHttpRequest(); xhr.open('GET', downloadLink.href, false); xhr.responseType = 'blob'; xhr.send(); const reader = new FileReader(); reader.readAsDataURL(xhr.response); while(reader.readyState !== 2) {} // 等待读取完成 return reader.result; """ base64_str = driver.execute_script(js_script).split(',')[1] # 去掉dataURL前缀 # 转成字节流并读取XLSX byte_data = base64.b64decode(base64_str) df = pd.read_excel(BytesIO(byte_data)) # 示例验证:检查第一行第一列的值 assert df.iloc[0, 0] == "预期内容" driver.quit()
方案二:模拟浏览器下载后读取文件
如果需要完全模拟用户的下载操作(验证下载流程完整性),可以配置浏览器的下载路径,待文件下载完成后读取内容。
步骤:
- 配置浏览器的下载偏好(指定目录、关闭弹窗)
- 点击下载按钮,等待文件下载完成
- 读取文件并验证内容,最后清理文件
Python代码示例(Chrome):
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By import os import time # 配置下载目录 download_dir = os.path.abspath("./test_downloads") os.makedirs(download_dir, exist_ok=True) # 配置Chrome选项 chrome_options = Options() chrome_options.add_experimental_option("prefs", { "download.default_directory": download_dir, "download.prompt_for_download": False, "download.directory_upgrade": True, "safebrowsing.enabled": True }) driver = webdriver.Chrome(options=chrome_options) driver.get("你的目标页面URL") # 点击保存按钮 driver.find_element(By.CSS_SELECTOR, 'a.n-pad.btn[download="test-report"]').click() # 等待文件下载完成(含文件写入完成判断) file_path = os.path.join(download_dir, "test-report.xlsx") start_time = time.time() while True: if os.path.exists(file_path): # 检查文件大小是否稳定(避免文件未写完) current_size = os.path.getsize(file_path) time.sleep(1) if current_size == os.path.getsize(file_path): break if time.time() - start_time > 30: raise TimeoutError("文件下载超时") # 读取并验证内容 df = pd.read_excel(file_path) assert df.loc[0, "目标列名"] == "预期值" # 清理文件和浏览器 os.remove(file_path) driver.quit()
方案对比
- 方案一:无需处理本地文件,避免路径权限、文件残留等问题,执行速度快,适合大部分自动化测试场景。
- 方案二:完全模拟用户操作,可验证下载流程的完整性(如文件名是否正确、下载是否触发),但依赖本地环境,CI环境需额外配置。
注意事项
blob:URL是临时的,页面刷新后会失效,需在页面未刷新时执行获取逻辑。- 处理XLSX需安装对应依赖:
pandas、openpyxl(或xlrd),可通过pip install pandas openpyxl安装。
内容的提问来源于stack exchange,提问作者Kev
相关产品推荐
相关产品推荐

