老王今天在用 Selenium + Chrome 处理一个爬虫问题时,调用了一个元素的 click() 方法模拟点击事件,但是有些时候代码会返回 error: Message: element click intercepted 的错误。本文分享下错误原因和解决方法。
一、问题描述与原因
代码:
_browser.find_element_by_id('opt204163622').click()
错误信息:
error: Message: element click intercepted: Element <li class=””>…</li> is not clickable at point (407, 585). Other element would receive the click: <image width=”198px” height=”22px” preserveAspectRatio=”xMidYMid slice”></image>
(Session info: headless chrome=86.0.4240.111)
这个错误并不是 100% 出现的,有时候代码能得到期望的结果,有时候则会返回错误。错误的原因从错误信息里也能清楚看出来:所选的元素并不能点击,因为它被另一个元素覆盖了。
二、问题解决方法
出现这个问题的原因是网页还没有加载成功,所以主要找到两个解决思路:
- 等待网站加载完成
- 使用另一个方式调用 Selenium click 事件
解决方法一:
设置 Selenium 等待时间:browser.set_page_load_timeout(60)
,并通过 time.sleep(30)
来等待网站加载,但是还是不能 100% 解决问题。
解决方法二:
使用另一个调用 click 事件的方法代替 click() 方法:
_item = _browser.find_element_by_id('opt204163622') _browser.execute_script("arguments[0].click();", _item)
这个调用方法是老王自己亲自试用的,100% 解决了之前 element click intercepted 的问题。
网上还有一种方案也可以代替 click() 方法解决这个错误,大家也可以尝试下:
element = driver.find_element_by_id('opt204163622') webdriver.ActionChains(driver).move_to_element(element ).click(element ).perform()