From ef8e29fbe30c53119c1914bfc5146f5d7f59da97 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sat, 27 Dec 2025 20:15:27 +0100 Subject: [PATCH] output debug dom object from claude webinterface --- python_bridge/chat_web_interface.py | 94 ++++++++++++++++++++++++++++- 1 file changed, 93 insertions(+), 1 deletion(-) diff --git a/python_bridge/chat_web_interface.py b/python_bridge/chat_web_interface.py index c45e2b9..0fe9f4e 100644 --- a/python_bridge/chat_web_interface.py +++ b/python_bridge/chat_web_interface.py @@ -567,7 +567,20 @@ class ClaudeChatInterface: except: pass - # Methode B: Prose-Container die NICHT in user-message sind + # Methode B: data-testid="assistant-message" (neue Claude.ai Version) + if not claude_elements: + try: + found = self.driver.find_elements( + By.CSS_SELECTOR, + "[data-testid='assistant-message']" + ) + if found: + claude_elements = found + logger.debug(f"Claude-Nachrichten via assistant-message: {len(found)}") + except: + pass + + # Methode C: Prose-Container die NICHT in user-message sind if not claude_elements: try: # Alle prose Elemente die nicht innerhalb von user-message sind @@ -596,6 +609,85 @@ class ClaudeChatInterface: except Exception as e: logger.debug(f"Prose-Suche fehlgeschlagen: {e}") + # Methode D: Alle Nachrichten-Divs durchsuchen und nach Rolle filtern + if not claude_elements: + try: + # Suche nach allen Nachrichten und filtere nach data-role oder aria-label + found = self.driver.execute_script(""" + const msgs = []; + // Suche nach verschiedenen Indikatoren für Claude-Nachrichten + + // 1. data-role="assistant" + document.querySelectorAll('[data-role="assistant"]').forEach(e => msgs.push(e)); + + // 2. aria-label enthält "assistant" oder "Claude" + if (msgs.length === 0) { + document.querySelectorAll('[aria-label*="assistant"], [aria-label*="Claude"]').forEach(e => msgs.push(e)); + } + + // 3. Klasse enthält "assistant" + if (msgs.length === 0) { + document.querySelectorAll('[class*="assistant"]').forEach(e => { + // Filtere Buttons und andere UI-Elemente + if (e.tagName !== 'BUTTON' && !e.querySelector('button')) { + msgs.push(e); + } + }); + } + + return msgs; + """) or [] + if found: + claude_elements = found + logger.debug(f"Claude-Nachrichten via Fallback-Suche: {len(found)}") + except Exception as e: + logger.debug(f"Fallback-Suche fehlgeschlagen: {e}") + + # ═══════════════════════════════════════════════════════════════ + # DEBUG: Falls keine Claude-Nachrichten gefunden, DOM analysieren + # ═══════════════════════════════════════════════════════════════ + if not claude_elements and user_elements: + try: + # Hole DOM-Info für Debugging + dom_info = self.driver.execute_script(""" + const info = { + 'data-testids': [], + 'classes_with_message': [], + 'classes_with_assistant': [] + }; + + // Sammle alle data-testid Werte + document.querySelectorAll('[data-testid]').forEach(e => { + const testid = e.getAttribute('data-testid'); + if (!info['data-testids'].includes(testid)) { + info['data-testids'].push(testid); + } + }); + + // Sammle Klassen die 'message' enthalten + document.querySelectorAll('[class*="message"]').forEach(e => { + const cls = e.className; + if (typeof cls === 'string' && !info['classes_with_message'].includes(cls.substring(0, 100))) { + info['classes_with_message'].push(cls.substring(0, 100)); + } + }); + + // Sammle Klassen die 'assistant' enthalten + document.querySelectorAll('[class*="assistant"]').forEach(e => { + const cls = e.className; + if (typeof cls === 'string' && !info['classes_with_assistant'].includes(cls.substring(0, 100))) { + info['classes_with_assistant'].push(cls.substring(0, 100)); + } + }); + + return info; + """) + logger.warning(f"KEINE Claude-Nachrichten gefunden! DOM-Info: data-testids={dom_info.get('data-testids', [])[:10]}") + logger.debug(f"Klassen mit 'message': {dom_info.get('classes_with_message', [])[:5]}") + logger.debug(f"Klassen mit 'assistant': {dom_info.get('classes_with_assistant', [])[:5]}") + except Exception as e: + logger.debug(f"DOM-Analyse fehlgeschlagen: {e}") + # ═══════════════════════════════════════════════════════════════ # Nachrichten verarbeiten # ═══════════════════════════════════════════════════════════════