a
    7ñ»j0  ã                   @   sú   d Z ddlZddlZddlZddlZddlmZ ddlmZ ddlm	Z	 dd„ Z
dd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zd3dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd4d%d&„Zd'd(„ Zd5d)d*„Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ ZdS )6z+This module contains useful utility methodsé    N)ÚBy)Ú	constants)Úcss_to_xpathc                 C   sH   |   d¡s| S |  d¡d }|  d¡d }| d¡d }|d | }|S )z�
    Use this to convert a url like this:
    https://blog.xkcd.com/2014/07/22/what-if-book-tour/
    Into this:
    https://blog.xkcd.com
    )úhttp://úhttps://ú://r   é   ú/)Ú
startswithÚsplit)ÚurlZ
url_headerÚ
simple_urlÚbase_urlZ
domain_url© r   úFE:\soccer\ml_env\Lib\site-packages\seleniumbase/fixtures/page_utils.pyÚget_domain_url   s    
r   c                 C   s   | dv S )N)úcss selectorú
class nameÚidÚnameú	link textÚxpathútag nameúpartial link textr   )Úbyr   r   r   Úis_valid_by   s    r   c                 C   s"   t |ƒst | ƒr||  } }| |fS )N)r   )Úselectorr   r   r   r   Ú swap_selector_and_by_if_reversed"   s    
r   c                 C   s
   |   d¡S )z-Determine if a selector is an xpath selector.)r	   ú./ú(©r
   ©r   r   r   r   Úis_xpath_selector(   s    r"   c                 C   s
   |   d¡S )z0Determine if a selector is a link text selector.)úlink=ú
link_text=útext=r    r!   r   r   r   Úis_link_text_selector-   s    r&   c                 C   s
   |   d¡S )z8Determine if a selector is a partial link text selector.)úpartial_link=úpartial_link_text=úpartial_text=úp_link=úp_link_text=úp_text=r    r!   r   r   r   Úis_partial_link_text_selector2   s    r-   c                 C   s
   |   d¡S )z+Determine if a selector is a name selector.)úname=ú&r    r!   r   r   r   Úis_name_selector:   s    r0   Tc                 C   s$  t | ƒ}|tur$d}td||f ƒ‚t |ƒ}|turHd}td||f ƒ‚t|ƒsft| ƒrft| |ƒ\} }t| ƒrttj}t| ƒrŠt	| ƒ} tj
}t| ƒr t| ƒ} tj}t| ƒr¾t| ƒ}d| } tj}|räd| v rä|tjkrät | ¡} tj}|dkròtj}t|ƒ�sg d¢}d	| }td
||f ƒ‚| |fS )zóUse autodetection to return the correct selector with "by" updated.
    If "xp_ok" is False, don't call convert_css_to_xpath(), which is
    used to make the ":contains()" selector valid outside of JS calls.
    Returns a (selector, by) tuple.z7Expecting a selector of type: "<class 'str'>" (string)!zInvalid selector type: "%s"
%sz3Expecting a `by` of type: "<class 'str'>" (string)!zInvalid `by` type: "%s"
%sz[name="%s"]z
:contains(Ú )r   r   r   r   r   r   r   r   zChoose a `by` from: %s.zInvalid `by`: "%s"
%s)ÚtypeÚstrÚ	Exceptionr   r   r"   r   ZXPATHr&   Úget_link_text_from_selectorZ	LINK_TEXTr-   Ú#get_partial_link_text_from_selectorZPARTIAL_LINK_TEXTr0   Úget_name_from_selectorZCSS_SELECTORr   Zconvert_css_to_xpath)r   r   Zxp_okÚ_typeÚmsgZ_by_typer   Zvalid_by_optionsr   r   r   Úrecalculate_selector?   s@    

r:   c                 C   s
   |   d¡S )aN  Returns True if the url parameter looks like a URL. This method
    is slightly more lenient than page_utils.is_valid_url(url) due to
    possible typos when calling self.get(url), which will try to
    navigate to the page if a URL is detected, but will instead call
    self.get_element(URL_AS_A_SELECTOR) if the input is not a URL.)úhttp:úhttps:r   úabout:úblob:úchrome:zopera:údata:úedge:úfile:zview-source:zchrome-search:zchrome-extension:zchrome-untrusted:zisolated-app:zchrome-devtools:z	devtools:zbrave:zcomet:zatlas:r    )r   r   r   r   Úlooks_like_a_page_urli   s    rC   c                 C   sR   |   d¡r| tdƒd… S |   d¡r4| tdƒd… S |   d¡rN| tdƒd… S | S )z,Get the link text from a link text selector.r#   Nr$   r%   ©r
   Úlenr!   r   r   r   r5   w   s    


r5   c                 C   s    |   d¡r| tdƒd… S |   d¡r4| tdƒd… S |   d¡rN| tdƒd… S |   d¡rh| tdƒd… S |   d¡r‚| tdƒd… S |   d¡rœ| tdƒd… S | S )z7Get the partial link text from a partial link selector.r'   Nr(   r)   r*   r+   r,   rD   r!   r   r   r   r6   ‚   s    





r6   c                 C   s8   |   d¡r| tdƒd… S |   d¡r4| tdƒd… S | S )z"Get the name from a name selector.r.   Nr/   rD   r!   r   r   r   r7   “   s
    

r7   c                 C   s.   t  dt j¡}| | ¡s"|  d¡r&dS dS d S )Nz¤^(?:http)s?://(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|localhost|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?::\d+)?(?:/?|[/?]\S+)$)r=   r>   r?   r@   rA   rB   TF)ÚreÚcompileÚ
IGNORECASEÚmatchr
   )r   Úregexr   r   r   Úis_valid_urlœ   s    øÿþrK   c                 C   s   |   d¡s|   d¡sg S d}|   d¡r*d}|  d¡d }| d¡d }|d	 | }g }g }| d
¡}|D ]}	| |	 d¡¡ qh| d¡}
|
D ]}| | d¡¡ qŒ| d¡}|D ]}	| |	 d¡¡ q°| d¡}
|
D ]}| | d¡¡ qÔ|D ]}	|	|vrî| |	¡ qîg }|D �]r}	|	�rt|	ƒdk�r|	  d	¡�r@||	 }	�n6|	  d¡�rX||	 }	�n|	dk�rj| }	�n|	  d¡�r¶|}t| d¡ƒdk�r¤|d | d¡d  }||	dd…  }	nÀ|	  d¡�ræ|  d¡�rØ| |	 }	n| d |	 }	n�|	  d¡�rü||	 }	nzd	|	v�rB|}t| d¡ƒdk�r4|d | d¡d  }|d |	 }	n4|	  d¡�rv|	 d¡�rvt|	ƒdk�rv|	dd… }	n | |	¡ �q|}tt|ƒƒ}t	|ƒ}|S )zzReturns all unique links.
    Includes:
        "a"->"href", "img"->"src", "link"->"href", and "script"->"src" links.
    r   r   r;   r<   r   r   r	   r   z//ÚaÚhrefZimgÚsrcÚlinkÚscriptr   Nz../ú#ú"é   éÿÿÿÿ)
r
   r   Zfind_allÚappendÚgetrE   ÚendswithÚlistÚsetÚsorted)Úpage_urlÚsoupÚprefixr   r   Zfull_base_urlZ	raw_linksZraw_unique_linksÚlinksrO   Z	img_linksZimg_linkZunique_linksZf_b_urlr   r   r   Ú_get_unique_links²   sv    ÿ









&r_   Fé   c                 C   s<   d}zt j| |||d�}|j}W n ty6   d}Y n0 |S )z÷Get the status code of a link.
    If the timeout is exceeded, will return a 404.
    If "verify" is False, will ignore certificate errors.
    For a list of available status codes, see:
    https://en.wikipedia.org/wiki/List_of_HTTP_status_codes N)Úallow_redirectsÚtimeoutÚverifyi”  )ÚrequestsÚheadÚstatus_coder4   )rO   ra   rb   rc   rf   Úresponser   r   r   Ú_get_link_status_code  s    ü

rh   c                 C   s,   t | |ƒ}|D ]}t|ƒ}t|d|ƒ qdS )a  Finds all unique links in the html of the page source
    and then prints out those links with their status codes.
    Format:  ["link"  ->  "status_code"]  (per line)
    Page links include those obtained from:
    "a"->"href", "img"->"src", "link"->"href", and "script"->"src". z -> N)r_   rh   Úprint)r[   r\   r^   rO   rf   r   r   r   Ú%_print_unique_links_with_status_codes  s    
rj   c           	   	   C   s¤   |r
|}n|   d¡d }tj| |dd�}tj ||¡}t tj	j
¡}|�H t|dd��}| |j¡ W d   ƒ n1 sx0    Y  W d   ƒ n1 s–0    Y  d S )Nr	   rT   r`   )Úheadersrb   Úwb©Úmode)r   rd   rV   ÚosÚpathÚjoinÚ	fastenersÚInterProcessLockr   ÚMultiBrowserZDOWNLOAD_FILE_LOCKÚopenÚwriteÚcontent)	Úfile_urlÚdestination_folderZnew_file_namerk   Ú	file_nameÚrÚ	file_pathZdownload_file_lockÚcoder   r   r   Ú_download_file_to(  s    ÿr~   c                 C   s`   t  tjj¡}|�: ttj ||¡ddd�}| 	| ¡ | 
¡  W d   ƒ n1 sR0    Y  d S )Núw+úutf-8©rn   Úencoding)rr   rs   r   rt   ÚFILE_IO_LOCKru   ro   rp   rq   Ú
writelinesÚclose)Údatary   rz   Úfile_io_lockÚout_filer   r   r   Ú_save_data_as9  s    ÿý
r‰   c              	   C   sÚ   t  tjj¡}|�´ d}tj tj ||¡¡r†t	tj ||¡dd��}| 
¡ }W d   ƒ n1 sb0    Y  | d¡d dks†|d7 }t	tj ||¡ddd�}| d	|| f ¡ | ¡  W d   ƒ n1 sÌ0    Y  d S )
Nr1   r{   rm   Ú
rT   r   r€   r�   z%s%s)rr   rs   r   rt   rƒ   ro   rp   Úexistsrq   ru   Úreadr   r„   r…   )r†   ry   rz   r‡   Zexisting_dataÚfrˆ   r   r   r   Ú_append_data_to_fileG  s(    ÿÿ&ýrŽ   c              	   C   s–   t  tjj¡}|�p tj tj | |¡¡s2t	dƒ‚t
tj | |¡dd��}| ¡ }W d   ƒ n1 sf0    Y  |W  d   ƒ S 1 sˆ0    Y  d S )NzFile not found!r{   rm   )rr   rs   r   rt   rƒ   ro   rp   r‹   rq   r4   ru   rŒ   )Úfolderrz   r‡   r�   r†   r   r   r   Ú_get_file_data]  s    ÿ&r�   c                 C   s"   |   d¡d }d|vr| d7 } | S )Nú rT   z:first)r   )r   Zlast_syllabler   r   r   Ú!make_css_match_first_element_onlyi  s    r’   )T)Fr`   F)NN)Ú__doc__rr   ro   rF   rd   Zselenium.webdriver.common.byr   Zseleniumbase.fixturesr   r   r   r   r   r"   r&   r-   r0   r:   rC   r5   r6   r7   rK   r_   rh   rj   r~   r‰   rŽ   r�   r’   r   r   r   r   Ú<module>   s@   
*	S   ü
 ÿ
