From 6ee07c06ecb10dac9d0f19c8d3345bc03dc448fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20M=C3=BCller?= <67061560+MagMueller@users.noreply.github.com> Date: Thu, 23 Oct 2025 18:29:05 -0700 Subject: [PATCH] SVG fix --- browser_use/dom/serializer/serializer.py | 50 ++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/browser_use/dom/serializer/serializer.py b/browser_use/dom/serializer/serializer.py index ae5bf4ef3..1c2cec6e9 100644 --- a/browser_use/dom/serializer/serializer.py +++ b/browser_use/dom/serializer/serializer.py @@ -17,6 +17,26 @@ from browser_use.dom.views import ( DISABLED_ELEMENTS = {'style', 'script', 'head', 'meta', 'link', 'title'} +# SVG child elements to skip (decorative only, no interaction value) +SVG_ELEMENTS = { + 'path', + 'rect', + 'g', + 'circle', + 'ellipse', + 'line', + 'polyline', + 'polygon', + 'use', + 'defs', + 'clipPath', + 'mask', + 'pattern', + 'image', + 'text', + 'tspan', +} + class DOMTreeSerializer: """Serializes enhanced DOM trees to string format.""" @@ -450,6 +470,10 @@ class DOMTreeSerializer: if node.node_name.lower() in DISABLED_ELEMENTS: return None + # Skip SVG child elements entirely (path, rect, g, circle, etc.) + if node.node_name.lower() in SVG_ELEMENTS: + return None + if node.node_name == 'IFRAME' or node.node_name == 'FRAME': if node.content_document: simplified = SimplifiedNode(original_node=node, children=[]) @@ -754,6 +778,32 @@ class DOMTreeSerializer: formatted_text.append(child_text) return '\n'.join(formatted_text) + # Special handling for SVG elements - show the tag but collapse children + if node.original_node.tag_name.lower() == 'svg': + shadow_prefix = '' + if node.is_shadow_host: + has_closed_shadow = any( + child.original_node.node_type == NodeType.DOCUMENT_FRAGMENT_NODE + and child.original_node.shadow_root_type + and child.original_node.shadow_root_type.lower() == 'closed' + for child in node.children + ) + shadow_prefix = '|SHADOW(closed)|' if has_closed_shadow else '|SHADOW(open)|' + + line = f'{depth_str}{shadow_prefix}' + # Add interactive marker if clickable + if node.is_interactive: + new_prefix = '*' if node.is_new else '' + line += f'{new_prefix}[{node.original_node.backend_node_id}]' + line += '