Pytest Playwright测试在Chromium常规运行失败,调试模式正常
问题:Playwright+Pytest 中Chromium下文件上传失败,Webkit/调试模式正常
- 测试脚本在Webkit中运行正常,但Chromium常规运行时,JavaScript控制的文件上传功能失效,Playwright找不到元素超时
- 调试模式(
PWDEBUG=1)下Chromium运行正常 - 尝试过
filechooser方法,同样在Chromium中失效,怀疑是浏览器上下文权限配置问题
测试脚本代码
page2.locator("#uploadDocument").set_input_files("pytest_tests\TestDownloads\online_application_"+app_timestamp+".pdf")
页面元素代码
<div class="input-container"> <label for="uploadDocument">Upload signed documents <a class="i-tooltip" title="" data-toggle="tooltip" href="#pd" data-placement="top" data-original-title="Format must be in PDF"> <i class="icon-question-sign"></i> </a> </label> <div class="custom-file"><input type="file" class="hidden-file-input" id="uploadDocument" name="uploadDocument" accept="application/pdf"> <label class="custom-file-label" for="uploadDocument"><span class="custom-file-input" id="ChooseFile" name="ChooseFile" style="color: gray;"> </span><i class="icon-upload-alt"></i> </label> </div> </div>
解决方案
1. 显式等待元素状态
Chromium渲染速度与Webkit存在差异,常规运行时元素可能未完全就绪。添加显式等待确保元素可见/可交互:
# 等待元素可见并可交互 upload_input = page2.locator("#uploadDocument").wait_for(state="visible") # 建议用f-string拼接路径,同时改用正斜杠避免转义问题 upload_input.set_input_files(f"pytest_tests/TestDownloads/online_application_{app_timestamp}.pdf")
2. 配置Chromium上下文权限
创建浏览器上下文时,添加文件操作相关权限及必要配置,解决潜在权限限制:
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch() context = browser.new_context( accept_downloads=True, permissions=["clipboard-read", "clipboard-write"], bypass_csp=True # 若页面CSP限制导致JS功能异常,可启用此配置 ) page2 = context.new_page() # 执行测试逻辑
3. 强制操作隐藏元素
由于文件输入框被标记为hidden-file-input,Chromium对隐藏元素的操作限制更严格,可添加force=True强制触发操作:
page2.locator("#uploadDocument").set_input_files( f"pytest_tests/TestDownloads/online_application_{app_timestamp}.pdf", force=True )
4. 模拟用户点击流程
通过点击关联的<label>标签触发文件选择框,再监听filechooser完成上传:
with page2.expect_file_chooser() as fc_info: page2.locator("label[for='uploadDocument']").click() file_chooser = fc_info.value file_chooser.set_files(f"pytest_tests/TestDownloads/online_application_{app_timestamp}.pdf")
内容的提问来源于stack exchange,提问作者AkshayDandekar
相关产品推荐
相关产品推荐

