You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Playwright中获取SVG元素className返回空字典问题求助

问题描述

有一个SVG元素:

<svg class="class-a color-green marker" .../>

在Playwright中使用page.locator(".status-marker").first可以正常定位元素,但调用evaluate("node => node.className")时返回空字典——尽管元素实际存在类名(is_visible()返回True,outerHTML能看到完整类名)。

尝试用expect(locator).to_have_class()断言单个类时失败,因为该方法需要传入全部类名才能通过,但部分类是动态生成的无法预知。

复现示例(基于Svelte-FA插件):

def test_svelte_fa(page):
    page.goto("https://cweili.github.io/svelte-fa/")
    item = page.locator(".svelte-fa").first
    assert item.is_visible()
    assert "svelte-fa" in item.evaluate("node => node.className")

运行后第二个断言失败,因为item.evaluate("node => node.className")返回空字典,但实际元素类名包含svelte-fa。

原因分析

浏览器中element.className返回的是DOMTokenList对象,而非字符串。Playwright序列化该对象时,由于DOMTokenList的核心内容并非可枚举属性,最终返回空字典,导致无法正确获取类名。

解决方案

1. 正确获取类名的方式

通过evaluate调用时,将DOMTokenList转换为字符串或数组:

  • 获取完整类名字符串:node.className.toString()
  • 获取类名数组(方便检查单个类):Array.from(node.classList)

2. 断言单个类存在的方法

  • 方式一:通过evaluate直接断言
    在evaluate中检查类是否存在于classList:
    assert item.evaluate("node => node.classList.contains('svelte-fa')")
    
  • 方式二:使用正则匹配的to_have_class
    to_have_class支持传入正则表达式,无需匹配全部类名:
    import re
    expect(item).to_have_class(re.compile(r'\bsvelte-fa\b'))
    
    其中\b是单词边界,避免匹配到包含svelte-fa的其他类名。
修改后的复现测试用例
def test_svelte_fa(page):
    page.goto("https://cweili.github.io/svelte-fa/")
    item = page.locator(".svelte-fa").first
    assert item.is_visible()
    
    # 验证类名字符串包含目标类
    class_str = item.evaluate("node => node.className.toString()")
    assert "svelte-fa" in class_str
    
    # 验证类名数组包含目标类
    class_list = item.evaluate("node => Array.from(node.classList)")
    assert "svelte-fa" in class_list
    
    # 用正则断言类存在
    import re
    expect(item).to_have_class(re.compile(r'\bsvelte-fa\b'))
    
    # 直接在evaluate中检查类是否存在
    assert item.evaluate("node => node.classList.contains('svelte-fa')")

内容的提问来源于stack exchange,提问作者Djent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 02:18:08