如何用Selenium提取span标签title属性中的目标数值
问题:Selenium无法定位JavaScript生成的span元素并提取title属性值
需要提取由DEAL_SUMMARY_HEADER3组件生成的<span>标签的title属性值£19,649,981.19,页面可正常访问,但使用指定XPath查找元素时返回空列表。
待提取元素的HTML代码
<span title="£19,649,981.19" class="right-Align">£19,650.0k</span>
原使用的XPath信息
XPATH: //*[@id="HEADER_HEADER_3_ADVANCE_HEADER_0LOAN_OUTSTANDING"]/span Full XPATH: /html/body/div[3]/div[3]/div[1]/headers/div/header[1]/div/div/div[1]/div[1]/h1/span/span
原测试代码及输出
测试代码
import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.edge.service import Service as EdgeService from webdriver_manager.microsoft import EdgeChromiumDriverManager # Setup Edge WebDriver edge_service = EdgeService(EdgeChromiumDriverManager().install()) driver = webdriver.Edge(service=edge_service) try: WebDriverWait(driver, 30).until(EC.url_contains("dashboard")) desired_url = "Example.com" driver.get(desired_url) time.sleep(10) print("Title of the Webpage is =", driver.title) span_elements = driver.find_elements(By.XPATH, '/html/body/div[3]/div[3]/div[1]/headers/div/header[1]/div/div/div[1]/div[1]/h1/span/span') print(span_elements) span_elements1 = driver.find_elements(By.XPATH, '//*[@id="HEADER_HEADER_3_ADVANCE_HEADER_0LOAN_OUTSTANDING"]/span') print(span_elements1) finally: # Close the browser driver.quit()
输出结果
Title of the Webpage is =Overview Data [] []
解决方法
1. 修正页面访问逻辑
原代码先等待URL包含"dashboard"再跳转目标页面,逻辑错误,应先访问目标URL再等待加载完成:
desired_url = "Example.com" driver.get(desired_url) # 等待页面加载完成,验证标题或关键元素 WebDriverWait(driver, 30).until(EC.title_contains("Overview Data"))
2. 替换固定等待为显式等待
time.sleep(10)无法保证元素已渲染完成,改用显式等待针对目标元素:
# 等待元素可见 target_span = WebDriverWait(driver, 30).until( EC.visibility_of_element_located((By.XPATH, '//span[@class="right-Align"]')) ) # 提取title属性值 amount = target_span.get_attribute("title")
3. 优化XPath定位规则
原XPath依赖父元素ID或绝对路径,易因页面结构变化失效,改用更稳定的定位方式:
- 按class+属性组合定位:
//span[@class="right-Align" and contains(@title, "£")] - 若元素唯一,可简化为:
//span[@class="right-Align"]
4. 检查并处理iframe嵌套
若元素位于iframe内,需先切换到iframe再定位:
try: iframe = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "iframe"))) driver.switch_to.frame(iframe) except: pass # 无iframe则跳过
操作完成后需切回主文档:driver.switch_to.default_content()
修改后的完整测试代码
import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.edge.service import Service as EdgeService from webdriver_manager.microsoft import EdgeChromiumDriverManager # Setup Edge WebDriver edge_service = EdgeService(EdgeChromiumDriverManager().install()) driver = webdriver.Edge(service=edge_service) try: desired_url = "Example.com" driver.get(desired_url) # 等待页面加载完成 WebDriverWait(driver, 30).until(EC.title_contains("Overview Data")) print("Title of the Webpage is =", driver.title) # 检查并切换到iframe(如果存在) try: iframe = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "iframe"))) driver.switch_to.frame(iframe) print("Switched to iframe") except: print("No iframe found") # 定位目标元素并提取title值 target_span = WebDriverWait(driver, 30).until( EC.visibility_of_element_located((By.XPATH, '//span[@class="right-Align"]')) ) extracted_amount = target_span.get_attribute("title") print("Extracted amount:", extracted_amount) finally: # 切回主文档(若切换过iframe) driver.switch_to.default_content() # 关闭浏览器 driver.quit()
内容的提问来源于stack exchange,提问作者Manas Dubey
相关产品推荐
相关产品推荐

