Selenium点击页面后驱动未更新,无法获取新页面元素如何解决?
问题
我正在构建一个简单的网页爬虫,希望实现以下流程:在网页中输入数值,按下回车键,待新页面加载完成后抓取页面信息。目前,初始化加载网页、输入数值并按下回车键的操作均正常,但新页面加载后,driver似乎未更新状态,导致无法抓取新页面的信息。
相关代码如下:
import selenium.webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys test_wage = float(53109.22) options = selenium.webdriver.FirefoxOptions() options.add_argument("--headless") driver = selenium.webdriver.Firefox(options=options) driver.get('https://www.thesalarycalculator.co.uk/salary.php') takehome_form = driver.find_element(By.CLASS_NAME, "hero__input") takehome_form.send_keys(test_wage) takehome_form.send_keys(Keys.RETURN)
执行以下代码时出现问题:
result = driver.find_element(By.XPATH, "/html/body/section[1]/div/table/tbody/tr[2]/td[6]")
报错信息:
NoSuchElementException: Unable to locate element: /html/body/section[1]/div/table/tbody/tr[2]/td[6]; For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception
我认为原因是原网页不存在该元素,而按下回车键加载的新页面包含该元素,但driver未更新状态,仍认为当前是原网页。请问该如何解决此问题?
解决方法
核心问题并非driver状态未更新,而是页面跳转后元素还未渲染完成就执行查找操作,同时你使用的绝对XPATH过于脆弱。以下是具体解决方案:
1. 添加显式等待确保元素加载
Selenium不会自动等待页面完全加载,按下回车后页面跳转需要时间,直接查找元素会因为元素未渲染报错。使用WebDriverWait等待目标元素出现后再操作:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 按下回车后,等待目标元素加载,最长等待10秒 wait = WebDriverWait(driver, 10) result = wait.until(EC.presence_of_element_located((By.XPATH, "/html/body/section[1]/div/table/tbody/tr[2]/td[6]"))) print(result.text)
2. 替换为稳定的相对XPATH
绝对路径XPATH依赖页面完整结构,稍有变动就会失效。建议换成基于元素文本或属性的相对定位,比如目标元素是税后薪资行的第6列:
# 定位包含"Take Home"文本的行,再取第6列 result = wait.until(EC.presence_of_element_located((By.XPATH, "//tr[contains(td, 'Take Home')]/td[6]")))
3. 验证页面跳转完成(可选)
如果页面跳转后URL发生变化,可以先等待URL更新,再查找元素:
# 等待URL包含"results"(假设跳转后的URL有该关键词) wait.until(EC.url_contains("results")) # 再执行元素查找 result = driver.find_element(By.XPATH, "//tr[contains(td, 'Take Home')]/td[6]")
内容的提问来源于stack exchange,提问作者KGreen
相关产品推荐
相关产品推荐

