解决selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted

用selenium爬数据的时候,明明每一步点击都加了WebDriverWait,但还是爬一会儿就显示如下错误:

selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element <tr class="even" onclick="onclick_shipinsp(this,'insp')">...</tr> is not clickable at point (509, 404). Other element would receive the click: <div class="blockUI blockOverlay ui-widget-overlay" style="z-index: 1000; position: fixed; opacity: 0;"></div>
  (Session info: chrome=110.0.5481.178)

这里一定要注意后面的这句

“ Other element would receive the click: <div class="blockUI blockOverlay ui-widget-overlay" style="z-index: 1000; position: fixed; opacity: 0;"></div>
  (Session info: chrome=110.0.5481.178)

也就是说我们想点击的按钮没点成,而是被这个覆盖了。
查资料得知:

blockUI 是一个 JavaScript 库,用于创建可定制的页面遮罩和加载指示器。它提供了一个简单的方式来阻止用户在页面加载或执行某些任务时进行交互,并显示一个加载指示器,以提示用户页面正在处理。

解决尝试一:
加一个异常处理块,这里try块中是之前报错的地方,一旦出现异常则对之前bug说明里出现的元素进行隐藏,然后再次尝试点击。

try:
    driver.find_element(By.XPATH,xpath_pattern).click()
except:
    wait = WebDriverWait(driver, 100)
    element = wait.until(EC.visibility_of_element_located((By.CLASS_NAME, 'blockUI blockOverlay ui-widget-overlay')))
    driver.execute_script("arguments[0].style.display = 'none';", element)
    try:
    driver.find_element(By.XPATH,xpath_pattern).click()

尝试之后:比之前多撑了一会儿但在except块中还是会报错找不到元素。

解决尝试二:

        for i in range(3):
            try:
                click_button(driver, index_xpath)
                break
            except:
                # 如果点击元素失败,检查元素是否存在且可见
                block_overlay = driver.execute_script(
                    "return document.querySelector('.blockUI.blockOverlay.ui-widget-overlay')")
                if block_overlay and block_overlay.is_displayed():
                    # 如果元素存在且可见,隐藏元素
                    driver.execute_script(
                        "document.querySelector('.blockUI.blockOverlay.ui-widget-overlay').style.display='none';")
                try:
                    click_button(driver, index_xpath)
                    break
                except:
                    # 如果还是失败,等待一段时间再尝试
                    time.sleep(10)

目前这种解决方法暂时可行。学习爬虫不久,有更好方法的朋友欢迎指教。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值