You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 06:33:13