Python Selenium Chromedriver点击新标签页后无法获取最新current_url
问题原因
你执行click()后代码会立刻向下执行,不会等待页面跳转完成,此时读取的driver.current_url自然还是跳转前的旧地址。
解决方案
方案1:显式等待URL变化(最适配你的需求)
使用Selenium自带的显式等待工具,等待URL发生变化后再读取地址,不会浪费多余等待时间,稳定性高。
首先导入依赖:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC
修改后的代码:
# 显式等待最大时长设为10秒,可根据页面加载速度自行调整 wait = WebDriverWait(driver, 10) for i in range(25): # 先保存点击前的旧URL old_url = driver.current_url driver.find_element(By.XPATH, f'//*[@id="listing_{i}"]').click() # 等待URL不等于旧URL后再继续执行 wait.until(EC.url_changes(old_url)) print(driver.current_url) # 如果需要返回列表页继续点击下一个元素,这里记得加返回操作,比如driver.back(),再等列表页加载完成
方案2:等待跳转后页面的指定元素加载完成
如果你能确定跳转后页面存在某个唯一的定位元素,也可以等待该元素出现后再读取URL,适合后续还要对新页面做操作的场景:
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, 10) for i in range(25): driver.find_element(By.XPATH, f'//*[@id="listing_{i}"]').click() # 替换成你跳转后页面的某个固定元素的定位 wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="跳转后页面的元素ID"]'))) print(driver.current_url)
特殊场景注意
如果点击后是打开新标签页而非当前页跳转,你还需要先切换到新标签页的句柄才能获取到新URL,示例如下:
for i in range(25): old_handles = driver.window_handles driver.find_element(By.XPATH, f'//*[@id="listing_{i}"]').click() # 等待新标签页出现 WebDriverWait(driver, 10).until(lambda d: len(d.window_handles) > len(old_handles)) new_handle = [h for h in driver.window_handles if h not in old_handles][0] # 切换到新标签页 driver.switch_to.window(new_handle) print(driver.current_url) # 用完记得关闭新标签页切回原列表页 driver.close() driver.switch_to.window(old_handles[0])
不推荐直接使用time.sleep(n)强行等待,固定等待时长很容易出现等待不足还是取到旧地址、或者等待过长浪费时间的问题
内容的提问来源于stack exchange,提问作者stevieg613
相关产品推荐
相关产品推荐

