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

