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
相关产品推荐
相关产品推荐

