Selenium防踩坑 - Element is not clickable at point...

1. 问题描述

在自动化测试中,我们操作元素最常用的动作是输入文本和单击元素。因此我们面临的常见错误之一:Element is not clickable at point...Other element would receive the click: 。在这篇文章中,我们将进行错误原因的分析和解决方案的讨论。

下面是发现此错误的代码示例:

import time
from selenium import webdriver


driver = webdriver.Chrome()
driver.get("http://www.baidu.com/")
driver.find_element_by_css_selector("#u1>a[name='tj_login']").click()
time.sleep(2)

driver.find_element_by_id("su").click()		# 执行点击“百度一下”时报错

time.sleep(2)
driver.quit()

-------------------------------------------------------
# 以下是错误提示信息
selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element <input type="submit" id="su" value="百度一下" class="bg s_btn"> is not clickable at point (709, 210). Other element would receive the click: <div style="position:absolute;top:0px;left:0px;width:100%;height:100%;z-index:-1;">...</div>
  (Session info: chrome=75.0.3770.80)

2. 原因分析

我们先来看一下错误时的界面:
在这里插入图片描述
显而易见,当我们试图点击【百度一下】,刚好被扫码登录的弹窗给挡住了(弹窗是位于元素基础层之上的另一层),在这种情况下,就会报错:Element is not clickable at point...Other element would receive the click:

3. 解决方案

现在我们已经了解到错误的原因,接下来我们来聊聊解决方案,如果元素被挡住的话有两种情况:

  1. 遮挡是临时的
    在这种情况下,我们可以添加等待,等待元素可被点击。具体方法可参考 Selenium系列教程 - 解读selenium等待方式Selenium系列教程 - WebDriverWait 详解以及自定义判断条件
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable(("id", "su")))
  2. 遮挡是永久的
    在这种情况下,我们可以调用 JavaScript 直接在元素上发送单击。调用 JavaScript 可参考 Selenium系列教程 - 调用JavaScript
    driver.execute_script("arguments[0].click()", element) (此为通用的解决方法)

在这里插入图片描述


在这里插入图片描述

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值