TestNG+Selenium运行时报element is not clickable at point错误如何解决
报错原因
elementToBeClickable判断逻辑只校验目标元素是否可见、是否处于可交互的enabled状态,不会校验是否有其他元素堆叠在目标元素上方。即使你肉眼看不到modal-body元素,也有可能是Angular框架的DOM变更过程中,该遮罩层处于消失的过渡动画阶段,代码执行点击的瞬间该元素还未完全从DOM中移除/透明化,触发了点击拦截。- 目标元素不在当前浏览器视口范围内,Selenium自动滚动的位置存在偏差,导致固定定位的头部、侧边栏或者滚动容器(报错里的modal-body本身是带滚动的容器)边缘遮挡了目标元素的点击坐标。
- 页面存在未被你注意到的动态加载遮罩(比如接口请求触发的全局loading层),在点击执行的短暂瞬间处于可见状态。
解决方案
按优先级从高到低尝试:
- 新增遮挡元素消失的前置等待,在等待目标元素可点击前,先确保报错中提到的遮挡元素完全不可见:
// 先等待modal-body消失 clickableWait.until(ExpectedConditions.invisibilityOfElementLocated(By.className("modal-body"))); // 再等待目标元素可点击 clickableWait.until(ExpectedConditions.elementToBeClickable(middlename));
- 主动将目标元素滚动到视口中央,避免滚动偏差导致的遮挡:
JavascriptExecutor js = (JavascriptExecutor) getWebDriver(); // 将元素滚动到视口正中央 js.executeScript("arguments[0].scrollIntoView({block: 'center', inline: 'center'})", middlename); middlename.click(); middlename.clear(); middlename.sendKeys("Jhon");
- 若以上方案均无效,直接使用JavaScript执行点击操作,绕过前端的点击坐标校验:
JavascriptExecutor js = (JavascriptExecutor) getWebDriver(); js.executeScript("arguments[0].click();", middlename); middlename.clear(); middlename.sendKeys("Jhon");
- 替换代码中的硬等待
waitPlease(2)为显式等待逻辑,避免不同环境下页面渲染速度不一致导致的偶现问题。
内容的提问来源于stack exchange,提问作者ankush singh
相关产品推荐
相关产品推荐

