使用Python+Selenium获取元素值比较时报NoneType错误如何解决?
错误根因
你调用get_attribute('value')返回None是因为<span>标签没有value属性,value属性仅适用于<input>、<select>这类表单元素,<span>的展示内容属于元素文本,不能通过value获取。
解决思路
- 替换取值方式:用元素的
.text属性,或者get_attribute('textContent')获取span的文本内容再转整数。 - 优化元素定位:你当前用的绝对路径XPath稳定性极差,页面结构稍有调整就会定位失败,目标元素已经有唯一id属性,直接用id定位更可靠。
- 循环内实时取值:你现在只在循环外获取了一次元素的内容,后续循环判断用的都是初始值,不会随页面更新,必须把取值逻辑放到循环内部。
正确代码示例
首先导入依赖模块(Selenium 4.x+ 推荐使用By类做元素定位):
from selenium.webdriver.common.by import By # 如果需要加等待避免元素未加载报错,可导入以下两个模块 from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC
业务代码:
注:如果你的浏览器驱动实例变量名是
window,将代码中的driver替换为你自己的变量名即可。
while True: # 每次循环都重新获取最新的元素和值 mapx = driver.find_element(By.ID, "map_x") mapy = driver.find_element(By.ID, "map_y") # 提取文本并转整数,strip()是为了去除可能存在的空格换行 x_val = int(mapx.text.strip()) y_val = int(mapy.text.strip()) # 不满足循环条件时跳出 if x_val == 1 or y_val > 40: break # 这里写你要执行的循环逻辑 # ------------ # 你的循环逻辑代码 # ------------
可选优化
如果页面加载慢可能出现元素未找到的情况,可以加显式等待确保元素加载完成再取值,示例:
# 最长等待10秒,直到元素出现再返回 wait = WebDriverWait(driver, 10) mapx = wait.until(EC.presence_of_element_located((By.ID, "map_x")))
如果存在span文本可能有非数字内容的场景,可以加try-except捕获转换整数的异常,避免程序直接崩溃。
内容的提问来源于stack exchange,提问作者Sadboy
相关产品推荐
相关产品推荐

