You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Selenium无法点击Load More链接,触发element click intercepted错误

Selenium点击Load More链接失败问题排查与解决

问题描述

尝试使用Selenium多次点击Load More链接(该元素并非按钮),但无法成功点击。即便显式编写了wait.until(EC.element_to_be_clickable)等待元素可点击,仍出现错误提示:element click intercepted: Element is not clickable at point。

原始代码

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
import time
url = "https://www.architectural-review.com/buildings/house"
    
options = webdriver.ChromeOptions() 
driver = webdriver.Chrome()
driver.get(url)
    
# accept cookies
wait0 = WebDriverWait(driver, 10)
cookie_button = wait0.until(EC.element_to_be_clickable((By.XPATH,'/html/body/div[1]/div/div[6]/button[1]')))
cookie_button.click()
    
print("loading more projects ...")
count=5
wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.XPATH,'/html/body/div[2]/div/div[3]/section[5]/div/div[5]/a')))
print(element)
print("now element is clickable")
while count>1:
   element.click();
   count-=1
   print(count)

对应HTML结构

<div class="view-more">
    <a href="#" class="cpb-bottom-more-news-link dynamic-loader" data-term-id="869" data-block-id="7" data-offset="18" data-load-number="4" data-resulting-class="fourth-post" data-exclude="MzE4Mzk5LDMxODM2MCwzMTc2MDAsNjUyNjEsNjQzMTMsNjQzMTgsNjQyNzMsNjMyNTc=">Load More </a>
</div>

问题原因与解决方案

1. 绝对XPATH定位不稳定

你使用的是绝对路径/html/body/div[2]/div/div[3]/section[5]/div/div[5]/a,这种定位方式极易受页面结构变化影响,一旦页面元素层级调整,定位就会失效。建议改用相对定位,比如基于元素的class或文本:

  • CSS选择器:By.CSS_SELECTOR, "a.cpb-bottom-more-news-link.dynamic-loader"
  • 链接文本:By.LINK_TEXT, "Load More "(注意文本末尾的空格)

2. 元素被遮挡导致点击拦截

报错element click intercepted通常意味着目标元素被其他UI元素(如导航栏、弹窗、悬浮广告)遮挡。解决方法是先将元素滚动到可见区域,再执行点击:

# 滚动到元素可见
driver.execute_script("arguments[0].scrollIntoView(true);", element)

3. 点击后DOM重新渲染,元素对象失效

每次点击Load More后,页面会加载新内容,原有的element对象可能已经从DOM中移除或重新渲染,导致后续点击失效。需要在每次循环中重新等待并获取元素:

count = 5
wait = WebDriverWait(driver, 10)
while count > 1:
    # 每次循环重新定位元素
    element = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.cpb-bottom-more-news-link.dynamic-loader")))
    driver.execute_script("arguments[0].scrollIntoView(true);", element)
    element.click()
    count -= 1
    print(count)
    # 可选:等待加载动画完成(如果有)
    time.sleep(1)

4. 改用JavaScript点击

如果普通的click()方法仍失效,可以尝试通过JavaScript直接触发点击事件,绕过元素可见性的限制:

driver.execute_script("arguments[0].click();", element)

完整修改后的代码示例

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
import time

url = "https://www.architectural-review.com/buildings/house"
    
options = webdriver.ChromeOptions() 
driver = webdriver.Chrome(options=options)
driver.get(url)
    
# 接受cookie
wait0 = WebDriverWait(driver, 10)
cookie_button = wait0.until(EC.element_to_be_clickable((By.XPATH,'/html/body/div[1]/div/div[6]/button[1]')))
cookie_button.click()
    
print("loading more projects ...")
count = 5
wait = WebDriverWait(driver, 10)

while count > 1:
    try:
        # 用CSS选择器定位Load More链接
        element = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.cpb-bottom-more-news-link.dynamic-loader")))
        # 滚动到元素可见
        driver.execute_script("arguments[0].scrollIntoView(true);", element)
        # 用JS点击
        driver.execute_script("arguments[0].click();", element)
        count -= 1
        print(f"剩余点击次数:{count}")
        # 等待内容加载
        time.sleep(1.5)
    except Exception as e:
        print(f"点击失败:{e}")
        break

driver.quit()

内容的提问来源于stack exchange,提问作者icarus.z

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 21:15:32