【错误】Selenium报错:Element is not clickable at point(x, y)原因及解决办法汇总
1. 背景
2. 问题简述(可以略过)
2. 最大化浏览器窗口
3. 元素还未加载
4. 元素在iframe里面
5. 不在视图,下拉滚动条
6. 元素被覆盖
7. 参考资料
1. 背景
因为最近在组队学习爬虫,需要用Selenium模拟登录丁香园,其中在尝试运行一位小伙伴的代码的时候,发现自己电脑上(win10台式机)始终会Selenium报错:Element is not clickable at point(x, y)。很是奇怪,小伙伴上面运行没有问题,到自己这里就无法定位元素点击了。经过2h多的摸索和尝试排除,终于找到了解决办法,然后顺带Google一下其他的原因,一起汇总如下:希望以后遇到相似问题的小伙伴能少走弯路。
2. 问题简述(可以略过)
Element is not clickable at point(x, y)这种问题通常出现在使用Chrome驱动程序,因为Chrome浏览器使用点位置。 当元素位置未固定且我们尝试对该特定元素执行某些操作时,将导致错误为Element is not clickable at point (xx, xx). Other element would receive the click。当元素加载到DOM中,但UI上的位置不固定时,就会发生这样的错误。 可能存在一些未完全加载的其他div或图像或广告。 ChromeDriver总是尝试单击元素的中间部分。 有一些方法可以解决这个问题。 但要确保最好和最简单的解决方案是找出解决问题的确切原因。 我们需要弄清楚div / image的哪个部分需要时间来加载。 在单击元素之前,我们需要确保元素存在于DOM中,在UI中可见,最后一个是Position是固定的。 当元素位置固定时,问题就解决了。 如果要检查,请尝试Thread.sleep或在调试模式下验证。 下面列出问题及解决方案。
# 强制等待 from time import sleep sleep(t)# 让线程休眠t秒# 隐式等待 from selenium import webdriverff = webdriver.Firefox() ff.implicitly_wait(10)# seconds ff.get("http://somedomain/url_that_delays_loading") myDynamicElement = ff.find_element_by_id("myDynamicElement")# 显示等待,Selenium自带的WebDriverWait from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0 from selenium.webdriver.support import expected_conditions as EC # available since 2.26.0ff = webdriver.Firefox() ff.get("http://somedomain/url_that_delays_loading") try:element = WebDriverWait(ff,10).until(EC.presence_of_element_located((By.ID,"myDynamicElement"))) finally:ff.quit()