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

3,213 阅读1分钟

主要内容

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) (此为通用的解决方法)

在这里插入图片描述


在这里插入图片描述