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

Selenium页面跳转后无法识别下一页元素问题咨询

问题现象

编写Selenium自动化翻页脚本,预期实现逻辑:访问指定Kijiji租房列表页,循环查找title属性为Next的下一页按钮并触发点击,遍历最多10页,找不到下一页元素时输出Done结束运行。实际运行时第一页跳转正常,进入第二页后Selenium无法识别目标元素,直接触发异常分支打印Done终止。
问题复现代码:

path = "C:\Program Files (x86)\chromedriver.exe"
driver = webdriver.Chrome(path)
loop = 10

##Navigating to the website
driver.get("https://www.kijiji.ca/b-apartments-condos/mississauga-peel-region/page-/c37l1700276?ad=offering&price=__1780")

while loop > 0 :
    try:
        time.sleep(5)
        next = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.XPATH, "//a[@title='Next']"))
        )
        next.send_keys(Keys.RETURN)
        loop = loop - 1
    except:
        time.sleep(7.5)
        loop = loop - 100
        print('Done')
故障原因
  • 元素等待逻辑错误:presence_of_element_located仅校验元素存在于DOM树,不要求元素可见、可交互。第二页加载过程中很可能先匹配到隐藏的、未渲染完成的无效Next节点,后续操作直接报错。
  • 点击逻辑不稳定:对a标签发送Keys.RETURN模拟回车的触发方式依赖页面焦点,页面跳转后焦点错位很容易导致点击失效,甚至触发非预期行为。
  • 异常捕获逻辑有缺陷:裸写except会吞掉所有类型的异常,不管是元素不可点击、点击被遮挡、时序错误,都会走到打印Done的分支,无法区分是真的到了最后一页,还是代码运行报错。
  • 时序控制缺失:点击跳转后没有等待新页面加载完成,直接进入下一轮循环时,DOM还停留在旧页面卸载的中间状态,很容易出现定位失败。
  • 路径存在转义隐患:Windows路径字符串直接写在Python代码中,\是转义字符,路径解析本身就存在不稳定问题。
修复方案
  • ChromeDriver路径使用原始字符串,避免转义错误。
  • 将元素等待条件替换为element_to_be_clickable,同时在XPath中过滤掉置灰不可用的Next按钮,确保定位到的是有效可交互元素。
  • 改用Selenium原生click()方法触发跳转,点击前先滚动到按钮位置,避免页面悬浮栏遮挡导致点击无效。
  • 点击后等待旧页面的Next按钮失效,确认新页面加载完成后再进入下一轮循环,解决时序错位问题。
  • 仅捕获元素等待超时的特定异常,只有真的找不到可点击的下一页按钮时,才判定为翻页结束输出Done,其余运行错误正常抛出方便排查。

修复后可运行代码:

from selenium.common.exceptions import TimeoutException

# 路径加r前缀标记为原始字符串,规避转义问题
path = r"C:\Program Files (x86)\chromedriver.exe"
driver = webdriver.Chrome(path)
max_page_count = 10
current_page = 1

driver.get("https://www.kijiji.ca/b-apartments-condos/mississauga-peel-region/page-/c37l1700276?ad=offering&price=__1780")

while current_page <= max_page_count:
    try:
        # 等待可点击的、未禁用的下一页按钮
        next_btn = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, "//a[@title='Next' and not(contains(@class,'disabled'))]"))
        )
        # 滚动到按钮位置,避免遮挡
        driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", next_btn)
        time.sleep(0.3)
        next_btn.click()
        # 等待旧按钮失效,确认页面完成跳转
        WebDriverWait(driver, 10).until(EC.staleness_of(next_btn))
        current_page += 1
    except TimeoutException:
        print("Done")
        break

# 运行结束关闭浏览器
driver.quit()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:36:21