From 17b001d8c2a7167bea45714f1204340b7537d7aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=80=A7=E9=A9=8A?= Date: Fri, 3 Apr 2026 01:11:02 +0800 Subject: [PATCH] fix: Add debug output and fallback selectors for input field detection --- internal/providers/geminiweb/page.go | 62 ++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 9 deletions(-) diff --git a/internal/providers/geminiweb/page.go b/internal/providers/geminiweb/page.go index 56c4925..7365bd3 100644 --- a/internal/providers/geminiweb/page.go +++ b/internal/providers/geminiweb/page.go @@ -55,38 +55,82 @@ func TypeInput(page *rod.Page, text string) error { ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() - // 1. 尋找輸入框 + fmt.Println("[GeminiWeb] Looking for input field...") + + // 1. 嘗試所有選擇器 var inputEl *rod.Element var err error + for _, sel := range inputSelectors { + fmt.Printf(" Trying: %s\n", sel) inputEl, err = page.Context(ctx).Element(sel) if err == nil { + fmt.Printf(" ✓ Found with: %s\n", sel) break } } if err != nil { - return fmt.Errorf("input field not found") + // 2. Fallback: 嘗試等待頁面載入完成後重試 + fmt.Println("[GeminiWeb] Waiting for page to fully load...") + time.Sleep(3 * time.Second) + + for _, sel := range inputSelectors { + fmt.Printf(" Retrying: %s\n", sel) + inputEl, err = page.Context(ctx).Element(sel) + if err == nil { + fmt.Printf(" ✓ Found with: %s\n", sel) + break + } + } + } + + if err != nil { + // 3. Debug: 印出頁面標題和 URL + info, _ := page.Info() + fmt.Printf("[GeminiWeb] DEBUG: URL=%s Title=%s\n", info.URL, info.Title) + + // 4. Fallback: 嘗試更通用的選擇器 + fmt.Println("[GeminiWeb] Trying generic selectors...") + genericSelectors := []string{ + "div[contenteditable]", + "[contenteditable]", + "textarea", + "input[type='text']", + } + + for _, sel := range genericSelectors { + fmt.Printf(" Trying generic: %s\n", sel) + inputEl, err = page.Context(ctx).Element(sel) + if err == nil { + fmt.Printf(" ✓ Found with: %s\n", sel) + break + } + } + } + + if err != nil { + info, _ := page.Info() + return fmt.Errorf("input field not found after trying all selectors (URL=%s)", info.URL) } // 2. Focus 輸入框 + fmt.Printf("[GeminiWeb] Focusing input field...\n") if err := inputEl.Focus(); err != nil { return fmt.Errorf("failed to focus input: %w", err) } - time.Sleep(100 * time.Millisecond) + time.Sleep(500 * time.Millisecond) - // 3. 使用 Input 方法(Rod 的正確方式) + // 3. 使用 Input 方法 + fmt.Printf("[GeminiWeb] Typing %d chars...\n", len(text)) if err := inputEl.Input(text); err != nil { return fmt.Errorf("failed to input text: %w", err) } - time.Sleep(100 * time.Millisecond) - - // 4. 觸發 Enter 觸發事件 - _ = inputEl.SelectAllText() - _ = page.Keyboard.Press('\r') // Enter key + time.Sleep(200 * time.Millisecond) + fmt.Println("[GeminiWeb] Input complete") return nil }