Selenium点击按钮页面重载后driver.page_source仍返回旧内容如何解决?
问题原因
点击触发页面重载后,time.sleep() 只是固定时长等待,无法准确判断DOM是否完成更新:如果是整页跳转,可能页面还在加载过程中你就调用了driver.page_source;如果是单页应用局部刷新,DOM的异步渲染逻辑还没执行完成,拿到的自然还是旧页面的源码。
解决方法
1. 替换固定等待为显式等待(最常用方案)
放弃time.sleep(),改用Selenium内置的显式等待逻辑,先确认页面完成重载/更新,再获取页面源码:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By driver = webdriver.Chrome(ChromeDriverManager().install()) driver.get(base_listing_url) # 点击前先获取旧页面的body元素 old_body = driver.find_element(By.TAG_NAME, 'body') driver.find_element(By.CSS_SELECTOR, '.fTomoL').click() # 等待旧body失效,确认页面已经开始重载 WebDriverWait(driver, 20).until(EC.staleness_of(old_body)) # 额外等待新页面独有的特征元素加载完成,确保DOM渲染完毕 WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, '新页面独有的元素选择器'))) print(driver.page_source)
2. 新标签页跳转场景补充逻辑
如果点击按钮后是打开了新标签页加载内容,需要手动切换driver的上下文到新标签页:
# 点击后获取所有打开的标签页句柄 all_handles = driver.window_handles # 切换到最新打开的标签页 driver.switch_to.window(all_handles[-1]) # 再执行上述的显式等待和源码获取逻辑
3. 单页应用局部刷新场景调整
如果是单页应用的局部内容重载(没有整页刷新),只需等待对应更新区域的内容发生变化即可:
# 点击前获取刷新区域的旧内容 old_content = driver.find_element(By.CSS_SELECTOR, '待刷新区域的元素选择器').text driver.find_element(By.CSS_SELECTOR, '.fTomoL').click() # 等待区域内容发生变更 WebDriverWait(driver, 20).until(lambda d: d.find_element(By.CSS_SELECTOR, '待刷新区域的元素选择器').text != old_content) print(driver.page_source)
内容的提问来源于stack exchange,提问作者sergeymailer sergeymailer
相关产品推荐
相关产品推荐

