
    Mi@                         S r SSKJrJr  SSKJrJrJrJrJ	r	  SSK
r
SSKr SSKJr   SSKJr   " S S\5      r " S S	\5      r " S
 S\5      r " S S\5      rg! \ a    \r N>f = f! \ a    \r NEf = f)z|
Browser adapter for Crawl4AI to support both Playwright and undetected browsers
with minimal changes to existing codebase.
    )ABCabstractmethod)ListDictAnyOptionalCallableN)Pagec            
           \ rS rSrSr\SS\S\S\S\4S jj5       r	\S\S	\
\   S\\   4S
 j5       r\S\S	\
\   S\\   4S j5       r\S\S\
\   4S j5       r\S\S\\   S\\   4S j5       r\S\4S j5       rSrg)BrowserAdapter   z0Abstract adapter for browser-specific operationsNpage
expressionargreturnc                    #    g7f)zExecute JavaScript in the pageN selfr   r   r   s       r/var/www/eduai.edurigo.com/storigo/production/storigo_env/lib/python3.13/site-packages/crawl4ai/browser_adapter.pyevaluateBrowserAdapter.evaluate   
      	   captured_consolec                    #    g7f)zCSetup console message capturing, returns handler function if neededNr   r   r   r   s      r   setup_console_capture$BrowserAdapter.setup_console_capture    r   r   c                    #    g7f)z9Setup error capturing, returns handler function if neededNr   r   s      r   setup_error_capture"BrowserAdapter.setup_error_capture%   r   r   c                    #    g7f)z<Retrieve captured console messages (for undetected browsers)Nr   r   r   s     r   retrieve_console_messages(BrowserAdapter.retrieve_console_messages*   r   r   handle_consolehandle_errorc                    #    g7f)z Clean up console event listenersNr   r   r   r'   r(   s       r   cleanup_console_capture&BrowserAdapter.cleanup_console_capture/   r   r   c                     g)z,Get the appropriate imports for this adapterNr   r   s    r   get_importsBrowserAdapter.get_imports4   s     	    r   N)__name__
__module____qualname____firstlineno____doc__r   r
   strr   r   r   r   r   r	   r   r!   r%   r+   tupler/   __static_attributes__r   r1   r   r   r      s   :4 S s c    T
 W_`hWi   d d4j U]^fUg   D T$Z   $ QYHZ jrs{j|   U  r1   r   c            	           \ rS rSrSrSS\S\S\S\4S jjrS\S	\	\
   S\\   4S
 jrS\S	\	\
   S\\   4S jrS\S\	\
   4S jrS\S\\   S\\   4S jrS\4S jrSrg)PlaywrightAdapter:   zAdapter for standard PlaywrightNr   r   r   r   c                 |   #    Ub  UR                  X#5      I Sh  vN $ UR                  U5      I Sh  vN $  N N7f)zStandard Playwright evaluateNr   r   s       r   r   PlaywrightAdapter.evaluate=   6     ?z777]]:... 8.   <8<:<<r   c                 @   ^#    U4S jnUR                  SU5        U$ 7f)z5Setup console capture using Playwright's event systemc                 D  >  Sn U R                   nSn U R                  nUU[        R                  " 5       S.nTR                  U5        g !    N>= f!    N6= f! [         a;  nTR                  S[        U5      [        R                  " 5       S.5         S nAg S nAff = fNunknown)typetext	timestampconsole_capture_errorrG   errorrI   rG   rH   timeappend	Exceptionr8   msgmessage_typemessage_textentryer   s        r   handle_console_captureGPlaywrightAdapter.setup_console_capture.<locals>.handle_console_captureE       (#&88L  )#&88L
 )(!% !''.
   ''3 V!%)  C   A A A A *A AA AA 
B$1BBconsoleonr   r   r   rW   s     ` r   r   'PlaywrightAdapter.setup_console_captureC   s"     	: 		12%%   c                 @   ^#    U4S jnUR                  SU5        U$ 7f)3Setup error capture using Playwright's event systemc                 B  >  Sn U R                   nSn U R                  nTR                  SUU[        R                  " 5       S.5        g !    N== f!    N5= f! [         a;  nTR                  S[        U5      [        R                  " 5       S.5         S nAg S nAff = fNzUnknown error rL   )rG   rH   stackrI   pageerror_capture_errorrK   messagerf   rO   rN   rP   r8   errerror_messageerror_stackrV   r   s       r   handle_pageerror_captureGPlaywrightAdapter.setup_error_capture.<locals>.handle_pageerror_captureg        /$'KKM !"%))K !''#)(!%	) 
   ''5 V!%)  C   A A A A )A AA AA 
B#1BB	pageerrorr\   r   r   r   rn   s     ` r   r!   %PlaywrightAdapter.setup_error_capturee   "     	6 	56''r`   c                    #    / $ 7fz<Not needed for Playwright - messages are captured via eventsr   r$   s     r   r%   +PlaywrightAdapter.retrieve_console_messages   
     	   r'   r(   c                 r   #    U(       a  UR                  SU5        U(       a  UR                  SU5        gg7fzRemove event listenersr[   rr   Nremove_listenerr*   s       r   r+   )PlaywrightAdapter.cleanup_console_capture   0       N;  l;    57c                 &    SSK JnJn  SSK Jn  XU4$ zReturn Playwright importsr   r
   ErrorTimeoutErrorplaywright.async_apir
   r   r   r   r
   r   PlaywrightTimeoutErrors       r   r/   PlaywrightAdapter.get_imports       4O222r1   r   r2   )r3   r4   r5   r6   r7   r
   r8   r   r   r   r   r   r	   r   r!   r%   r+   r9   r/   r:   r   r1   r   r<   r<   :   s    )/4 /S /s /c / &  &T
  &W_`hWi  &D(d (d4j (U]^fUg (@D T$Z <$ <QYHZ <jrs{j| <3U 3r1   r<   c            	           \ rS rSrSrS rS\4S jrS\4S jr	SS\S	\
S
\S\4S jjrS\S\\   S\\   4S jrS\S\\   S\\   4S jrS\S\\   4S jrS\S\\   S\\   4S jrS\4S jrSrg)StealthAdapter   zEAdapter for Playwright with stealth features using playwright_stealthc                 <    0 U l         U R                  5       U l        g r2   )_console_script_injected_check_stealth_availability_stealth_availabler.   s    r   __init__StealthAdapter.__init__   s    (*%"&"B"B"Dr1   r   c                      SSK Jn  Xl        g! [         a(     SSK Jn  X l         g! [         a    SU l          gf = ff = f)zECheck if playwright_stealth is available and get the correct functionr   )stealth_asyncT)stealth_syncNF)playwright_stealthr   _stealth_functionImportErrorr   )r   r   r   s      r   r   *StealthAdapter._check_stealth_availability   sM    	8%2" 	;)5& )-&	s    
A(=A=Ar   c                 L  #    U R                   (       av  U R                  (       ad   [        U R                  S5      (       aG  S[        U R                  SS5      ;   a  U R                  U5      I Sh  vN   gU R                  U5        gggg N! [         a
  n SnAgSnAff = f7f)z$Apply stealth to a page if available__call__asyncr3   re   N)r   r   hasattrgetattrrP   )r   r   rV   s      r   apply_stealthStealthAdapter.apply_stealth   s     ""t'='=411:>>'$*@*@*b"QQ"44T:::..t4	 ? (>" ;  sG   #B$A
B 0B1B 5B$6B B$B 
B!B$B!!B$Nr   r   c                 |   #    Ub  UR                  X#5      I Sh  vN $ UR                  U5      I Sh  vN $  N N7f)z1Standard Playwright evaluate with stealth appliedNr?   r   s       r   r   StealthAdapter.evaluate   rA   rB   r   c                 v   ^#    U R                  U5      I Sh  vN   U4S jnUR                  SU5        U$  N7f)zBSetup console capture using Playwright's event system with stealthNc                 D  >  Sn U R                   nSn U R                  nUU[        R                  " 5       S.nTR                  U5        g !    N>= f!    N6= f! [         a;  nTR                  S[        U5      [        R                  " 5       S.5         S nAg S nAff = frE   rM   rQ   s        r   rW   DStealthAdapter.setup_console_capture.<locals>.handle_console_capture   rY   rZ   r[   )r   r]   r^   s     ` r   r   $StealthAdapter.setup_console_capture   s>        &&&	: 		12%%A 	's   979c                 @   ^#    U4S jnUR                  SU5        U$ 7f)rb   c                 B  >  Sn U R                   nSn U R                  nTR                  SUU[        R                  " 5       S.5        g !    N== f!    N5= f! [         a;  nTR                  S[        U5      [        R                  " 5       S.5         S nAg S nAff = frd   rh   rj   s       r   rn   DStealthAdapter.setup_error_capture.<locals>.handle_pageerror_capture   rp   rq   rr   r\   rs   s     ` r   r!   "StealthAdapter.setup_error_capture   ru   r`   c                    #    / $ 7frw   r   r$   s     r   r%   (StealthAdapter.retrieve_console_messages  ry   rz   r'   r(   c                 r   #    U(       a  UR                  SU5        U(       a  UR                  SU5        gg7fr|   r}   r*   s       r   r+   &StealthAdapter.cleanup_console_capture	  r   r   c                 &    SSK JnJn  SSK Jn  XU4$ r   r   r   s       r   r/   StealthAdapter.get_imports  r   r1   )r   r   r   r2   )r3   r4   r5   r6   r7   r   boolr   r
   r   r8   r   r   r   r   r   r	   r   r!   r%   r+   r9   r/   r:   r   r1   r   r   r      s    OET  /4 /S /s /c /#& #&T
 #&W_`hWi #&J(d (d4j (U]^fUg (@D T$Z <$ <QYHZ <jrs{j| <3U 3r1   r   c            	           \ rS rSrSrS rSS\S\S\S\4S	 jjr	S\S
\
\   S\\   4S jrS\S
\
\   S\\   4S jrS\S\
\   4S jrS\S\\   S\\   4S jrS\4S jrSrg)UndetectedAdapteri  z?Adapter for undetected browser automation with stealth featuresc                     0 U l         g r2   r   r.   s    r   r   UndetectedAdapter.__init__  s
    (*%r1   Nr   r   r   r   c                    #    SU;   =(       d    SU;   =(       d    SU;   =(       d    SU;   (       + nUb  UR                  X#US9I Sh  vN $ UR                  X$S9I Sh  vN $  N N7f)z1Undetected browser evaluate with isolated context	__console
__captured__errorz	window.__Nisolated_contextr?   )r   r   r   r   isolateds        r   r   UndetectedAdapter.evaluate  sy     
 :% &J&&#& :%	
 ?zRRR]]:]III SIs$   AA'A#A'A%A'%A'r   c                    #    U R                   R                  US5      (       d(  UR                  S5      I Sh  vN   SU R                   U'   g N7f)zHSetup console capture using JavaScript injection for undetected browsersFa  
                // Initialize console capture
                window.__capturedConsole = [];
                window.__capturedErrors = [];
                
                // Store original console methods
                const originalConsole = {};
                ['log', 'info', 'warn', 'error', 'debug'].forEach(method => {
                    originalConsole[method] = console[method];
                    console[method] = function(...args) {
                        try {
                            window.__capturedConsole.push({
                                type: method,
                                text: args.map(arg => {
                                    try {
                                        if (typeof arg === 'object') {
                                            return JSON.stringify(arg);
                                        }
                                        return String(arg);
                                    } catch (e) {
                                        return '[Object]';
                                    }
                                }).join(' '),
                                timestamp: Date.now()
                            });
                        } catch (e) {
                            // Fail silently to avoid detection
                        }
                        
                        // Call original method
                        originalConsole[method].apply(console, args);
                    };
                });
            NTr   getadd_init_scriptr   s      r   r   'UndetectedAdapter.setup_console_capture,  sW     ,,00u==&& !( ! ! !D 37D))$/I!   6AAAc                    #    U R                   R                  US5      (       d(  UR                  S5      I Sh  vN   SU R                   U'   g N7f)zFSetup error capture using JavaScript injection for undetected browsersFaf  
                // Capture errors
                window.addEventListener('error', (event) => {
                    try {
                        window.__capturedErrors.push({
                            type: 'error',
                            text: event.message,
                            stack: event.error ? event.error.stack : '',
                            filename: event.filename,
                            lineno: event.lineno,
                            colno: event.colno,
                            timestamp: Date.now()
                        });
                    } catch (e) {
                        // Fail silently
                    }
                });
                
                // Capture unhandled promise rejections
                window.addEventListener('unhandledrejection', (event) => {
                    try {
                        window.__capturedErrors.push({
                            type: 'unhandledrejection',
                            text: event.reason ? String(event.reason) : 'Unhandled Promise Rejection',
                            stack: event.reason && event.reason.stack ? event.reason.stack : '',
                            timestamp: Date.now()
                        });
                    } catch (e) {
                        // Fail silently
                    }
                });
            NTr   r   s      r   r!   %UndetectedAdapter.setup_error_captureU  sW     ,,00u==&& (   @ 37D))$/Er   c                 Z  #    / n UR                  SSS9I Sh  vN nUR                  U5        UR                  SSS9I Sh  vN nUR                  U5        U H6  nSU;   d  M  [        US   [        [        45      (       d  M+  US   S-  US'   M8     U$  N| NU! [
         a     U$ f = f7f)z;Retrieve captured console messages and errors from the pagezb() => { const msgs = window.__capturedConsole || []; window.__capturedConsole = []; return msgs; }Fr   Nz`() => { const errs = window.__capturedErrors || []; window.__capturedErrors = []; return errs; }rI   g     @@)r   extend
isinstanceintfloatrP   )r   r   messagesconsole_messageserrorsrR   s         r   r%   +UndetectedAdapter.retrieve_console_messages|  s     	%)]]t!& &3 &   OO,-  ==r!& )  F OOF#  #%*S5EU|*T*T'*;'7&'@C$   -   			sV   B+B B(B BB %B B B+B B 
B($B+'B((B+r'   r(   c                 D   #    U R                  U5      I Sh  vN nU$  N7f)z9Clean up for undetected browser - retrieve final messagesN)r%   )r   r   r'   r(   final_messagess        r   r+   )UndetectedAdapter.cleanup_console_capture  s&       $==dCC Ds     c                 &    SSK JnJn  SSK Jn  XU4$ )z!Return undetected browser importsr   r   r   )patchright.async_apir
   r   r   r   s       r   r/   UndetectedAdapter.get_imports  r   r1   r   r2   )r3   r4   r5   r6   r7   r   UndetectedPager8   r   r   r   r   r   r	   r   r!   r%   r+   r9   r/   r:   r   r1   r   r   r     s    I+J> Js J JX[ J' 'RVW[R\ 'aijras 'R%n %PTUYPZ %_ghp_q %NN tDz <. RZ[cRd t|  ~F  uG 3U 3r1   r   )r7   abcr   r   typingr   r   r   r   r	   rN   jsonr   r
   r   r   r   r   r<   r   r   r   r1   r   <module>r      s   
 $ 6 6  );
S DZ3 Z3z}3^ }3@N3 N3Q  D
  Ns"   A A* A'&A'*A54A5