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

Selenium点击下一页按钮出现ElementNotInteractable错误求助

问题分析与修复方案

核心问题排查

  1. 循环逻辑混乱:你在遍历单个产品时就递增current_page并触发翻页,导致刚爬第一个产品就切换页面,完全破坏了分页爬取的流程。
  2. 元素不可见根源:is_displayed()返回False说明下一页按钮不在可视区域,固定滚动到200px的位置无法保证按钮完全显示,且缺少等待元素就绪的步骤。
  3. 旧版API兼容问题:代码中使用find_elements_by_tag_name这类Selenium旧API,建议替换为新版方法以适配最新驱动。

具体修复步骤

  • 调整循环顺序:将翻页和current_page递增操作移到当前页所有产品爬取完成后,确保一页数据全量抓取后再切换页面。
  • 精准滚动定位:通过JavaScript将页面滚动到下一页按钮的位置,而非固定值,确保元素进入可视区域。
  • 添加显式等待:等待下一页按钮可见且可交互,避免因页面未加载完成导致的点击失败。
  • 修正元素定位:下一页的可点击元素是<li>内的<a>标签,直接点击<li>可能无效,需定位到实际交互节点。

修改后的完整代码

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd
import time

options = Options()
options.headless = False
user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36'
options.add_argument(f'user-agent={user_agent}')
options.add_argument('window-size=1920x1080')

website = 'https://www.promoopcion.com/bebidas/termos.html'
path = '/Users/diegotrigal/OneDrive/00000001_HDD_TOSHIBA/diegotrigal/PYHTON/chromedriver'
driver = webdriver.Chrome(path, options=options)
driver.get(website)
driver.maximize_window()
wait = WebDriverWait(driver, 10)  # 初始化显式等待,最长等待10秒

last_page = 8
current_page = 1

product_name = []
product_sku = []

while current_page <= last_page:
    print(f"正在爬取第 {current_page} 页")
    # 等待产品列表加载完成
    container = wait.until(EC.presence_of_element_located((By.XPATH, '//div[contains(@class, "products-list")]')))
    productos = container.find_elements(By.XPATH, './/li[contains(@class, "product-item")]')  # 精确匹配产品节点

    for product in productos:
        # 等待产品名称和SKU元素可见
        name = product.find_element(By.CLASS_NAME, "product-item-name").text
        sku = product.find_element(By.CLASS_NAME, "product-sku").text
        product_name.append(name)
        product_sku.append(sku)

    # 当前页爬取完成后执行翻页
    if current_page < last_page:
        try:
            # 定位下一页的a标签
            next_page_btn = wait.until(EC.presence_of_element_located((By.XPATH, '//li[contains(@class, "pages-item-next")]/a')))
            # 滚动到按钮位置,确保可见
            driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", next_page_btn)
            time.sleep(1)
            # 优先直接点击,失败则用JS绕过交互限制
            try:
                next_page_btn.click()
            except:
                driver.execute_script("arguments[0].click();", next_page_btn)
            # 等待页面切换完成(旧容器失效则说明新页面加载)
            wait.until(EC.staleness_of(container))
        except Exception as e:
            print(f"翻页失败: {str(e)}")
            break
    current_page += 1

df_productos = pd.DataFrame({'Nombre': product_name, 'SKU': product_sku})
df_productos.to_csv('termos.csv', index=False)

driver.quit()

额外说明

  • 显式等待优势:相比隐式等待,显式等待可针对特定元素等待其就绪状态,减少无效等待时间。
  • JS点击兜底:若元素被浮层、弹窗遮挡,直接点击失败时,JavaScript点击可绕过部分前端交互限制。
  • 页面切换验证:通过staleness_of等待旧产品容器失效,确保新页面完全加载后再继续爬取,避免数据重复或遗漏。

内容的提问来源于stack exchange,提问作者Tupsi Trinidad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:40:37