
    @h|                     t    d dl Z d dlmZ d dlZd Zd ZddZd Zd ZddZ	dd	Z
eeee
ee	d
Zd ZdefdZy)    N)loggerc                 $  K   	 d}| j                  ||       d{   }t        j                  d       d{    t        j                  d| d| d       |S 7 ?7 $# t
        $ r%}t        j                  d| d|        Y d}~y	d}~ww xY ww)
u[   
    Wykonuje smooth scroll do elementu po selektorze. Zwraca True jeśli się udało.
    a  
        async (selector) => {
            const el = document.querySelector(selector);
            if (!el) return false;
            let lastY = window.scrollY;
            let targetY = el.getBoundingClientRect().top + window.scrollY - window.innerHeight / 2;
            let step = (targetY - window.scrollY) > 0 ? 30 : -30;
            while (Math.abs(window.scrollY - targetY) > 20) {
                window.scrollBy(0, step);
                await new Promise(r => setTimeout(r, 16));
                if (Math.abs(window.scrollY - lastY) < 2) break;
                lastY = window.scrollY;
            }
            el.scrollIntoView({behavior: "smooth", block: "center"});
            return true;
        }
        Ngffffff?z'[ACTION] Manualnie smooth scrolled to: z
 (result: )z&[ACTION] Manual smooth scroll failed: : F)evaluateasynciosleepr   info	Exceptionwarning)pageselector	scroll_jsresexcs        2/var/www/extractly/html_agregator/utils/actions.pysmooth_scroll_tor      s     	" MM)X66mmC   =hZzRUQVVWXY
 7   ?zC5QRsN   BA AA A!A BA A 	B(BBBBc                   K   | j                  |      }	 |j                          d{   dkD  rat        | |       d{    |j                  j	                  |j                  dd             d{    t        j                  d|        yt        j                  d|        y7 7 l7 :# t        $ r%}t        j                  d| d	|        Y d}~yd}~ww xY ww)
z<
    Smooth scroll do elementu i kliknij po selektorze.
    Nr   timeouti N  r   z[ACTION] Clicked: z'[ACTION] Selector not found for click: z[ACTION] Click failed: r   )
locatorcountr   firstclickgetr   r
   r   r   )r   r   kwargsr   r   s        r   click_actionr   #   s      ll8$GD 1$"4222--%%fjjE.J%KKKKK,XJ78NNDXJOP !2K  D0
"SEBCCDsm   C!B0 B*B0 B, 3B0 3B.4B0 C!B0 )C!*B0 ,B0 .B0 0	C9CC!CC!c                   K   |j                  d      }|st        j                  d       yd|j                          d|j	                          d|j	                          d}| j                  d|       }	 |j                          d{   }t        |      D ]  }|j                  |      }|j                          d{   }	|	s/|j                          d{   }
|
r|
j                  d	       d{   }nd}|rt        | |       d{    n*|j                  |j                  d
d             d{    |j                  |j                  d
d             d{    t        j                  d| d        y t        j                  d| d       y7 7 7 7 7 7 o7 G# t         $ r%}t        j                  d| d|        Y d}~yd}~ww xY ww)ul   
    Smooth scroll do elementu z tekstem (case-insensitive), potem kliknij.
    Użyj parametru 'text'.
    textz4[ACTION] click_text_action bez 'text' w parametrach!Nz1//*[contains(translate(normalize-space(text()), 'z', 'z'), 'z')]zxpath=z;el => el.tagName.toLowerCase() + (el.id ? '#' + el.id : '')r   i  r   z%[ACTION] Clicked element with text: ''z8[ACTION] Nie znaleziono widocznego elementu z tekstem: 'z [ACTION] Click by text failed: 'z': )r   r   r   upperlowerr   r   rangenth
is_visibleelement_handler   r   scroll_into_view_if_neededr   r
   r   )r   r   r   r   xpathr   r   ielvisibler&   selector_strr   s                r   click_text_actionr-   2   s    
 ::fDMN?

~TRVR\R\R^Q__deieoeoeqdrruvEllVE7+,GJmmo%uAQBMMO+G')'8'8':!:!)7)@)@A~)#L#'L*4>>>77

9VZ@[7\\\hhvzz)T'BhCCCCD6KL! " 	QRVQWWXYZ% & , ";# ?\C  J9$s3%HIIJs   A4G 7F/ 
F 6F/ F#F/ 	F/ F%F/ 7F'8F/ F)*F/ ;F+<)F/ %F-&F/ G F/ G  F/ #F/ %F/ 'F/ )F/ +F/ -F/ /	G8GG GG c                 8   K   t        | |       d {    y 7 wN)r   r   r   r   s      r   scroll_actionr1   T   s     
4
***s   c                    K   	 | j                  ||j                  dd             d {    t        j                  d|        y 7 # t        $ r%}t        j
                  d| d|        Y d }~y d }~ww xY ww)Nr   i  r   z[ACTION] Waited for: z[ACTION] Wait for failed: r   )wait_for_selectorr   r   r
   r   r   )r   r   r   r   s       r   wait_actionr4   W   sx     G$$Xvzz)T7R$SSS+H:67 	T G3H:RuEFFGs>   A;&A
 AA
 A;A
 
	A8A3.A;3A88A;c                    K   |j                  dd      }t        j                  |dz         d {    t        j                  d| d       y 7 w)Ndelayi  i  z[ACTION] Delay ms)r   r   r	   r   r
   )r   r   r   r7   s       r   delay_actionr8   ^   sF     	GS	!B
--4
   
KK/"R() !s   .AAAc                 l   K   | j                  d       d {    t        j                  d       y 7 w)Nz/window.scrollTo(0, document.body.scrollHeight);z#[ACTION] Scrolled to bottom of page)r   r   r
   r0   s      r   scroll_to_bottom_actionr:   c   s,     
--I
JJJ
KK57 Ks   424)r   
click_textscrollscroll_to_bottomwait_forr6   c                  <    t        t        j                               S r/   )listACTION_HANDLERSkeys     r   allowed_action_typesrE   q   s    $$&''rD   actionsc                   K   t        |d       }|D ]  }|j                  d      }|j                  dd       }t        j                  |      }|st        j                  d|        V|j                         D ci c]  \  }}|dvs|| }}} || |fi | d {    t        j                  dd      }	t        j                  d	|	d
d       t        j                  |	       d {     y c c}}w 7 Z7 w)Nc                 &    | j                  dd      S )Nindexr   )r   )xs    r   <lambda>z%run_actions_on_page.<locals>.<lambda>u   s    AEE'1,=rD   )keyaction_typer   z[ACTION] Nieznany typ akcji: )rM   r   rI   g?gffffff?z$[ACTION] Random delay after action: z.2fs)sortedr   rA   r   r   itemsrandomuniformr
   r   r	   )
r   rF   actionrM   r   handlerkvr   r6   s
             r   run_actions_on_pagerW   t   s     W"=>Gjj/::j$/!%%k2NN:;-HI#)<<>c>41aQ>b5b!Q$>cdH////sC(:5+QGHmmE"""  d/ 	#s7   A:C=<C3	C3C=C9AC=+C;,C=;C=r/   )r   link_agregator.utils.loggerr   rQ   r   r   r-   r1   r4   r8   r:   rA   rE   r@   rW   rC   rD   r   <module>rY      sa     . <D JD+G*
8 #/(#T #rD   