a
    7ñ»jèL  ã                   @   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l
mZ ddlmZ ddlmZ d	Zejd
kr~dZG dd„ de	ƒZdS )z;Manually verify pages quickly while assisted by automation.é    N)ÚNoAlertPresentException)ÚWebDriverException)ÚBaseCase)Úget_report_style)Úsettings)Újs_utilsF)é   é   Tc                       s–   e Zd Z‡ fdd„Zdd„ Zdd„ Z‡ fdd„Zd	d
„ Zdd„ Zd"dd„Z	dd„ Z
dd„ Zdd„ Zdd„ Zd#dd„Zdd„ Zdd„ Zd$d d!„Z‡  ZS )%ÚMasterQAc                    s†   d| _ d| _tƒ jdd� tj| _tj| _tj| _	tj
| _d| _tj| _tj| _tj| _tj| _|  ¡  | jrtd| _| jr‚|  ¡  d S )Nr   FT)Zmasterqa_modezManual Check)Úcheck_countÚauto_close_results_pageÚsuperÚsetUpr   ÚLATEST_REPORT_DIRZREPORT_ARCHIVE_DIRÚARCHIVE_DIRZHTML_REPORTÚRESULTS_PAGEZRESULTS_TABLEÚBAD_PAGE_LOGÚDEFAULT_VALIDATION_TITLEZ#MASTERQA_DEFAULT_VALIDATION_MESSAGEÚDEFAULT_VALIDATION_MESSAGEZ MASTERQA_WAIT_TIME_BEFORE_VERIFYÚWAIT_TIME_BEFORE_VERIFYZ"MASTERQA_START_IN_FULL_SCREEN_MODEZSTART_IN_FULL_SCREEN_MODEZ"MASTERQA_MAX_IDLE_TIME_BEFORE_QUITÚMAX_IDLE_TIME_BEFORE_QUITÚ_MasterQA__manual_check_setupÚheadlessZmaximize_window©Úself©Ú	__class__© úEE:\soccer\ml_env\Lib\site-packages\seleniumbase/masterqa/master_qa.pyr      s*    ÿÿÿÿzMasterQA.setUpc                 G   s<   d}|  j d7  _ | jr.| j dkr*t|ƒ d S | j|Ž  d S )Nz8
WARNING: MasterQA skips manual checks in headless mode!é   )r   r   ÚprintÚ_MasterQA__manual_page_check)r   ÚargsZwarn_msgr   r   r   Úverify/   s    
zMasterQA.verifyc                 C   s
   d| _ dS )z¼If this method is called, the results page will automatically close
        at the end of the test run, rather than waiting on the user to close
        the results page manually.
        TN)r   r   r   r   r   Úauto_close_results9   s    zMasterQA.auto_close_resultsc                    sR   | j r| jdkrtd| j ƒ |  ¡ r8|  t ¡ d ¡ |  | j¡ t	ƒ  
¡  d S )Nr   z2WARNING: %s manual checks were skipped! (MasterQA)r   )r   r   r    Ú_MasterQA__has_exceptionÚ_MasterQA__add_failureÚsysÚexc_infoÚ'_MasterQA__process_manual_check_resultsr   r   ÚtearDownr   r   r   r   r*   @   s    ÿÿzMasterQA.tearDownc                 C   s   t tt ¡ d ƒƒS )Niè  )ÚstrÚintÚtimer   r   r   r   Z__get_timestampM   s    zMasterQA.__get_timestampc                 C   s(   d| _ d| _d| _g | _| jdd� d S )Nr   F)Úarchive_past_runs)Úmanual_check_countÚmanual_check_successesÚincomplete_runsÚpage_results_listÚ_MasterQA__clear_out_old_logsr   r   r   r   Z__manual_check_setupP   s
    zMasterQA.__manual_check_setupTFc                    sæ   t j d¡}t j |ˆ j¡}t j |¡s2t  |¡ |rœtt ¡ ƒ}t j |dˆ j	¡}t j |¡sjt  |¡ t j |d| ¡}t
 ||¡ t  |¡ |râ|S nFt j dˆ j¡}‡ fdd„t  |¡D ƒ}	|	D ]}
t  t j ||
¡¡ qÈd S )NÚ.ú..zlog_%sc                    s8   g | ]0}|  d ¡s0|ˆ jks0|  d¡s0|ˆ jkr|‘qS )Zfailed_Zautomation_failure)Ú
startswithr   r   )Ú.0Úfr   r   r   Ú
<listcomp>n   s   



ûz1MasterQA.__clear_out_old_logs.<locals>.<listcomp>)ÚosÚpathÚabspathÚjoinr   ÚexistsÚmakedirsr,   r-   r   ÚshutilÚmoveÚlistdirÚremove)r   r.   Úget_log_folderÚabs_pathÚ	file_pathZarchive_timestampZarchive_dir_rootÚarchive_dirZlatest_report_localÚfilelistr8   r   r   r   Z__clear_out_old_logsW   s,    

ÿ

þzMasterQA.__clear_out_old_logsc                 C   s>   | j d }| j}d|||f }t |¡}d| }|  |¡ d S )Nr   zX<center><font color="#7700bb">%s #%s:</font></center><hr><font color="#0066ff">%s</font>a�  jconfirm({
                    boxWidth: '32.5%%',
                    useBootstrap: false,
                    containerFluid: false,
                    animationBounce: 1,
                    type: 'default',
                    theme: 'bootstrap',
                    typeAnimated: true,
                    animation: 'scale',
                    draggable: true,
                    dragWindowGap: 1,
                    container: 'body',
                    title: '%s',
                    content: '',
                    buttons: {
                        pass_button: {
                            btnClass: 'btn-green',
                            text: 'YES / PASS',
                            keys: ['y', 'p', '1'],
                            action: function(){
                                $jqc_status = "Success!";
                                jconfirm.lastButtonText = "Success!";
                            }
                        },
                        fail_button: {
                            btnClass: 'btn-red',
                            text: 'NO / FAIL',
                            keys: ['n', 'f', '2'],
                            action: function(){
                                $jqc_status = "Failure!";
                                jconfirm.lastButtonText = "Failure!";
                            }
                        }
                    }
                });)r/   r   r   Zescape_quotes_if_neededÚexecute_script)r   ÚquestionÚcountÚtitleZtitle_contentZjqcdr   r   r   Z__jq_confirm_dialogy   s    
þÿ
#Ýÿ&zMasterQA.__jq_confirm_dialogc                 G   sÖ  |s| j }nt|d ƒ}t|ƒdkr$d}|r>d|vr>|d }n|rNd|v rN|}| j}| jrdt| jƒ}t |¡ d}|  ¡  t	 
| j¡rŒd}nJt	 | j¡ d }z"|  d¡}|d u r¸td	ƒ‚d}W n tyÔ   d}Y n0 |�r^|  |¡ t d
¡ d}|�r t d¡ |  d¡}t|ƒdkrô�q qôt d¡ d }	z|  d¡}	W n t�yZ   |  d¡}	Y n0 nœ| jdk�rz|  d| ¡}
n|| jdk�r²|  d| ¡ t d¡ |  ¡  |  d¡}
nDz|  d| ¡ W n t�yØ   Y n0 t d¡ |  ¡  |  d¡}
|
}	|  jd7  _z| jj}W n t�y2   |  d¡}Y n0 dt|	ƒv �r„|  jd7  _| j d| jdd|| j|  ¡ d d… |df ¡ dS d| j }| j|| jd� | j d| jd ||| j|  ¡ d d… |df ¡ dS d S )!Nr   r   zApprove?ú?z <> Approve?FTzreturn jconfirmzjconfirm did not loadg{®Gáz”?çš™™™™™©?z return jconfirm.instances.lengthÚ0çš™™™™™¹?zreturn $jqc_statuszreturn jconfirm.lastButtonTextZiezPif(confirm("%s")){return "Success!"}
                    else{return "Failure!"}Úchromez‡if(confirm("%s"))
                    {window.master_qa_result="Success!"}
                    else{window.master_qa_result="Failure!"}zreturn window.master_qa_resultz�if(confirm("%s"))
                        {window.master_qa_result="Success!"}
                        else{window.master_qa_result="Failure!"}zreturn document.URLzSuccess!ú'"%s","%s","%s","%s","%s","%s","%s","%s"ZSuccessú-éýÿÿÿÚ*zfailed_check_%s.png©ÚfolderzFAILED!)r   r+   Úlenr   Zverify_delayÚfloatr-   ÚsleepZwait_for_ready_state_completer   Zis_jquery_confirm_activatedÚdriverZactivate_jquery_confirmrI   Ú	ExceptionÚ_MasterQA__jq_confirm_dialogÚbrowserÚ(_MasterQA__wait_for_special_alert_absentr   r/   Úcurrent_urlr0   r2   ÚappendÚ_MasterQA__get_timestampÚsave_screenshotr   )r   r"   ZinstructionsrJ   Zwait_time_before_verifyZuse_jqcZget_jqcZwaiting_for_responseZjqc_openÚstatusÚtextr`   Zbad_page_namer   r   r   Z__manual_page_checkª   sÖ    







ÿ
þÿýÿ
ýÿ

øÿÿ
øÿÿzMasterQA.__manual_page_checkc              	   C   s|   | j }tt|d ƒƒD ]J}z.| jjj}|j}d|vr<W  d S t d¡ W q t	y^   Y  d S 0 q| j 
¡  td| ƒ‚d S )Né   rM   rN   z3%s seconds passed without human action! Stopping...)r   Úranger,   r[   Z	switch_toÚalertre   r-   rZ   r   Úquitr\   )r   ÚtimeoutÚxrh   Zdummy_variabler   r   r   Z__wait_for_special_alert_absent(  s    

ÿz(MasterQA.__wait_for_special_alert_absentc                 C   s„   d}t tdƒrtjd urd}nbt | dƒrpt | jdƒr€trb| jjrn| jjd rn| jjd d rnd}q€| jjr€d}nt ¡ d d u}|S )NFÚlast_tracebackTÚ_outcomeÚerrorséÿÿÿÿr   )Úhasattrr'   rl   rm   Úpython3_11_or_newerrn   r(   )r   Zhas_exceptionr   r   r   Z__has_exception8  s"    
ÿ
þýzMasterQA.__has_exceptionNc                 C   sØ   d }|r0t |dƒr|j}nt |dƒr,|j}nd}|  jd7  _d| j }| j|| jd� | j ddd	|| jj	| j
|  ¡ d d
… d|f ¡ z6| j | jjd ¡ | j ¡  | j | jjd ¡ W n tyÒ   Y n0 d S )NÚmsgÚmessagez(Unknown Exception)r   zautomation_failure_%s.pngrV   rR   ZERRzERROR!rT   rS   r   )rp   rr   rs   r1   rc   r   r2   ra   r[   r`   r^   rb   Zswitch_to_windowÚwindow_handlesÚcloser\   )r   Ú	exceptionr(   Z
error_pager   r   r   Z__add_failureL  s:    


øÿÿ
zMasterQA.__add_failurec           	      C   sv   t j d¡}t j || j¡}t j || j¡}t|dƒ}d}d}|| }| |¡ | jD ]}| d| ¡ qV| 	¡  d S )Nr4   Úwz9"Num","Result","Screenshot","URL","Browser","Epoch Time",z."Verification Instructions","Additional Info"
z%s
)
r:   r;   r<   r=   r   r   ÚopenÚwriter2   ru   )	r   rE   rF   Zlog_filer8   Zh_p1Zh_p2Zpage_headerÚliner   r   r   Z__add_bad_page_log_filen  s    


z MasterQA.__add_bad_page_log_filec                 C   sP   t j d¡}t j || j¡}| j}t j ||¡}t|dƒ}| |¡ | ¡  |S )Nr4   rw   )	r:   r;   r<   r=   r   r   rx   ry   ru   )r   ÚhtmlrE   rF   Zresults_file_nameÚresults_filer8   r   r   r   Z__add_results_page{  s    

zMasterQA.__add_results_pagec                 C   sì  d}| j | j }| jstdƒ tdƒ | j| j kr4ntdƒ d}| jdkrVtdƒ d}|rx| j dkrntdƒ qxtd	ƒ n |  ¡  | jdd
�}| tj	¡d }tj
 d¡}tj
 || j¡}tj
 ||¡}d| }	d}
|dkrÞd}
d}| jdkrðd}d| j|
|| j || jf }d| }tj
 dd| j|	 | j¡d f ¡}tj
 |	| j¡}d| j }d|	|||f }d}d}| jD ]°}| d¡}|d dk�s˜|d dk�rn|�sªd}|d7 }|d }t|ƒdk�rÐ|dd… d }d d!| d" |d#  |d# f d$ d |d |f  }| d%d¡}|d&| 7 }�qn|d'7 }d(|||f }d)tƒ |f }|  |¡}tj
 || j¡}t |tj
 |¡¡ | j dk�rŠtd*| ƒ |  d| ¡ |�rªt d+¡ n>td,ƒ z t| jjƒ�rÐt d-¡ �q´W n t�yæ   Y n0 d S ).NTÚ z&
*** MasterQA Manual Test Results: ***z0WARNING: Not all tests passed manual inspection!Fr   z(WARNING: Not all tests finished running!z$SUCCESS: Everything checks out OKAY!z)WARNING: No manual checks were performed!)rD   ro   r4   z	file://%sz#11BB11z#EE3A3Aañ  <div><table><thead><tr>
              <th>TESTING SUMMARY</th>
              <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
              </tr></thead><tbody>
              <tr style="color:#00BB00"><td>CHECKS PASSED: <td>%s</tr>
              <tr style="color:%s"     ><td>CHECKS FAILED: <td>%s</tr>
              <tr style="color:#4D4DDD"><td>TOTAL VERIFICATIONS: <td>%s</tr>
              <tr style="color:%s"     ><td>INCOMPLETE TEST RUNS: <td>%s</tr>
              </tbody></table>zS<h1 id="ContextHeader" class="sectionHeader" title="">
                     %s</h1>r5   z%s%sr   z%szã<p><p><p><p><h2><table><tbody>
            <tr><td>LOG FILES LINK:&nbsp;&nbsp;<td><a href="%s">%s</a></tr>
            <tr><td>RESULTS TABLE:&nbsp;&nbsp;<td><a href="%s">%s</a></tr>
            </tbody></table></h2><p><p><p><p>z<h2><table><tbody></div>ú,z	"FAILED!"z"ERROR!"z¯<thead><tr>
                        <th>SCREENSHOT FILE&nbsp;&nbsp;&nbsp;&nbsp;</th>
                        <th>LOCATION OF FAILURE</th>
                        </tr></thead>r   é<   é:   z...z<a href="%s">%s</a>zfile://ú/é   zF
                    &nbsp;&nbsp;&nbsp;&nbsp;<td>
                    ú"z<tr><td>%s</tr>
z</tbody></table>z%s%s%sz+<html><head>%s</head><body>%s</body></html>z+
*** The manual test report is located at:
g      ð?z1
*** Close the html report window to continue ***rP   )r/   r0   r   r    r1   Ú _MasterQA__add_bad_page_log_filer3   Úsplitr:   Úsepr;   r<   r=   r   r   r2   rX   Úreplacer   Ú_MasterQA__add_results_pager   r@   ÚcopyfileÚrealpathrx   r-   rZ   r[   rt   r\   )r   r   Z
perfectionZfailures_countZ
log_stringZ
log_folderrE   rF   Úlog_pathZweb_log_pathZtf_colorZir_colorZsummary_tableZlog_link_shownZcsv_linkZcsv_link_shownZ	log_tableZfailure_tableZany_screenshotsrz   Zdisplay_urlZ
table_viewZreport_htmlr|   Zarchived_results_filer   r   r   Z__process_manual_check_results…  sÆ    




	úøþÿÿÿ
üý


ÿþûÿþ
ÿz'MasterQA.__process_manual_check_results)TF)N)F)Ú__name__Ú
__module__Ú__qualname__r   r#   r$   r*   rb   r   r3   r]   r!   r_   r%   r&   r„   rˆ   r)   Ú__classcell__r   r   r   r   r
      s    
 ÿ
"1~
"
r
   )Ú__doc__r:   r@   r'   r-   Zselenium.common.exceptionsr   r   Zseleniumbaser   Zseleniumbase.core.style_sheetr   Zseleniumbase.configr   Zseleniumbase.fixturesr   rq   Úversion_infor
   r   r   r   r   Ú<module>   s   
