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. 解决方案
现在我们已经了解到错误的原因,接下来我们来聊聊解决方案,如果元素被挡住的话有两种情况:
- 遮挡是临时的
在这种情况下,我们可以添加等待,等待元素可被点击。具体方法可参考 Selenium系列教程 - 解读selenium等待方式 和 Selenium系列教程 - WebDriverWait 详解以及自定义判断条件 。
WebDriverWait(driver, 10).until(EC.element_to_be_clickable(("id", "su")))
- 遮挡是永久的
在这种情况下,我们可以调用 JavaScript 直接在元素上发送单击。调用 JavaScript 可参考 Selenium系列教程 - 调用JavaScript 。
driver.execute_script("arguments[0].click()", element)
(此为通用的解决方法)