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

使用Selenium点击ScienceDirect每页100条按钮时出现无提示TimeoutException

解决ScienceDirect分页按钮触发TimeoutException的问题

以下是针对该问题的排查方向和具体解决方法:

1. 验证元素定位器的准确性

TimeoutException大概率是定位器没匹配到目标元素。先核对你的定位代码和实际HTML结构:

  • 检查按钮文本是否完全一致(比如是否有空格、全角/半角标点差异)
  • 优先使用稳定的业务属性定位(比如data-page-size),替代易变的文本定位:
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    wait = WebDriverWait(driver, 20)
    # 用CSS选择器匹配data-page-size属性为100的按钮
    per_page_btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[data-page-size='100']")))
    per_page_btn.click()
    

2. 等待搜索结果异步加载完成

ScienceDirect的搜索结果是动态渲染的,不能只等页面loaded状态,必须等结果列表出现后再找分页按钮:

# 先等待搜索结果容器加载(替换成实际结果列表的选择器)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "ol.search-results")))
# 再定位并点击分页按钮
per_page_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), '每页100条结果')]")))
per_page_btn.click()

3. 滚动到按钮可见区域

分页按钮在页面底部,默认可能不在视窗内,Selenium无法点击不可见元素,需先滚动定位:

per_page_btn = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "button[data-page-size='100']")))
# 执行JS滚动到元素位置
driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", per_page_btn)
# 确保元素可点击后再点击
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[data-page-size='100']"))).click()

4. 检查是否存在iframe嵌套

如果分页按钮被嵌套在iframe中,必须先切换到iframe上下文才能定位:

# 定位目标iframe(根据实际的id/name/class替换)
iframe = wait.until(EC.presence_of_element_located((By.ID, "content-frame")))
driver.switch_to.frame(iframe)
# 定位并点击按钮
per_page_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[text()='每页100条结果']")))
per_page_btn.click()
# 操作完成后切回主文档
driver.switch_to.default_content()

5. 规避网站反爬机制

ScienceDirect有反爬检测,可通过以下方式降低触发概率:

  • 添加真实用户代理:
    from selenium.webdriver.chrome.options import Options
    
    opts = Options()
    opts.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36")
    driver = webdriver.Chrome(options=opts)
    
  • 避免连续极速操作,在搜索提交后加短暂等待(不要替代显式等待,仅作辅助):
    import time
    time.sleep(2)
    

6. 延长显式等待超时时间

如果之前设置的超时时间过短(比如5秒),延长到20秒给页面足够加载时间:

# 把超时时间从默认10秒调整为20秒
wait = WebDriverWait(driver, 20)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 03:25:22