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

