Selenium点击下一页按钮出现ElementNotInteractable错误求助
问题分析与修复方案
核心问题排查
- 循环逻辑混乱:你在遍历单个产品时就递增
current_page并触发翻页,导致刚爬第一个产品就切换页面,完全破坏了分页爬取的流程。 - 元素不可见根源:
is_displayed()返回False说明下一页按钮不在可视区域,固定滚动到200px的位置无法保证按钮完全显示,且缺少等待元素就绪的步骤。 - 旧版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
相关产品推荐
相关产品推荐

