WebDriver问题:sendKeys()丢失焦点/输入顺序异常,迁移服务器后出现
问题分析与解决方案
核心问题大概率出在Chrome版本从58升级到65带来的兼容性变化——虽然Selenium版本一致,但ChromeDriver与浏览器的版本匹配、新版Chrome对富文本输入的处理逻辑都可能触发这个异常。下面是具体的排查和解决步骤:
1. 优先检查ChromeDriver与Chrome版本的兼容性
Chrome和ChromeDriver的版本必须严格匹配,这是Selenium自动化里最容易踩的坑之一:
- Chrome 65对应的ChromeDriver版本是2.37(它支持Chrome 64-66版本),而旧服务器上Chrome 58对应的是ChromeDriver 2.30左右。如果新服务器的ChromeDriver还是旧版本,必然会出现各种输入异常。
- 解决办法:
- 卸载现有ChromeDriver:
sudo apt remove chromedriver - 下载适配Ubuntu 16.04的ChromeDriver 2.37版本
- 赋予执行权限:
chmod +x chromedriver - 替换系统旧版本:
sudo mv chromedriver /usr/local/bin/
- 卸载现有ChromeDriver:
2. 调整含HTML标签文本的输入方式
Chrome 65对富文本编辑器的输入处理逻辑有更新,直接用sendKeys()输入HTML标签可能被转义或无法正确解析,可以改用JavaScript注入的方式设置内容:
情况1:描述字段是带contenteditable属性的普通文本框
// 定位描述字段元素 WebElement descField = driver.findElement(By.id("your-description-element-id")); // 准备带HTML标签的内容 String htmlContent = "<h3>测试标题</h3><p>包含<strong>加粗</strong>的段落文本</p>"; // 通过JS直接设置元素的innerHTML ((JavascriptExecutor) driver).executeScript("arguments[0].innerHTML = arguments[1];", descField, htmlContent);
情况2:描述字段是嵌入iframe的富文本编辑器(如CKEditor、TinyMCE)
多数富文本编辑器会放在iframe中,需要先切换到iframe再操作:
// 切换到编辑器对应的iframe(替换为实际的iframe定位器) driver.switchTo().frame("editor-iframe-id"); // 定位编辑器的body元素 WebElement editorBody = driver.findElement(By.tagName("body")); // 注入HTML内容 ((JavascriptExecutor) driver).executeScript("arguments[0].innerHTML = arguments[1];", editorBody, htmlContent); // 切回主文档 driver.switchTo().defaultContent();
3. 验证Selenium版本的兼容性
虽然你提到两台服务器Selenium版本一致,但还是要确认当前版本是否支持Chrome 65。一般来说,Selenium 3.8.0及以上版本对Chrome 65的支持更完善,如果你的版本过低,建议升级到3.x的稳定版(比如3.141.59),避免潜在的API兼容问题。
内容的提问来源于stack exchange,提问作者Simon Bolivar
相关产品推荐
相关产品推荐

