From 37f89ca76fd4637835f4c5f0263da96dd67d5e45 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sat, 27 Dec 2025 03:08:24 +0100 Subject: [PATCH] =?UTF-8?q?text=20einf=C3=BCgen=20mittels=20javascript=20f?= =?UTF-8?q?unktion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python_bridge/chat_web_interface.py | 54 +++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/python_bridge/chat_web_interface.py b/python_bridge/chat_web_interface.py index ced5773..635ddf3 100644 --- a/python_bridge/chat_web_interface.py +++ b/python_bridge/chat_web_interface.py @@ -306,7 +306,7 @@ class ClaudeChatInterface: Zwischenablage/das Eingabefeld Zeit braucht um den Text zu verarbeiten. Ablauf: - 1. Text ins Eingabefeld einfügen + 1. Text via JavaScript ins Eingabefeld einfügen (vermeidet Tastaturlayout-Probleme!) 2. Warte delay_before_send Sekunden 3. Send-Button klicken (mit Retry) @@ -329,9 +329,9 @@ class ClaudeChatInterface: input_field.click() time.sleep(0.2) - # Text eingeben + # Text via JavaScript einfügen (vermeidet QWERTY/QWERTZ Probleme!) logger.info(f"Füge Text ein ({len(text)} Zeichen)...") - input_field.send_keys(text) + self._insert_text_via_js(input_field, text) # WARTEN - große Texte brauchen Zeit! if delay_before_send > 0: @@ -431,6 +431,54 @@ class ClaudeChatInterface: return None + def _insert_text_via_js(self, element, text: str): + """ + Fügt Text via JavaScript ein (vermeidet Tastaturlayout-Probleme). + + Bei send_keys() werden physische Tasten gedrückt, was bei + unterschiedlichen Tastaturlayouts (QWERTY vs QWERTZ) zu + falschen Zeichen führt (z.B. y↔z vertauscht). + + Diese Methode fügt den Text direkt als String ein. + """ + # Escape für JavaScript + escaped_text = text.replace('\\', '\\\\').replace('`', '\\`').replace('${', '\\${') + + # Für contenteditable divs (ProseMirror) + self.driver.execute_script(""" + const element = arguments[0]; + const text = arguments[1]; + + // Fokussieren + element.focus(); + + // Methode 1: Für contenteditable (ProseMirror) + if (element.contentEditable === 'true') { + // Text als HTML einfügen (respektiert Zeilenumbrüche) + const htmlText = text.replace(/\\n/g, '
'); + element.innerHTML = htmlText; + + // Input-Event triggern damit React/Vue es mitbekommt + element.dispatchEvent(new Event('input', { bubbles: true })); + + // Cursor ans Ende setzen + const range = document.createRange(); + range.selectNodeContents(element); + range.collapse(false); + const sel = window.getSelection(); + sel.removeAllRanges(); + sel.addRange(range); + } + // Methode 2: Für textarea/input + else { + element.value = text; + element.dispatchEvent(new Event('input', { bubbles: true })); + element.dispatchEvent(new Event('change', { bubbles: true })); + } + """, element, text) + + logger.debug(f"Text via JavaScript eingefügt ({len(text)} Zeichen)") + def _wait_for_response(self, timeout: int = 60): """Wartet bis Claude fertig getippt hat""" logger.debug("Warte auf Claudes Antwort...")