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

CefSharp通过EvaluateScriptAsync实现无弹窗文件上传,对标Selenium SendKeys

CefSharp无弹窗文件上传实现方案

首先明确:受浏览器安全策略限制,纯前端JS无法直接给<input type="file">元素的value属性赋值本地文件路径,所以你不能直接通过document.querySelector("input[accept='*']").value = "本地文件路径"这种写法实现需求,该操作会被浏览器主动拦截并抛出安全异常。

对应你的需求,有两种成熟实现方案:

方案1:拦截文件对话框回调(最稳定,推荐)

不需要依赖JS赋值,直接在C#层拦截文件选择弹窗的系统回调,主动传入你需要上传的文件路径即可:

// 给ChromiumWebBrowser实例注册对话框处理逻辑
browser.DialogHandler = new DefaultDialogHandler
{
    OnFileDialog = (chromiumWebBrowser, browser, mode, title, defaultFilePath, acceptFilters, selectedAcceptFilter, callback) =>
    {
        // 直接传入目标文件路径,多文件上传可传入多个路径组成的字符串数组
        callback.Continue(new[] { @"C:\your\file\path\test.png" }, selectedAcceptFilter);
        // 返回true表示已手动处理弹窗,不需要弹出系统文件选择框
        return true;
    }
};

// 之后通过JS触发点击上传的操作即可,不会弹出对话框
await browser.EvaluateScriptAsync("document.querySelector('input[accept=\"*\"]').click()");

方案2:直接给input元素设置文件列表

如果你不想全局拦截对话框,也可以定位到目标input元素后,通过CefSharp提供的API直接设置上传文件:

// 执行JS获取目标input元素的实例
var elementResult = await browser.EvaluateScriptAsync("document.querySelector('input[accept=\"*\")');
if (elementResult.Success && elementResult.Result is IJavascriptObject fileInput)
{
    // 调用CefSharp内置方法设置上传文件,绕开浏览器安全限制
    fileInput.SetFileInputFiles(new [] { @"C:\your\file\path\test.png" });
}

注意事项

  • 部分站点会把原生input[type=file]设置为display: none隐藏,不影响querySelector获取元素
  • 多文件上传只需给SetFileInputFiles/callback.Continue传入多路径组成的字符串数组即可

内容的提问来源于stack exchange,提问作者Dhadan Mrd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:39:02