
    iJ                     T    d Z ddlZddlmZ dZdZg Zg Zd	dZd Z	e
dk(  r e	        yy)
u  
Argos QA Tester - Naver Blog Keyword Analysis DEFINITIVE Test
Confirmed: API endpoint is /api/naver-blog/keyword-analysis (POST)
Response includes: relKeyword, monthlyPcQcCnt, monthlyMobileQcCnt, compIdx, etc.
Table columns: 키워드, PC 검색량, 모바일 검색량, PC CTR, 모바일 CTR, CPC, 경쟁도
Sorting supported on all columns.
Keyword selection by clicking rows (max 5).
    N)sync_playwrightz8/home/jay/workspace/memory/reports/task-1933-screenshotsz http://localhost:8000/dashboard/c                     ddddj                  | d      }| d| }|r|d| z  }t        |       t        j                  | ||d       y )	N[PASS][FAIL][WARN]PASSFAILWARNz[INFO] u    — )statustestdetail)getprintresultsappend)r   	test_namer   iconmsgs        Q/home/jay/workspace/memory/reports/task-1933-screenshots/03_keyword_definitive.py
log_resultr      sY    hAEEfhWDF!I;
Cvh	#JNNfi6JK    c                    ? t               5 } | j                  j                  d      }|j                  ddd      }|j	                         }d }d }|j                  d	|       |j                  d
|       t        d       |j                  t        d       |j                  d       |j                  t         d       |j                         }t        ddd|j                   d|        t        d       |j                  d      j                   }|j#                  dd       |j%                          |j                  d       |j                  t         d       |j                  d      j                   }t        ddd       t        d       |j                  d      }	|	j'                         dkD  rt        dd        nt        d!d"d#       |j                  d$      j                   }
|
j)                  d%&      r#|
j+                  d'      }t        dd(d)| d*       nt        d+d(d,       |j                  d-      j                   }|j)                  d%&      rt        dd.       nt        d+d/d,       t        d0       |
j%                          |
j-                  d1       |
j/                  d2       |
j1                         }d2|v rt        dd3d4| d*       nt        d+d3d5| d*       |j                  t         d6       t        d7       |
j1                         }t        d8| d*       |j%                          t        dd9d:| d*       |j                  d;       |j                  t         d<       t        d=       d>}d>}d?}t3        d@      D ]  }t5        j6                  dA       |dBz   dAz  }t        dC| dD|dBz    dE       d>}	 |j                  dF      j9                  dG&      }dH|v rt        dI       d}	 |j                  dJ      }|j'                         }|dkD  r|j                   j)                  dK&      rj|j                   j9                  dG&      ?t=        ?fdLdMD              r:d}|j                  dN      j'                         }t        ddOdP| dQ| dR| dS        n	 |j                  dF      j9                  dG&      }dT|v sdU|v rd}t        ddVdW| dX        ndY|v rd}t        ddZd[| dX        n	 	 |j                  d\      j                   }|j)                  d]&      rU|j9                  dK&      }|j?                         rd^|v sd_|v r+d}|j?                         }t        d+d`da| db|d d]  d*        n t        dc       |j                  t         dd       t        de       t        ddfdg       |rt        dh       |j                  dJ      }|j'                         }t        di|        |dkD  r|j                  dj      jA                         }t        dk|        h dl}|D ch c]%  }|j?                         |v s|j?                         ' }}||D ch c]  }|j?                          c}z
  } tC        |      dmk\  rt        ddndo|        nt        d!dpdo| dq|         |j                  dN      j'                         }|dkD  rt        ddr| ds       nt        d+dtdu|d dv  dw       t        dx       d}!tE        |d dy       D ]  \  }"}#|#j?                         }#|#s	 |j                  dj      jG                  |"      }$|$j)                  dK&      rk|$j%                          |j                  dz       |$j9                  dK&      }%d{|%v xs d||%v }&|&rt        dd}|# d*d~|% d*       nt        d!d}|# d*d       |!dBz  }!|!dAk\  s n |j                  t         d       t        d       t        d       |j                  dN      }'|'j'                         }(d})|(dkD  rt3        tK        |(dm            D ]  }"	 |'jG                  |"      }*|*j9                  dK&      }+|*j%                          |j                  dG       |j                  dF      j9                  dG&      },dY|,v r-t        dd|"dBz    d|+d d j?                          d*       |)dBz  }) |)dkD  rt        ddd|) d       nt        d!dd       nt        d!dd       |j                  t         d       t        d       	 |j                  dF      j9                  dG&      },d|,v rI|,jM                  d      D -cg c]	  }-d|-v s|- }.}-t        ddd|.r|.d   j?                         nd        nt        d!dd       n2|r3t        d       t        d|        |j                  t         d       nt        d       tN        D /cg c]  }/d|/jQ                  dd?      v s|/ }0}/|0r.t        dtC        |0       d       |0D ]  }/t        d|/         nt        d+dd       	 |j                  dF      j9                  d;&      }d2|v r>|jS                  d2      }1|tU        d|1dz
        |1dz    }2t        dtW        |2              nt        d       t        d|d d         t        d+dd       t        d       tN        D /cg c]  }/d|/jQ                  dd?      v s|/ }3}/|3D /cg c]  }/d|/jQ                  dd?      v s|/ }4}/|4r|4D ]d  }/|/jQ                  dd?      }5|5rd|5 nd?}6tY        |5tZ              r|5dk  rdn|5rdnd?}7t        dC|7 d|/jQ                  dd       d|/d    d|6        f |4D /cg c]-  }/tY        |/jQ                  d      tZ              s#|/d   dk\  s,|// }8}/|8rt        d+dtC        |8       d       n&t        ddtC        |4       d       nt        d!d       |j                  t         d       t        d       |j]                          d d d        t        d       t        d       t        d       t_        d t`        D              }9t_        d t`        D              }:t_        dÄ t`        D              };t        d|9 d|: d|; dtC        t`               d	       t        dȫ       t`        D ]  }<dddd̜jQ                  |<d   dͫ      }=t        d|= d|<d           |<d   s6|<d   jM                  d      d dA D ]2  }>|>j?                         st        d|>j?                         d d         4  t        d       y # t:        $ r Y 	w xY w# t:        $ r}Y d }~	d }~ww xY w# t:        $ r Y w xY w# t:        $ r Y 
@w xY wc c}w c c}w # t:        $ r%}t        d!d|# d*tI        |             Y d }~2d }~ww xY w# t:        $ r'}t        d!d|"dBz    tI        |             Y d }~d }~ww xY wc c}-w # t:        $ r!}t        d!dtI        |             Y d }~d }~ww xY wc c}/w # t:        $ r}t        d|        Y d }~d }~ww xY wc c}/w c c}/w c c}/w # 1 sw Y   SxY w)NT)headlessi  i  )widthheight)viewportc                     d| j                   v sd| j                   j                         v rSt        j                  d| j                  | j                   d       t        d| j                   d| j                           y y )N
naver-blogkeywordreq)typemethodurlz
    [REQ] r   )r%   lower	api_callsr   r$   r   )r"   s    r   
on_requestzrun_tests.<locals>.on_request#   s_    sww&)sww}}*F  %3::cgg!VW
3::,ay9: +Gr   c                     d| j                   v rSt        j                  d| j                  | j                   d       t	        d| j                   d| j                           y y )Nr    res)r#   r   r%   z
    [RES] r   )r%   r'   r   r   r   )r*   s    r   on_responsezrun_tests.<locals>.on_response(   sM    sww&  %3::cgg!VW
3::,ay9: 'r   requestresponsez=
=== TEST 1: Navigate to http://localhost:8000/dashboard/ ===domcontentloaded)
wait_untili  z/03_keyword_01_loaded.png)pathr	   zDashboard navigationzURL: z
 | Title: u4   
=== TEST 2: Click 네이버블로그 tab button ===u%   button:has-text('네이버블로그')visible)statetimeouti  z/03_keyword_02_naver_tab.pngu   Click 네이버블로그 tabz+Tab clicked, 3s wait for rendering completeu6   
=== TEST 3: Verify Step 0 — 키워드 분석 UI ===u   text=키워드 분석r   u!   Step 0 '키워드 분석' visibler   u   Step 0 '키워드 분석'zText not found in pageu2   input[placeholder*='키워드를 입력하세요']i  )r3   placeholderzKeyword input fieldzplaceholder: ''r
   zNot visibleu   button:has-text('분석')u   분석 button presentu   분석 buttonu7   
=== TEST 4: Type '실손보험' into keyword input ===z	Control+au   실손보험u   Type keyword '실손보험'zConfirmed input value: 'zUnexpected value: 'z /03_keyword_03_keyword_typed.pngu$   
=== TEST 5: Click 분석 button ===z  Input value before click: 'u   Click 분석 buttonzClicked with input='i  z/03_keyword_04_after_click.pngz?
=== TEST 6: Wait for results (up to 30s, polling every 2s) ===F          z  [zs] Attempt z/15...bodyi  u
   분석 중u        (분석 중 - still loading)tablei,  c              3   &   K   | ]  }|v  
 y w)N ).0ttbl_texts     r   	<genexpr>zrun_tests.<locals>.<genexpr>   s     ^Q1=^s   )	   키워드u	   검색량u   경쟁CTRztbody trzResults table appearedzTable visible at zs, z rows, z	 table(s)u   연관 키워드 분석 결과u   개 키워드z Keyword analysis results sectionu*   '연관 키워드 분석 결과' found at su   선택한 키워드 순위zKeyword selection UI appearedu&   '선택한 키워드 순위' found at z
.bg-red-50   u   실패u   오류z Keyword analysis error displayedz	Error at zs: 'z&
=== TEST 7: Screenshot of results ===z/03_keyword_05_results.pngz"  Saved: 03_keyword_05_results.pngzResults screenshot takenz03_keyword_05_results.pngz,
=== TEST 8: Check results table content ===z  Tables on page: thz  Column headers: >   	   경쟁도   PC 검색량   모바일 검색량rB      zExpected keyword data columnszFound: zKeyword data columns partialz, Missing: zResults table has dataz keyword rowszResults table rowsz0 rows found (table headers:    )z+
=== TEST 9: Test column header sorting ===   i   u   ▼u   ▲z	Sort by 'zSort indicator visible: 'zClicked but no sort indicatorzSort click 'z/03_keyword_06_after_sort.pngz*  Screenshot: 03_keyword_06_after_sort.pngz2
=== TEST 10: Click keyword rows for selection ===zSelect keyword row zRow text: '(   z
Click row zKeyword row selection workingzSuccessfully selected z	 keywordszKeyword row selectionzNo rows clickablezKeyword row clickzNo tbody rows to clickz"/03_keyword_07_after_selection.pngz/  Screenshot: 03_keyword_07_after_selection.pngu   /5개 선택
zSelection counter visiblez	Counter: foundzSelection counteru   '/5개 선택' not foundzSelection counter checkz'
=== ERROR: Keyword analysis failed ===z	  Error: z/03_keyword_06_error.pngz:
=== [INVESTIGATION] No results and no error after 30s ===zkeyword-analysisr%   z#  keyword-analysis API was called: z timesz    z!keyword-analysis API never calledz(Button click did not trigger API request2      u     '실손보험' context: u,     '실손보험' NOT found in page body textz  Body sample: i  z  Could not read body: zNo keyword results appearedz$30s timeout with no results or errorz
=== API CALL SUMMARY ===r    r   zHTTP OKERRz] r$   REQr   zkeyword-analysis API errorsz failed callsz(keyword-analysis API called successfullyz call(s)z&No keyword-analysis API calls capturedz/03_keyword_08_final.pngz,
  Final screenshot: 03_keyword_08_final.pngzB
=================================================================u6     ARGOS QA REPORT: 네이버블로그 Keyword AnalysiszA=================================================================c              3   2   K   | ]  }|d    dk(  sd  yw)r   r	   r9   Nr=   r>   rs     r   rA   zrun_tests.<locals>.<genexpr>n       =qq{f'<=   c              3   2   K   | ]  }|d    dk(  sd  yw)r   r
   r9   Nr=   rW   s     r   rA   zrun_tests.<locals>.<genexpr>o  rY   rZ   c              3   2   K   | ]  }|d    dk(  sd  yw)r   r   r9   Nr=   rW   s     r   rA   zrun_tests.<locals>.<genexpr>p  rY   rZ   z	
  PASS: z  |  FAIL: z  |  WARN: z  |  TOTAL: zA-----------------------------------------------------------------r   r   r   r   z[?]z  r   r   z           d   )1r   chromiumlaunchnew_contextnew_pageonr   gotoBASE_URLwait_for_timeout
screenshotSCREENSHOT_DIRtitler   r%   locatorfirstwait_forclickcount
is_visibleget_attributepressfillinput_valuerangetimesleep
inner_text	Exceptionanystripall_text_contentslen	enumeratenthstrminsplitr'   r   findmaxrepr
isinstanceintclosesumr   )@pbrowsercontextpager(   r+   rh   tab
tab_activestep0inpr4   btnval
val_beforeresult_founderror_found
error_textattemptelapsedloading_txtr:   tablestc	row_counte	error_diverr_txthdrsexpected_colsh
found_colsmissing_colssort_tests_doneihdr_txthdr_elemupdated_hdrsort_indicatorrowsrcclicks_donerowrow_textbody_txtline	sel_matchcanalyze_callsidxctxnaver_callsanalyze_apirD   
status_strok_fail
api_errorspass_cfail_cwarn_crX   r   dlr@   s@                                                                  @r   	run_testsr      s1   		 Ka**##T#2%%/M%N!	;
	;
 		:&
K( 	NO		('9	:d#//HIJ

61488*Jug6	8 	EFllBCII9d3		d#//KLM\\"IJPP
69@	B 	GH45;;=1vBCv:<TU llOPVV>>$>'++M:Kv4'}A68 v4mD ll67==>>$>'v67v> 	HI				+ ooS v<@XY\X]]^>_`v<@STWSXXY>Z[//OPQ 	56__&
-j\;<		60)*Q7	9d#//MNO 	PQ
Ry ?	GJJqM{a'GCyGAI;f=>  K||F+66s6C4'<="&K
g.\\^6fll55c5B%||66s6CH^2]^^'+$(LL$<$B$B$D	"6+C%6wis9+WUWTXXa#bd
||F+66s6C3t;RV?V#'Lv'I!KG9TUVX/47#'Lv'F!GyPQRT	 8 LL6<<	'''4'2232?G}}8w+>(gBU&*%,]]_
"6+M%.witJt<L;MQ#OQ{?	D 	78//IJK24657RS AB\\'*FB&rd+,Av||D);;=*4&12 a15TAm9SaggiT
T,4/Ha	/HHz?a'v'F!(57 v'E!(K~NP !LL4::<	q=v'?"+M:< v';!>tBQxjJL DE"#"+D!H"5 JAw%mmoG" N#'<<#5#9#9!#<#..s.;$NN, 11#6*2*=*=c*=*JK-2k-A-YUkEYN- *6Ywiq3I-F{mST+U!W !+6Ywiq3I+J!L+q0O '!+-0 '77T%UVBD KL||J/ZZ\6"3r1:. KK"&((1+C'*~~c~'BHIIK 11#6'+||F';'F'Fs'F'SH;xG *65H13N-8#29L9L9N8Oq+Q!S +q 0K  #Q"6+J%;K=	#RT #6+BDWXv':<TU'77Y%Z[GI	J#||F3>>s>KH%16>nnT6J$edn`dNdT$e	$e"6+F%.yy|/A/A/CV].^#_a #6+>@Z[ <>Ij\*+OON#33K!LOM OP )2\15G155QVXZK[5[Q\M\;C<N;OvVW& &AD*%& 6#FEG
5||F+66t6D!T)))N3Cs1c"f~c#g6C6tCykBCHIOD#J<89 v<=? 	*+"+PQ|quuUB?O/OqPP"-XQ1CquuUTVGW1WqXX  XEE(B',-uQC[2
",Q"4S$PQuWYG9BquuXe'<&=Qqxj*VW	X
 &1lJquuXPS4TYZ[cYdhkYk!lJl6#@!*o.m<> 6#M!+./x8: vGH//GHI=?W
K\
 
-	
BC	&M=G==F=G==F=G==F	Jvhk&VHLQTU\Q]P^^`
ab	&M < (HEII!H+W\]4&!F)%&X;k''-bq1 <88:K
4C(8'9:;<	< 
&Mg  "  $    . U/HP % N"6\'!+Dc!fMMN8  ) K&vAaC5/A3q6JJK$ %f
 ! Jv'@#a&IIJ ]&  5/s3445 QX m	K Ks  Oz42vB*v$-z40<v;,z4.v;z4	B w	B9z4ww,z43w 
B4z4?Bw%z4"A2z4Bx+Az48y<	y	y	
5y?A
z4	y;#y;'?z4'A?z & z4z% z%$z4*z*z*A1z49$z/z/'z/+A8z4	v!z4 v!!z4$	v8-z43v88z4;	wz4wz4	wz4wz4%	x.xz4xz4	yy;z4yz4	y	y8y3-z43y88z4 	z"	zz4z""z44z>__main__)r6   )__doc__rt   playwright.sync_apir   rg   rd   r   r'   r   r   __name__r=   r   r   <module>r      sG     /K-
	L^@ zK r   