如何防止Selenium WebElement sendKeys()方法执行参数替换
解决Selenium sendKeys无法发送字面量恶意字符串的问题
我之前也碰到过一模一样的情况——浏览器会自动把这类相对路径字符串解析成系统绝对路径,完全打乱了我们测试恶意输入的需求。别担心,下面几个方法应该能帮你搞定:
方法一:用JavaScript直接设置元素值
绕过sendKeys的模拟输入逻辑,直接通过JS修改textarea的value属性,这样浏览器根本没机会触发自动解析。代码示例(Java为例):// 假设textArea是你的WebElement实例,text是要发送的字面量字符串 JavascriptExecutor js = (JavascriptExecutor) driver; js.executeScript("arguments[0].value = arguments[1];", textArea, text);这个方法直接操作DOM,能100%保证字符串原样写入目标元素。
方法二:逐字符输入+禁用自动补全
如果必须模拟真实用户的输入流程(比如要触发输入事件),可以先禁用元素的自动补全属性,再逐字符发送内容,让浏览器来不及触发路径解析:// 先清空输入框原有内容 textArea.sendKeys(Keys.chord(Keys.CONTROL, "a")); textArea.clear(); // 禁用自动补全相关属性 ((JavascriptExecutor) driver).executeScript(""" arguments[0].setAttribute('autocomplete', 'off'); arguments[0].setAttribute('autocorrect', 'off'); arguments[0].setAttribute('autocapitalize', 'off'); """, textArea); // 逐字符发送目标字符串 for (char c : text.toCharArray()) { textArea.sendKeys(String.valueOf(c)); }逐字符输入会打断浏览器的批量解析逻辑,配合禁用自动补全,基本能保留原始字符串。
方法三:利用剪贴板粘贴
把目标字符串复制到系统剪贴板,再触发粘贴操作,这种方式也能绕过浏览器的输入解析:// 将字符串复制到剪贴板(Java实现) Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(text), null); // 触发粘贴:Windows/Linux用CONTROL,Mac用COMMAND textArea.sendKeys(Keys.chord(Keys.CONTROL, "v"));注意Mac系统要把
Keys.CONTROL换成Keys.COMMAND。这个方法的小缺点是会占用剪贴板,但测试场景下一般影响不大。
补充说明
为什么sendKeys会出这个问题?因为它模拟的是真实用户的键盘输入,而Chrome、Safari这类浏览器有针对文件路径的自动优化——当识别到类似多级相对路径的字符串时,会自动转换成系统的绝对路径。这在正常用户场景下是便利,但在安全测试中就成了阻碍,上面的方法都是绕过这个自动解析逻辑的有效手段。
内容的提问来源于stack exchange,提问作者David Ryan
相关产品推荐
相关产品推荐

