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
相关产品推荐
相关产品推荐

