Selenium中点击Next按钮后如何检测页面是否加载完成(无需刷新)
解决方案:利用body的
data-wc-domready属性检测页面加载状态 既然页面加载时data-wc-domready会在false和true之间切换,我们可以通过等待这个属性的完整变化周期来确认页面加载完成,无需刷新页面。具体逻辑是:
- 点击Next按钮后,先等待
data-wc-domready变为false(确认页面开始加载新内容) - 再等待它变回
true(确认加载完成)
修改后的点击函数代码
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.common.exceptions import TimeoutException def click_next_button(driver, timeout=15): next_button_locator = (By.XPATH, "//button[@title='Go to next page']") next_button = WebDriverWait(driver, timeout).until(EC.element_to_be_clickable(next_button_locator)) # 滚动到按钮可见 driver.execute_script("arguments[0].scrollIntoView();", next_button) # 点击Next按钮 actions = ActionChains(driver) actions.move_to_element(next_button).click().perform() # 等待页面开始加载(data-wc-domready变为false) try: WebDriverWait(driver, timeout).until( lambda d: d.find_element(By.TAG_NAME, "body").get_attribute("data-wc-domready") == "false" ) except TimeoutException: # 若未检测到加载启动,可能是点击未生效或页面无变化,直接跳过 pass # 等待页面加载完成(data-wc-domready变回true) try: WebDriverWait(driver, timeout).until( lambda d: d.find_element(By.TAG_NAME, "body").get_attribute("data-wc-domready") == "true" ) except TimeoutException: # 加载超时,触发刷新重试 driver.refresh() # 刷新后重新等待Next按钮可点击,避免后续操作失败 WebDriverWait(driver, timeout).until(EC.element_to_be_clickable(next_button_locator))
关键逻辑说明
- 自定义等待条件:用
lambda表达式直接检测body元素的data-wc-domready属性值,适配页面的特殊加载标识,无需依赖通用的元素变化。 - 超时容错:针对加载启动和加载完成两个阶段分别设置超时,若任一阶段超时,自动触发页面刷新并恢复操作环境,避免程序崩溃。
- 兼容无变化场景:如果点击Next后页面未触发加载(比如已到最后一页),跳过“等待变为false”的步骤,直接确认状态为true即可。
备选方案:检测AJAX请求完成
如果data-wc-domready的状态变化不稳定,还可以通过JavaScript检测页面的AJAX活动:
# 等待所有AJAX请求完成(若页面使用jQuery) WebDriverWait(driver, timeout).until( lambda d: d.execute_script("return jQuery.active == 0;") ) # 或等待document readyState完成 WebDriverWait(driver, timeout).until( lambda d: d.execute_script("return document.readyState == 'complete';") )
内容的提问来源于stack exchange,提问作者Hao
相关产品推荐
相关产品推荐

