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

Chrome 117更新后,Selenium文件上传代码注入技术失效求助

解决方案:Chrome 117+下Selenium文件上传绕过对话框失效问题

错误原因

Chrome 117及对应Selenium库更新后,内部元素校验逻辑(如isShown方法)对元素原型链的完整性要求更严格。你之前全局重写HTMLInputElement.prototype.click的操作,破坏了原生元素的类型标识,导致Selenium执行内部检查时无法识别元素类型,从而抛出Argument to isShown must be of type Element错误。

可行解决方案

方案一:直接操作原生文件输入元素(推荐)

跳过全局原型修改,直接定位页面中的input[type='file']元素,调用SendKeys传入文件路径,这是Selenium官方推荐的文件上传方式:

// 定位页面中的文件输入元素(根据实际选择器调整)
IWebElement fileInput = Driver.WebDriver.FindElement(By.CssSelector("input[type='file']"));

// 若元素处于隐藏状态,先通过JS使其可见(部分页面会隐藏原生输入)
((IJavaScriptExecutor)Driver.WebDriver).ExecuteScript(
    "arguments[0].style.display = 'block'; arguments[0].style.visibility = 'visible';", 
    fileInput
);

// 直接传入文件路径,绕过Windows对话框
fileInput.SendKeys(@"C:\TestFiles\example.pdf");

方案二:局部修改元素click行为(而非全局原型)

如果必须保留通过右键菜单项触发上传的逻辑,不要全局重写HTMLInputElement的原型,仅针对目标触发元素修改click方法:

// 定位关联右键菜单的触发元素(根据实际选择器调整)
IWebElement uploadMenuItem = Driver.WebDriver.FindElement(By.Id("right-click-upload-item"));

// 给该元素单独绑定click逻辑,不影响全局元素原型
((IJavaScriptExecutor)Driver.WebDriver).ExecuteScript(@"
    const trigger = arguments[0];
    trigger.click = function() {
        // 找到对应的文件输入元素并触发点击
        const fileInput = document.querySelector('input[type=''file'']');
        if (fileInput) fileInput.click();
    };
", uploadMenuItem);

// 触发右键菜单项的点击,间接唤起文件输入
uploadMenuItem.Click();
// 后续再给文件输入元素SendKeys(同方案一)

方案三:确保Selenium与Chrome版本完全兼容

确认你使用的Selenium.WebDriver和Selenium.WebDriver.ChromeDriver版本与Chrome 117+完全匹配:

  • 升级NuGet包中的Selenium.WebDriver至最新稳定版(4.x系列)
  • 升级Selenium.WebDriver.ChromeDriver至对应Chrome版本的驱动(Chrome 117对应ChromeDriver 117.x)

内容的提问来源于stack exchange,提问作者Randy Morris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 18:05:08