selenium报错Element is not clickable at point及四种解决方法
selenium报错Element is not clickable at point及四种解决方法
使用Selenium时,触发点击事件,经常报如下异常:
Element is not clickable at point
1、未加载
没加载出来就等待元素加载出来,再往下执行。
可以使用python库time
不过最好还是使用selenium自带WebDriverWait
2、在iframe里
如果元素在iframe里,在窗口里找是找不到元素的,更是无法点击。所以,要切换到iframe里去找元素。
3、不在视窗里,需要拉滚动条
很多网站的列表页不是立马返回所有内容,是根据视图来显示的。所以,我们就需要拖动滚动条来把要获取的内容显示到视窗里才可以获取到。
js="var q=document.documentElement.scrollTop=100000" driver.execut_script(js)
#滑动到顶部 js="var q=document.documentElement.scrollTop=0" driver.execut_script(js)
#滑到底部 js="window.scrollTo(0,100000)" driver.execute_script(js)
#滑动到顶部 js="window.scrollTo(0,0)" driver.execute_script(js)
目前在firefox,chrome上验证都是可以跑通的
4、要点击的元素被覆盖
可以使用事件链来解决
例如下拉菜单,通过hover,让子菜单显示,就可以点击了。
menu = driver.find_element_by_css_selector(".nav")
hidden_submenu = driver.find_element_by_css_selector(".nav #submenu1")
ActionChains(driver).move_to_element(menu).click(hidden_submenu).perform()
5、要点击的元素被遮挡
如图:无法点击go,被前面的悬浮元素遮挡
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)
(此为通用的解决方法)