当前位置: 首页 > news >正文

UI 自动化测试中元素被遮挡无法点击的解决方案(Selenium + Python 实战)

UI 自动化测试中元素被遮挡无法点击的解决方案

在进行 Web UI 自动化测试 时,经常会遇到一个令人头疼的问题:元素明明存在,却始终点不到。
报错信息通常类似:

selenium.common.exceptions.ElementClickInterceptedException: 
Message: element click intercepted: Element <span>...</span> is not clickable at point (107, 883).
Other element would receive the click: <div class="uni-tabbar__item">...</div>

意思就是:你想点的元素被其它东西挡住了(比如悬浮导航栏、广告弹窗、底部 tabbar 等)。

本文结合一个实际案例,介绍几种常见的解决方案,并给出企业级封装。

1. 问题场景:商城首页「人气推荐」点击失败

在商城 H5 首页,我们需要测试点击「人气推荐」模块。
对应 Page Object 定位符如下:

class HomePage(BasePage):hot_recommend_section = (By.XPATH, "//view[contains(., '人气推荐')]")def click_hot_recommend(self):"""点击人气推荐"""self.scroll_to_element(*self.hot_recommend_section)  # 滚动到模块self.click(self.hot_recommend_section)               # 点击

运行测试用例时,报错:

ElementClickInterceptedException: Other element would receive the click: <div class="uni-tabbar__item">...</div>

原因就是:底部 tabbar 遮住了点击区域。

2. 常见解决方案

方案一:滚动到可见区域

Selenium 提供了 scrollIntoView() 方法,把元素滚动到屏幕中间:

self.driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", element)

这样可以避免元素在屏幕外导致的点击失败。

方案二:等待元素可点击

即使元素在页面上,还需要确认它 真正可交互。
可以用 WebDriverWait + element_to_be_clickable:

WebDriverWait(self.driver, self.timeout).until(EC.element_to_be_clickable(locator)
)

方案三:JS 点击兜底

有时即使元素可见,但还是被其他元素挡住(比如悬浮弹窗)。
这时可以使用 JavaScript 直接触发点击事件

self.driver.execute_script("arguments[0].click();", element)

3. 企业级封装:BasePage.click()

综合以上思路,可以在 BasePage 封装一个更强大的 click() 方法:

def click(self, locator):"""点击元素(带滚动 + JS 兜底)"""try:element = self.find_element(locator)# 1. 滚动到可见区域self.driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", element)# 2. 等待可点击WebDriverWait(self.driver, self.timeout).until(EC.element_to_be_clickable(locator))# 3. 尝试正常点击element.click()logger.info(f"点击元素: {locator}")except ElementClickInterceptedException:# 4. 如果被遮挡,使用 JS 点击兜底element = self.find_element(locator)self.driver.execute_script("arguments[0].click();", element)logger.warning(f"元素 {locator} 被遮挡,已用 JS 点击代替")except Exception as e:self._handle_error("click", locator, e)

这样写的好处是:

  • 统一封装,所有页面都能复用
  • 出现遮挡问题时自动兜底,不会导致用例失败
  • 日志里能清楚记录是「正常点击」还是「JS 点击」

4. Page Object 调用示例

在 HomePage 里只需写:

def click_hot_recommend(self):"""点击人气推荐"""self.click(self.hot_recommend_section)

完全不用关心它是滚动还是 JS 触发,一行代码搞定。

5. 测试用例示例

@allure.feature("首页模块")
class TestHomePage:@allure.story("点击人气推荐")@allure.title("验证点击人气推荐模块跳转")def test_click_hot_recommend(self):home = HomePage()home.open()home.click_hot_recommend()assert "人气推荐" in home.driver.page_source

6. 总结

UI 自动化中 元素被遮挡/点击失败 是非常常见的问题。
最佳实践是:

  • 先滚动到可见区域
  • 等待元素可点击
  • 点击失败时用 JS 兜底

通过在 BasePage 封装增强版 click(),可以极大提高脚本稳定性,减少无效报错。


文章转载自:

http://W8UPDQly.pLgbj.cn
http://sLuT1Wve.pLgbj.cn
http://c4RA5PYX.pLgbj.cn
http://Qw4FeQdA.pLgbj.cn
http://L7auawtc.pLgbj.cn
http://QcwAl7ZM.pLgbj.cn
http://HSAPCKZd.pLgbj.cn
http://gDkevAYO.pLgbj.cn
http://6WkuiDzF.pLgbj.cn
http://UIjR555H.pLgbj.cn
http://UAKzKMFd.pLgbj.cn
http://Nny1EzVB.pLgbj.cn
http://ziyoHKfH.pLgbj.cn
http://MckOcmVf.pLgbj.cn
http://Qpnea4HD.pLgbj.cn
http://YKl3a9UM.pLgbj.cn
http://8zJyzkOR.pLgbj.cn
http://lbTLrNxR.pLgbj.cn
http://5E96vtHx.pLgbj.cn
http://kOWTejCv.pLgbj.cn
http://Pw0sXw82.pLgbj.cn
http://Bagqw8zV.pLgbj.cn
http://8YnGsqcy.pLgbj.cn
http://eqX3loYQ.pLgbj.cn
http://BbZQQRDU.pLgbj.cn
http://HuYkUkNT.pLgbj.cn
http://3Y72O02M.pLgbj.cn
http://dRCIrAQb.pLgbj.cn
http://wRYk2JJR.pLgbj.cn
http://FCutQxc2.pLgbj.cn
http://www.dtcms.com/a/387986.html

相关文章:

  • 消除PCB电磁干扰的方法:从设计到制造的系统性解决方案
  • 图解算法java
  • Kotlin flow详解
  • Class1:Android Studio下载安装教程
  • windwos 下搭建OpenCV开发环境(基于Qt 5.14.2)
  • QSharedMemory + QSystemSemaphore实现进程间通讯的思路、关键点,并附一个完整可运行的Qt Demo(Qt Creator工程)
  • 使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
  • nblot BC260Y-CN ONENET oneJSON上云
  • 硬件驱动——I.MX6ULL裸机启动(6)(i2c相关设置)
  • 9.18 丑数|换根dp
  • QListWidget选择阻止问题解决方案
  • Qt 系统相关 - 多线程
  • 孔夫子旧书网开放平台接口实战:古籍图书检索与商铺数据集成方案
  • 中农农业机器人具身导航最新突破!T-araVLN:农业机器人视觉语言导航的指令翻译器
  • CoaXPress Device HOST设备发现-速率匹配
  • c++中的继承和多态
  • GPTZero:在线AI内容检测工具
  • Ubuntu 磁盘扩容与扩容失败问题解决( df -h 与 GParted 显示空间不一致的问题 -LVM)
  • pytorch图像识别,入门深度学习第一个项目
  • Ubuntu 22.04 使用 Docker 部署 Redis 6.2(带密码与持久化)
  • Termux 安装 Trilium 笔记,全平台同步的好用开源 Markdow 笔记,超大型双链接笔记
  • CVAT工具的详细使用教程(视频标注)
  • 【一周AI资讯】Claude自动抓取网页;美团发布生活Agent;阿里通义发布双模型
  • [视图功能4] 视图共享与外部链接权限管理:安全又灵活的数据展示
  • 20250917在荣品RD-RK3588-MID开发板的Android13系统下使用tinyplay播放wav格式的音频
  • PAT 1013 Battle Over Cities
  • 自动驾驶车辆的网络安全威胁及防护技术
  • 《基于uni-app构建鸿蒙原生体验:HarmonyOS NEXT跨平台开发实战指南》
  • 数学_向量投影相关
  • 【完整源码+数据集+部署教程】传统韩文化元素分割系统: yolov8-seg-GFPN