44 "context"
55 "fmt"
66 "io"
7- "log"
87 "net"
98 "net/http"
109 "net/http/cookiejar"
@@ -333,36 +332,49 @@ func fetchTier2(rawURL string, opts *fetchOptions) (*fetchResult, error) {
333332func fetchTier3 (rawURL string , opts * fetchOptions ) (* fetchResult , error ) {
334333 chromePath := findChrome ()
335334 if chromePath == "" {
336- log . Println ( "fetchTier3: Chrome not found" )
335+ logVerbose ( opts , "[tier3] Chrome not found at any known path " )
337336 return nil , & httpError {statusCode : 0 , message : "Chrome not installed" }
338337 }
339338
340- controlURL := launcher .New ().Bin (chromePath ).Headless (true ).MustLaunch ()
339+ logVerbose (opts , "[tier3] %s → using Chrome at %s" , rawURL , chromePath )
340+
341+ l := launcher .New ().Bin (chromePath ).Headless (true )
342+ controlURL , err := l .Launch ()
343+ if err != nil {
344+ logVerbose (opts , "[tier3] %s → Chrome launch failed: %v" , rawURL , err )
345+ return nil , fmt .Errorf ("chrome launch: %w" , err )
346+ }
347+
341348 browser := rod .New ().ControlURL (controlURL )
342349 if err := browser .Connect (); err != nil {
350+ logVerbose (opts , "[tier3] %s → browser connect failed: %v" , rawURL , err )
343351 return nil , fmt .Errorf ("browser connect: %w" , err )
344352 }
345353 defer browser .Close ()
346354
347355 page , err := browser .Page (proto.TargetCreateTarget {URL : rawURL })
348356 if err != nil {
357+ logVerbose (opts , "[tier3] %s → page open failed: %v" , rawURL , err )
349358 return nil , fmt .Errorf ("browser open page: %w" , err )
350359 }
351360
352361 if err := page .WaitStable (1 * time .Second ); err != nil {
353- return nil , fmt . Errorf ( " page wait stable : %w" , err )
362+ logVerbose ( opts , "[tier3] %s → page did not stabilize : %v" , rawURL , err )
354363 }
355364 page .MustWaitLoad ()
356365
357366 html , err := page .HTML ()
358367 if err != nil {
368+ logVerbose (opts , "[tier3] %s → failed to get HTML: %v" , rawURL , err )
359369 return nil , fmt .Errorf ("page html: %w" , err )
360370 }
361371
362372 if isCaptchaPage (html ) {
373+ logVerbose (opts , "[tier3] %s → CAPTCHA detected" , rawURL )
363374 return nil , & httpError {statusCode : 0 , message : "site requires interactive challenge (CAPTCHA)" }
364375 }
365376
377+ logVerbose (opts , "[tier3] %s → 200 (headless Chrome, %d bytes)" , rawURL , len (html ))
366378 return & fetchResult {html : html , tier : 3 , url : rawURL }, nil
367379}
368380
@@ -379,10 +391,24 @@ func findChrome() string {
379391 "/Applications/Chromium.app/Contents/MacOS/Chromium" ,
380392 "/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge" ,
381393 "/Applications/Brave Browser.app/Contents/MacOS/Brave Browser" ,
382- // Windows (via WSL or native)
394+ // Windows (native)
395+ `C:\Program Files\Google\Chrome\Application\chrome.exe` ,
396+ `C:\Program Files (x86)\Google\Chrome\Application\chrome.exe` ,
397+ `C:\Program Files\Microsoft\Edge\Application\msedge.exe` ,
398+ `C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe` ,
399+ `C:\Program Files\BraveSoftware\Brave-Browser\Application\brave.exe` ,
400+ // Windows (via WSL)
383401 "/mnt/c/Program Files/Google/Chrome/Application/chrome.exe" ,
384402 "/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe" ,
385403 }
404+
405+ // Also check CHROME_PATH env var (user override)
406+ if envPath := os .Getenv ("CHROME_PATH" ); envPath != "" {
407+ if fileExists (envPath ) {
408+ return envPath
409+ }
410+ }
411+
386412 for _ , p := range paths {
387413 if fileExists (p ) {
388414 return p
0 commit comments