Python3使用Selenium Webdriver如何正确断言img标签src属性并定位logo.svg?
问题根因
原代码存在两处逻辑错误:
- 直接将字符串
logo.svg与find_element返回的WebElement对象做相等判断,二者类型完全不同,该判断逻辑本身不成立。 - 使用XPath全匹配
@src='../logo.svg'的方式定位元素极易失效:浏览器渲染页面时会自动将相对路径转换为绝对路径,或是实际部署后路径前缀发生变化,都会导致XPath匹配不到元素,触发NoSuchElementException。
正确实现步骤
步骤1:稳定定位目标img元素
优先使用id、class、alt等稳定属性定位,无上述属性时可使用contains做src的模糊匹配,Selenium 4推荐使用By类统一管理定位方式:
from selenium.webdriver.common.by import By # 模糊匹配src中包含logo.svg的img元素 img_element = context.driver.find_element(By.XPATH, "//img[contains(@src, 'logo.svg')]")
如果页面是异步渲染,建议增加显式等待,避免元素未加载完成导致的定位失败:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 最多等待10秒,直到目标元素出现 wait = WebDriverWait(context.driver, 10) img_element = wait.until(EC.presence_of_element_located((By.XPATH, "//img[contains(@src, 'logo.svg')]")))
步骤2:比对元素属性验证文件名称
通过WebElement的get_attribute方法获取实际的src属性值,再和目标文件名做比对:
import os expected_file = "logo.svg" # 获取元素实际src属性 actual_src = img_element.get_attribute("src") # 提取src中的文件名部分 actual_file = os.path.basename(actual_src) # 执行断言 assert actual_file == expected_file, f"图片文件不匹配,预期:{expected_file},实际:{actual_file}"
优化建议
- 若logo元素有
alt属性(比如值为公司logo),优先用该属性定位,稳定性远高于src匹配://img[@alt="公司logo"] - 若需要严格校验完整路径,可先拼接站点域名前缀再做全量比对,避免相对路径转换带来的匹配问题。
内容的提问来源于stack exchange,提问作者Seba Avalos
相关产品推荐
相关产品推荐

