网站后台制作视频教程,产品报价网,广东专业网站建设公司,建设银行内部网站在自动化测试或网页数据交互场景中#xff0c;文件上传与下载是极为常见的操作。Playwright 作为强大的自动化测试工具#xff0c;不仅能模拟用户触发上传和下载行为#xff0c;更能精准判断操作是否完成。
本文将从原理到实践#xff0c;全面讲解如何利用 Playwright 实现…在自动化测试或网页数据交互场景中文件上传与下载是极为常见的操作。Playwright 作为强大的自动化测试工具不仅能模拟用户触发上传和下载行为更能精准判断操作是否完成。本文将从原理到实践全面讲解如何利用 Playwright 实现文件上传、下载的完成判断附带完整代码示例和最佳实践帮助开发者高效解决文件交互场景中的自动化难题。01 文件上传完成判断精准捕捉上传成功信号文件上传的完成判断核心在于 “识别上传成功的标志”—— 可能是页面 DOM 元素变化、网络请求响应或是成功提示文本。Playwright 提供了多种监听机制可根据实际场景灵活选择。1.1 核心实现代码Python 异步import asyncio from playwright.async_api import async_playwright async def file_upload_example(): async with async_playwright() as p: browser await p.chromium.launch(headlessFalse) page await browser.new_page() # 监听文件选择事件 async with page.expect_file_chooser() as fc_info: await page.click(input[typefile]) # 点击文件上传按钮 file_chooser await fc_info.value # 选择要上传的文件 await file_chooser.set_files(path/to/your/file.txt) # 方法1: 等待上传成功的元素出现 await page.wait_for_selector(.upload-success, timeout10000) # 方法2: 等待网络请求完成 async with page.expect_response(lambda response: upload in response.url and response.status 200) as response_info: # 这里可以执行触发上传的操作 await page.click( #submit -upload) response await response_info.value print(f上传完成状态码: {response.status}) # 方法3: 等待特定文本出现 await page.wait_for_selector(text上传成功) await browser.close() # 运行示例 asyncio.run(file_upload_example())1.2 上传完成判断原理解析Playwright 的上传判断本质是 “监听页面状态变化”三种核心方法对应不同场景DOM 元素监听通过page.wait_for_selector()等待上传成功的标志性元素如.upload-success提示框适用于页面有明确状态反馈的场景。需注意元素的state参数visible表示可见attached表示仅存在于 DOMhidden表示隐藏。网络请求监听通过page.expect_response()监控与上传相关的接口如 URL 含 “upload” 关键词当接口返回 200成功时判定上传完成适用于需验证后端交互的场景。文本内容监听通过textxxx语法直接匹配页面文本无需定位具体元素适用于仅靠文本提示上传结果的简单场景。1.3 关键参数说明page.wait_for_selector(selector, kwargs)selectorCSS 选择器或 XPath如.upload-success、//div[contains(text(),成功)]timeout超时时间毫秒超时未满足条件会抛出异常state元素状态默认visible可选attached存在、detached消失、hidden隐藏。page.expect_response(predicate, kwargs)predicate匿名函数用于过滤目标响应如判断 URL 含 “upload” 且状态码 200timeout超时时间默认 30 秒。02 文件下载完成判断从触发到验证全流程文件下载的判断比上传更复杂 —— 需先监听下载开始再等待文件写入磁盘最后验证文件有效性如是否存在、是否为空。Playwright 通过download事件和Download对象实现全流程监控。2.1 核心实现代码Python 异步import asyncio import os from playwright.async_api import async_playwright async def file_download_example(): async with async_playwright() as p: browser await p.chromium.launch(headlessFalse) page await browser.new_page() # 设置下载路径 download_path ./downloads if not os.path.exists(download_path): os.makedirs(download_path) # 监听下载事件 async with page.expect_download() as download_info: # 触发下载操作 await page.click( #download -button) download await download_info.value # 方法1: 等待下载完成并获取文件路径 file_path await download.path() print(f文件下载完成: {file_path}) # 方法2: 保存文件到指定路径 save_path os.path.join(download_path, download.suggested_filename) await download.save_as(save_path) print(f文件已保存到: {save_path}) # 方法3: 监听下载状态变化 def handle_download(download): print(f下载开始: {download.url}) # 等待下载完成 download.path().then(lambda path: print(f下载完成文件路径: {path})) # 注册下载监听器 page.on(download, handle_download) # 验证文件是否存在且大小合理 if os.path.exists(save_path): file_size os.path.getsize(save_path) print(f文件大小: {file_size} bytes) if file_size 0: print(下载文件验证成功) else: print(警告: 下载的文件可能为空) else: print(错误: 文件下载失败) await browser.close() # 更完整的下载监控示例 async def advanced_download_monitor(): async with async_playwright() as p: browser await p.chromium.launch(headlessFalse) page await browser.new_page() download_path ./downloads os.makedirs(download_path, exist_okTrue) # 存储下载信息 downloads [] def on_download(download): downloads.append(download) print(f新的下载: {download.suggested_filename}) page.on(download, on_download) # 触发下载 await page.goto(https://example.com/download) await page.click( #download -link) # 等待所有下载完成 for download in downloads: # 等待下载完成最多等待30秒 try: await download.path() print(f下载完成: {download.suggested_filename}) # 保存文件 await download.save_as( os.path.join(download_path, download.suggested_filename) ) except Exception as e: print(f下载失败: {e}) await browser.close() # 运行示例 asyncio.run(file_download_example()) asyncio.run(advanced_download_monitor())2.2 下载完成判断原理解析Playwright 的下载判断分为三个核心环节1、捕获下载开始通过page.expect_download()或page.on(download)监听下载触发事件获取Download对象包含下载 URL、建议文件名等信息。2、等待下载完成调用download.path()会阻塞直到文件写入磁盘返回临时文件路径若需持久化保存可通过download.save_as(path)指定目录。3、验证文件有效性通过os.path.exists()判断文件是否存在os.path.getsize()判断文件是否为空避免下载失败或文件损坏。2.3 关键参数说明page.expect_download(kwargs)predicate过滤下载事件如仅监听特定 URL 的下载timeout超时时间默认 30 秒超时未触发下载会抛出异常。download.path()返回下载文件的临时路径不同浏览器临时目录不同若下载未完成会阻塞直到完成或超时。download.save_as(path)path目标保存路径需包含文件名将临时文件复制到指定路径避免临时文件被自动清理。03 综合实用示例封装上传下载工具类为提高代码复用性可封装FileHandler工具类整合上传完成判断、下载完成判断、文件验证等功能适用于复杂项目场景。import asyncio import os from playwright.async_api import async_playwright class FileHandler: def __init__(self, download_dir./downloads): self.download_dir download_dir os.makedirs(download_dir, exist_okTrue) async def wait_for_upload_completion(self, page, success_selectorNone, timeout30000): 等待文件上传完成 completion_indicators [ lambda: page.wait_for_selector(success_selector, timeouttimeout) if success_selector else None, lambda: page.wait_for_selector(.upload-complete, timeouttimeout), lambda: page.wait_for_selector(text上传成功, timeouttimeout), lambda: page.wait_for_selector(textUpload Complete, timeouttimeout) ] for indicator in completion_indicators: if indicator: try: await indicator() return True except: continue return False async def wait_for_download_completion(self, page, download_triggerNone, timeout60000): 等待文件下载完成 try: # 监听下载开始 async with page.expect_download(timeouttimeout) as download_info: if download_trigger: await download_trigger() download await download_info.value print(f开始下载: {download.suggested_filename}) # 等待下载完成 file_path await download.path() print(f下载完成: {file_path}) # 保存到指定目录 save_path os.path.join(self.download_dir, download.suggested_filename) await download.save_as(save_path) # 验证文件 if self.validate_downloaded_file(save_path): print(f文件验证成功: {save_path}) return save_path else: print(f文件验证失败: {save_path}) return None except Exception as e: print(f下载过程出错: {e}) return None def validate_downloaded_file(self, file_path): 验证下载的文件 if not os.path.exists(file_path): return False file_size os.path.getsize(file_path) if file_size 0: return False # 可以根据需要添加更多验证逻辑 # 例如文件类型、内容校验等 return True # 使用示例 async def main(): handler FileHandler() async with async_playwright() as p: browser await p.chromium.launch(headlessFalse) page await browser.new_page() # 文件上传示例 await page.goto(https://example.com/upload) await page.set_input_files(input[typefile], test_file.txt) await page.click( #upload -button) # 等待上传完成 upload_success await handler.wait_for_upload_completion( page, success_selector.upload-success-message ) if upload_success: print(文件上传成功) else: print(文件上传失败或超时) # 文件下载示例 await page.goto(https://example.com/download) download_path await handler.wait_for_download_completion( page, download_triggerlambda: page.click( #download -btn) ) if download_path: print(f文件下载并保存到: {download_path}) await browser.close() if __name__ __main__: asyncio.run(main())04 总结核心要点与最佳实践4.1 核心要点回顾最后下方这份完整的软件测试视频教程已经整理上传完成需要的朋友们可以自行领取【保证100%免费】软件测试面试文档我们学习必然是为了找到高薪的工作下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料并且有字节大佬给出了权威的解答刷完这一套面试资料相信大家都能找到满意的工作。