使用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
相关产品推荐
相关产品推荐

