Python Selenium通过ID和类名获取TD值提示无法定位元素求助
问题排查及解决方法
1. 优先检查元素加载时机问题
90%的unable to locate element报错都是因为代码执行时目标元素还没渲染完成,不要用固定时长的sleep,推荐使用Selenium显式等待,指定最长等待时间和目标元素的定位条件,只有元素加载完成后才会执行后续操作:
# 导入显式等待相关依赖 from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 最长等待10秒,直到ID为DeviceMACAddress的元素可见 wait = WebDriverWait(browser, 10) target_ele = wait.until(EC.visibility_of_element_located((By.ID, "DeviceMACAddress"))) print(target_ele.text)
如果是Selenium3版本,也可以兼容旧写法:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(browser, 10) target_ele = wait.until(lambda x: x.find_element_by_id("DeviceMACAddress")) print(target_ele.text)
2. 检查元素是否嵌套在iframe/frame中
如果目标内容是嵌套在页面的iframe框架内,直接在顶层DOM查找是找不到元素的,需要先切换到对应iframe再执行查找:
# 先查找页面上的所有iframe,也可以根据iframe的id、name、索引定位 iframe = browser.find_element_by_tag_name("iframe") # 切换到iframe browser.switch_to.frame(iframe) # 再执行元素查找操作 themac1 = browser.find_element_by_id("DeviceMACAddress").text print(themac1) # 操作完成后如果要切回顶层DOM,执行下面的代码 # browser.switch_to.default_content()
3. 检查Selenium版本兼容性
Selenium 4.0及以上版本已经废弃了find_element_by_id、find_element_by_class_name这类直接通过后缀指定定位方式的写法,强制要求统一用find_element(By.定位方式, "值")的写法,旧写法执行时会报错,正确写法如下:
from selenium.webdriver.common.by import By # 查找元素 themac1 = browser.find_element(By.ID, "DeviceMACAddress").text print(themac1)
其他注意事项
- 你的代码里调用
get_attribute("value")的用法是错误的,只有input、select这类表单元素才有value属性,你要获取的MAC地址是<font>标签的文本内容,直接取.text属性即可 - 可以先打印当前页面的完整HTML源码,确认你要找的ID
DeviceMACAddress确实存在于当前的DOM结构中,排除页面渲染异常的问题
内容的提问来源于stack exchange,提问作者Youngbuck2
相关产品推荐
相关产品推荐

