
    hSh0                        S SK JrJrJrJr  S SKJrJr  S SKrS SK	J
r
  S SKrS SKJrJr  S SKrS SKJrJrJrJr  S SKJr  S SKJr  S S	KJr  S SKrS S
KJr  S SKJr  S SK J!r!  S SK"J#r#  S SK$J%r&  S SK'J(r(J)r)  \RT                  " \RV                  SS9  \RX                  " \-5      r.\" SS9r/\S 5       r0\S 5       r1\" SS9S\\\2\24      S\\2\24   S\\2   4S j5       r3S\44S jr5S\2S\2S\2S\\2   4S  jr6S\2S\74S! jr8S7S"\2S#\9S$\:S\\2\4   4S% jjr;S8S"\2S&\4S#\9S$\:S\\2\4   4
S' jjr<S(\
S\24S) jr=S(\
S\24S* jr>S(\
S\\\2\24      4S+ jr?S(\
S,\2S\\\2\24      4S- jr@S(\
S\\\2\4      4S. jrAS(\
S\\\2\24      4S/ jrBS(\
S,\2S\\\2\24      4S0 jrCS(\
S\24S1 jrDS(\
S,\2S\\\2\24      4S2 jrES(\
S\24S3 jrFS(\
S\\2\4   4S4 jrGS8S"\2S5\\2   S&\4S#\9S$\:S\\2   4S6 jjrHg)9    )capture_exceptioncapture_messageset_tagset_context)monitor_openai_apimonitor_critical_systemN)BeautifulSoup)urljoinurlparse)OptionalListDictAny)
ChatOpenAI)LangChainTracer)OpenAI	webdriverOptions)By)WebDriverWait)expected_conditions)TimeoutExceptionWebDriverExceptionz4%(asctime)s - %(name)s - %(levelname)s - %(message)s)levelformatzopenai-cost-tracking)project_namec                       SSK Jn   U $ ! [         a0  n[        R	                  SU 35        [        USS05         SnAgSnAff = f)z Get OpenAI API key from settingsr   )OPENAI_API_KEYzError loading OpenAI API key: functionget_openai_api_keyN)config.settingsr    	Exceptionloggererrorr   )r    es     4D:\Projects\AI-TestCaseGenerator\ai\url_generator.pyr"   r"      sG    2 5aS9:!j*>?@s   
 
A&?Ac                       SSK Jn JnJn  U UUS.$ ! [         a0  n[
        R                  SU 35        [        USS05         SnAgSnAff = f)z*Get OpenRouter configuration from settingsr   )OPENROUTER_API_KEYOPENROUTER_SITE_URLOPENROUTER_SITE_NAME)api_keysite_url	site_namez(Error loading OpenRouter configuration: r!   get_openrouter_configN)r#   r*   r+   r,   r$   r%   r&   r   )r*   r+   r,   r'   s       r(   r0   r0   (   sY    
aa)+-
 	

  ?sCD!j*ABCs    
A&AATcriticalmessagesconfigreturnc                     U(       a  UR                  S5      (       d  [        R                  S5        g[        SUS   S9nUR                  R
                  R                  US   US   S.0 S	U S
9nUR                  S   R                  R                  $ ! [         a0  n[        R                  SU 35        [        USS05         SnAgSnAff = f)z'Make API call to OpenRouter as fallbackr-   z OpenRouter API key not availableNzhttps://openrouter.ai/api/v1)base_urlr-   r.   r/   )zHTTP-RefererzX-Titlez deepseek/deepseek-chat-v3.1:free)extra_headers
extra_bodymodelr3   r   z"Error making OpenRouter API call: r!   make_openrouter_call)getr%   r&   r   chatcompletionscreatechoicesmessagecontentr$   r   )r3   r4   client
completionr'   s        r(   r;   r;   7   s    VZZ	22LL;<39%

 [[,,33 &z 2!+. 4 4 

 !!!$,,444 9!=>!j*@ABs   2B AB 
C&C		Cc                  B    SSK Jn   SSKJn  U" 5       nUR	                  S5        UR	                  S5        UR	                  S5        U R
                  " US9nUR                  5         g! [         a+  n[        R                  S	[        U5       35         S
nAgS
nAff = f)z0Check if Selenium and ChromeDriver are availabler   r   r   
--headless--no-sandbox--disable-dev-shm-usageoptionsTz%Selenium/ChromeDriver not available: NF)seleniumr   !selenium.webdriver.chrome.optionsr   add_argumentChromequitr$   r%   warningstr)r   r   chrome_optionsdriverr'   s        r(   check_selenium_availabilityrT   U   s    &= !##L1##N3##$=>!!.9 >s1vhGHs   A&A) )
B3!BB
test_cases	test_typeprefixc                   ^   T (       a  [        T R                  5       5      S:  a  [        R                  S5        g/ SQn/ nU H  nUT ;  d  M  UR	                  U5        M     U(       a  [        R                  SU 35        U(       a!  U S3T ;  a  [        R                  SU 35        / SQn[        U 4S	 jU 5       5      nUS
:  a  [        R                  SU S35        T R                  S5      nUS:  a  [        R                  SU S35        [        R                  SU 35        T $ ! [         a-  n	[        R                  S[        U	5       35        T s Sn	A	$ Sn	A	ff = f)z,Validate the quality of generated test casesd   zTest cases too short or emptyN)Title:z	Scenario:zSteps to reproduce:zExpected Result:z	Priority:zMissing required elements: _z$Test cases don't use proper prefix: )zit should workzpage should loadzshould be displayedzshould function properlyzshould behave correctlyc              3   n   >#    U  H*  oR                  5       TR                  5       ;   d  M&  S v   M,     g7f)   N)lower).0phraserU   s     r(   	<genexpr>._validate_test_case_quality.<locals>.<genexpr>   s'     `-<<>ZM]M]M_;_!!-s   %5	5   Found z vague phrases in test casesrZ      zOnly z* test cases generated, expected at least 3z(Test case quality validation passed for z$Error validating test case quality: )lenstripr%   rP   appendsumcountinfor$   r&   rQ   )
rU   rV   rW   required_elementsmissing_elementselementvague_phrasesvague_counttitle_countr'   s
   `         r(   _validate_test_case_qualityrr   h   sP   6S!1!1!34s:NN:;
 (Gj( ''0 ) NN89I8JKL l*4NNA&JK
 `-``?NNVK=0LMN !&&x0?NNU;-/YZ[ 	>ykJK ;CF8DEs)   9D. D. CD. .
E%8"E E% E%c           	      h    SSSS.SSSS.SSSS.S	S
SS.SSSS.SSSS.S.nUR                  U 0 5      $ )z2Get the configuration for a specific URL test typeTC_FUNCzXfunctional test cases focusing on valid inputs, form submissions, and expected behaviors2   )rW   description	max_countTC_NEGzNnegative test cases focusing on invalid inputs, error handling, and edge casesTC_UIzPUI test cases focusing on visual elements, layout, and user interface componentsTC_UXzTuser experience test cases focusing on user interaction, workflow, and accessibility	TC_COMPATzMcompatibility test cases across different browsers, devices, and screen sizesTC_PERFzOperformance test cases focusing on load times, responsiveness, and optimization)dashboard_functionaldashboard_negativedashboard_uidashboard_uxdashboard_compatibilitydashboard_performance)r<   )rV   base_configss     r(   get_url_test_type_configr      s      u!
 k
 m
 q
 "j$
  l"
5L@ Ir**    url	wait_timescroll_pausec                    Sn [         R                  SU  35        [        5       nUR                  S5        UR                  S5        UR                  S5        UR                  S5        UR                  S5        UR                  S5        UR                  S	5        UR	                  S
S/5        UR	                  SS5        [
        R                  " US9nUR                  S5        UR                  U 5        [         R                  SU S35        [        R                  " U5        [         R                  S5        UR                  S5      nSnSnXg:  a  UR                  S5        [        R                  " U5        UR                  S5      nX:X  a  [         R                  S5        O,UnUS-  n[         R                  SU SU SU 35        Xg:  a  M  UR                  S5        [        R                  " S5         [        US5      R                  [        R                  " [        R                   S45      5        UR&                  n	[)        U	S 5      n
U [+        U
5      [-        U
5      [/        U
5      [1        X5      [3        U
5      [5        U
5      [7        X5      [9        U
5      [;        X5      [=        U
5      [?        U
5      S!.n[         R                  S"U  35        [         R                  S#[A        US$   5       S%[A        US&   5       S'[A        US(   5       S)35        UU(       a   URC                  5         $ $ ! ["         a    [         R%                  S5         GN"f = f! [D         a"  n[         R%                  S*U 35         SnA$ SnAff = f! [F         a8  n[         RI                  S+U  S,[K        U5       35        [M        XS-S..5        e SnAf[D         a8  n[         RI                  S/U  S,[K        U5       35        [M        XS-S..5        e SnAff = f! U(       aA   URC                  5         f ! [D         a"  n[         R%                  S*U 35         SnAf SnAff = ff = f)0zPExtract comprehensive data from a website URL using Selenium for dynamic contentNz#Fetching dynamic content from URL: rF   rG   rH   z--disable-gpuz--window-size=1920,1080z|--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36z---disable-blink-features=AutomationControlledexcludeSwitcheszenable-automationuseAutomationExtensionFrI   zEObject.defineProperty(navigator, 'webdriver', {get: () => undefined})zWaiting z! seconds for initial page load...z$Scrolling to load dynamic content...z!return document.body.scrollHeightr      z/window.scrollTo(0, document.body.scrollHeight);z(No more content to load, stopping scrollr]   zScroll attempt /z, new height: zwindow.scrollTo(0, 0);
   bodyz3Timeout waiting for body element, proceeding anywayhtml.parserr   titlemeta_descriptionheadingslinksformsbuttonsimagestext_content
navigationfooterpage_structurez)Successfully extracted dynamic data from rd   r   z links, r   z forms, r   z buttonszError closing WebDriver: zSelenium WebDriver error for : rK   )r   methodz!Error in Selenium extraction for )'r%   rk   r   rM   add_experimental_optionr   rN   execute_scriptr<   timesleepr   untilECpresence_of_element_locatedr   TAG_NAMEr   rP   page_sourcer	   _extract_title_extract_meta_description_extract_headings_extract_links_extract_forms_extract_buttons_extract_images_extract_text_content_extract_navigation_extract_footer_analyze_page_structurerf   rO   r$   r   r&   rQ   r   )r   r   r   rS   rR   last_heightscroll_attemptsmax_scroll_attempts
new_heightr   soupdatar'   s                r(   "extract_website_data_with_seleniumr      s   Fd@9#?@ !##L1##N3##$=>##O4##$=>##  %c  	d##$ST../@CVBWX../GO !!.9ef 	

3 	hyk)JKL

9 	:;++,OP3!!"ST JJ|$  ../RSJ(FG$Kq OKK//):!<O;PP^_i^jkl! 3& 	67

1	R&"%++..V/DE (([-8 #D) 9$ ?)$/#D.#D)'-%d01$7-d8%d+5d;
 	?uEFfSg/0T']9K8LHUXY]^gYhUiTjjrst @ I   	RNNPQ	RN  @!:1#>??@  4SECF8DE!J?@ 8RAxHI!J?@
 @ @!:1#>??@ s   GN 'N =?L< <C&N *M"<MN MN "
N,N		N
P3OP3PPP Q P0/Q 0
Q:QQ QQ use_seleniumc                    U(       a4  [        5       (       a%   [        R                  SU  35        [        XU5      $ U(       a  [        R                  S5         [        R                  SU  S35        [        R                  " 5       nUR                  R                  SS	S
SSSSSSSSS.5        Sn[        S5       H  n US:X  a  UR                  U SS9nObUS:X  a.  UR                  R                  SS05        UR                  U SS9nO.UR                  R                  SSS.5        UR                  U SS9nUR                  5           O   Uc  [        R                  R%                  S"5      e['        UR(                  S#5      n	U [+        U	5      [-        U	5      [/        U	5      [1        X5      [3        U	5      [5        U	5      [7        X5      [9        U	5      [;        X5      [=        U	5      [?        U	5      S$.n
[        R                  S%U  35        U
$ ! [         aA  n[        R                  S[        U5       35        [        R                  S5         SnAGNSnAff = f! [        R                  R                   aI  nUR                   R"                  S:X  a)  US:  a#  [        R                  SUS-    S35         SnAGM  e SnAf[         a/  nUS:  a#  [        R                  S US-    S!35         SnAGM;  e SnAff = f! [         a8  n[        RA                  S&U  S'[        U5       35        [C        US(U 05        e SnAff = f))zLExtract comprehensive data from a website URL with optional Selenium supportz#Attempting Selenium extraction for zSelenium extraction failed: z,Falling back to requests-based extraction...NzHSelenium requested but not available, using requests-based extraction...zFetching content from URL: z using requestszoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36zUtext/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8zen-US,en;q=0.9zgzip, deflate, br1z
keep-alivedocumentnavigatenonez	max-age=0)
User-AgentAcceptzAccept-LanguagezAccept-EncodingDNT
ConnectionzUpgrade-Insecure-RequestszSec-Fetch-DestzSec-Fetch-ModezSec-Fetch-SitezCache-Controlre   r      )timeoutr]   r   zuMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36zhttps://www.google.com/)Refererr   i  rc   z403 Forbidden on attempt z, trying different approach...zRequest failed on attempt z, retrying...z$All attempts to fetch the URL failedr   r   z!Successfully extracted data from zError fetching content from r   r   )"rT   r%   rk   r   r$   rP   rQ   requestsSessionheadersupdateranger<   raise_for_status
exceptions	HTTPErrorresponsestatus_codeRequestExceptionr	   rB   r   r   r   r   r   r   r   r   r   r   r   r&   r   )r   r   r   r   selenium_errorsessionr   attemptr'   r   r   s              r(   extract_website_datar   /  s    355	HKK=cUCD5clSS 
^_S1#oFG ""$ Lm/2&),(($( 
 	 QxG a<&{{3{;H\OO**$  '^,   '{{3{;H OO**#< 'X,   '{{3{;H))+)  F %%667]^^X--}= #D) 9$ ?)$/#D.#D)'-%d01$7-d8%d+5d;
 	7u=>k  	HNN9#n:M9NOPKKFGG	Hd &&00 ::))S0Wq[NN%>w{mKi#jk Q;NN%?!}M#Z[>  3C53q6(CD!eS\*sz   #H A%K? ?B	ICK? 
I6IIK<<<K 8K? ?K  K<"K7/K? 6K77K<<K? ?
M	3L<<Mr   c                 r    U R                  S5      nU(       a  UR                  5       R                  5       $ S$ )zExtract page titler    )findget_textrg   )r   	title_tags     r(   r   r     s/    		'"I+49%%'<"<r   c                 \    U R                  SSS0S9nU(       a  UR                  SS5      $ S$ )zExtract meta descriptionmetanamerv   )attrsrB   r   )r   r<   )r   	meta_descs     r(   r   r     s1    		&(?	@I+49==B'<"<r   c           
          / nS H\  nU R                  U5       HD  nUR                  UUR                  5       R                  5       UR	                  SS5      S.5        MF     M^     U$ )z.Extract all headings with their text and level)h1h2h3h4h5h6idr   r   textr   )find_allrh   r   rg   r<   )r   r   tagheadings       r(   r   r     sb    H3}}S)GOO((*002kk$+  * 4 Or   r7   c           	         / nU R                  SSS9 Hr  nUR                  S5      nUR                  5       R                  5       nU(       d  M;  U(       d  MD  UR	                  U[        X5      UR                  SS5      S.5        Mt     U$ )z*Extract all links with their text and hrefaThrefr   r   r   r   r   r   )r   r<   r   rg   rh   r
   )r   r7   r   linkr   r   s         r(   r   r     sz    Ec-xx}}$$&4DDLL/'2. 	 . Lr   c           	         / nU R                  S5       H  n/ nUR                  / SQ5       H  nUR                  UR                  SS5      UR                  SS5      UR                  SS5      UR                  S5      SLS	.nUR                  S
:X  a  UR                  SS5      US'   UR                  U5        M     UR                  UR                  SS5      UR                  SS5      US.5        M     U$ )z1Extract all forms with their inputs and structureform)inputtextareaselectr   r   r   placeholderrequiredN)typer   r   r   r   r   r   r   
input_typeactionr   r<   )r   r   inputs)r   r   r<   rh   )r   r   r   r   	input_tag
input_datas         r(   r   r     s    Ef%'FGI!!fb1mmD"-(}}]B?%MM*5TAJ ~~(+4==+H
<(MM*% H 	hhx,hhx/
 	 && Lr   c                    / nU R                  SS/5       H  nUR                  S:X  a  UR                  S5      S;  a  M*  UR                  UR	                  5       R                  5       =(       d    UR                  SS5      UR                  SS5      UR                  SS5      SR                  UR                  S	/ 5      5      S
.5        M     U$ )zExtract all buttonsbuttonr   r   )r  submitresetvaluer   r    classr   r   r   r  )r   r   r<   rh   r   rg   join)r   r   r  s      r(   r   r     s    G--7 34;;'!fjj&8@]&]OO%++-HGR1HJJvx0**T2&XXfjj"56	
 		 5 Nr   c           
          / nU R                  S5       HQ  nUR                  [        XR                  SS5      5      UR                  SS5      UR                  SS5      S.5        MS     U$ )zExtract all imagesimgsrcr   altr   )r  r  r   )r   rh   r
   r<   )r   r7   r   r
  s       r(   r   r     sa    F}}U#8WWUB%78775"%WWWb)
 	 $ Mr   c                     U " SS/5       H  nUR                  5         M     U R                  5       nS UR                  5        5       nS U 5       nSR                  S U 5       5      nUSS $ )	zExtract main text contentscriptstylec              3   @   #    U  H  oR                  5       v   M     g 7fN)rg   )r_   lines     r(   ra   (_extract_text_content.<locals>.<genexpr>  s     8&7dZZ\\&7s   c              3   p   #    U  H,  oR                  S 5        H  o"R                  5       v   M     M.     g7f)z  N)splitrg   )r_   r  r`   s      r(   ra   r    s&     NZZ=M6llnn=Mns   46r  c              3   6   #    U  H  o(       d  M  Uv   M     g 7fr   )r_   chunks     r(   ra   r    s     7veEEvs   
	Ni  )	decomposer   
splitlinesr  )r   r  r   lineschunkss        r(   r   r     sl     '*+ , ==?D8doo&78ENNF887v77D;r   c                 f   / nU R                  / SQ[        R                  " S[        R                  5      S9nU Hs  nUR                  SSS9 H\  nUR	                  UR                  5       R                  5       [        XR                  S5      5      UR                  SS	5      S
.5        M^     Mu     U$ )zExtract navigation elements)navulolznav|menu|navigationclass_r   Tr   r   r   r   r   )	r   recompileIrh   r   rg   r
   r<   )r   r7   	nav_itemsnav_elementsr  r   s         r(   r   r     s    I==!4RZZH^`b`d`d=e=fLLL4L0D--/((6*:;'2.  1  r   c                     U R                  SS/[        R                  " S[        R                  5      S9nU(       a  UR	                  5       R                  5       $ S$ )zExtract footer contentr   divr!  r   )r   r#  r$  r%  r   rg   )r   r   s     r(   r   r     sE    YY%(Irtt1LYMF(.6??""$6B6r   c                    [        U R                  SS/5      5      [        U R                  S/5      5      [        U R                  [        R                  " S[        R                  5      S95      [        U R                  / SQ5      5      [        U R                  S5      5      [        U R                  S5      5      [        U R                  S	5      5      [        U R                  / S
Q5      5      S.$ )zAnalyze overall page structureheaderr  r   zsidebar|asider!  )mainarticlesectionr   r
  r   )r  zinput[type="button"]zinput[type="submit"]
has_header
has_footerhas_sidebarhas_main_contenttotal_linkstotal_imagestotal_formstotal_buttons)boolr   r#  r$  r%  rf   r   )r   s    r(   r   r   
  s     499h%678499hZ01DIIRZZ8H"$$-OIPQ +I!JK4==-.DMM%014==01T]]+efg	 	r   selected_typesc                   ^^^^ [         R                  S5        [         R                  SU  35        [         R                  SU 35        U (       d  [         R                  S5        gU(       a  [        U5      S:X  a  [         R                  S5        g[         R                  SU  35        [         R                  S	U 35         [         R                  S
5        Sn [	        XX45      n[         R                  S[        UR                  5       5       35        / nU GH  m[         R                  S"T 35        [        T5      mT(       d  [         R                  S#T 35        MH  SR                  / S$PUS%    PS&PUS'    PS(PUS)    PS*P[        US+   5       PS,P[        US-   5       PS.P[        US/   5       PS0P[        US1   5       PS2P[        US3   5       PS4P[        US5   5       PS6P[        S7 US/    5       5       PS8PUS9    PS:PUS;   SS<  PS=PUS5   SS>  Vs/ s H  oS?   PM	     sn PS@PUS/   SSA  V	V
s/ s HY  oR                  SBSC5       SDU	R                  SE/ 5       V
s/ s H$  oR                  SFU
R                  SGSH5      5      PM&     sn
 3PM[     sn
n	 PSIPUS1   SS>  Vs/ s H  oS?   (       d  M  US?   PM     sn PSJPUS+   SSA  Vs/ s H  oS?   PM	     sn PSKPUS-   SS>  Vs/ s H'  oS?   (       d  M  [        US?   5      SL:  d  M"  US?   PM)     sn PSMPTSN    PSOPTSP    PSQPTSR    PSSP5      m [!        5       nU(       a  UST:X  d  USU:X  a"  SVn[         R                  U5        [#        U5      e[%        SWSXU[&        /SY9m[         R                  SZT S[35        [)        SS\9UUUU4S] j5       nU" 5       nUR*                  R-                  5       nU(       a|  [/        UTTSR   5      nU(       a3  [         R                  S^T S_35        S`T SaU 3nUR1                  U5        OL[         R                  SbT 35        S`T SaU 3nUR1                  U5        O[         R                  ScT S[35         [         R                  SwT 35        GM     U(       d  [         R                  Sx5        g[         R                  Sy[        U5       Sz35        SaR                  U5      n[        U5      n[         R                  S{U 35        SaU-   $ ! [         a  n[         R                  S[        U5       35        [         R                  S5        U S[        U 5      R                   3SSSSS./SU SS.// SSSSS.// SU  S3SU SS./SSSSSSSSSS.S .n[         R                  S!5         SnAGNSnAff = fs  snf s  sn
f s  sn
n	f s  snf s  snf s  snf ! [         Ga  n[         R                  SdT Se[        U5       35        [         R                  SfT S[35         [3        5       nU(       a  UR                  Sg5      (       d   [         R                  Sh5        [#        Si5      eSjSkT SlTSP    SmTSR    Sn3So.SpTSo./n[5        UU5      nU(       a8  [         R                  S^T Sq35        S`T SrU 3nUR1                  U5         SnAGNS[         R                  SsT S[35        [#        St5      e! [         af  n[         R                  SuT Se[        U5       35        [7        UTTU [        UR                  5       5      [        U5      Sv.5         SnA SnAGMQ  SnAff = fSnAff = f! [         aT  n[         R                  S|[        U5       35        [7        UXS}.5        [         R                  S~5        SU  S3s SnA$ SnAff = f)z=Generate test cases for a website URL based on selected typesz&=== generate_url_test_cases called ===zURL: zSelected types: z(No URL provided for test case generationNr   z3No test types selected for URL test case generationzGenerating test cases for URL: zSelected test types: z#Starting website data extraction...z+Website data extracted successfully. Keys: z#Website content extraction failed: z+Proceeding with fallback data extraction...z	Website: zAWebsite content could not be extracted due to access restrictionsr   zMain Contentr   r   Homer   Submitr  r  zContent from z - automated extraction blockedzFooter contentTFr]   r/  r   z*Fallback website data created successfullyz#Starting generation for test type: zSkipping unknown test type: u:   
            🎯 WEBSITE ANALYSIS DATA:
            URL: r   z
            Title: r   z
            Meta Description: r   uP   
            
            📊 PAGE STRUCTURE ANALYSIS:
            - Headings: r   z% headings found
            - Links: r   z" links found
            - Forms: r   z$ forms found
            - Buttons: r   z% buttons found
            - Images: r   uY    images found
            
            🔍 KEY ELEMENTS:
            - Main navigation: r   z" items
            - Form inputs: c              3   >   #    U  H  n[        US    5      v   M     g7f)r   N)rf   )r_   r   s     r(   ra   *generate_url_test_cases.<locals>.<genexpr>e  s     V@UDN 3 3@Us   z, total inputs
            - Page structure: r   u0   
            
            📝 CONTENT SUMMARY: r   i  u[   ...
            
            🔗 SPECIFIC ELEMENTS FOUND:
            - Navigation items: r   r   z
            - Form fields: r   r   zN/Az - r   r   r   unnamedz
            - Button texts: z
            - Key headings: z 
            - Important links: re   u>   

            🎯 TASK: Generate HIGH-QUALITY test cases for rv   z (up to rw   u|   maximum).
            
            ⚡ QUALITY REQUIREMENTS:
            - Generate ONLY relevant, actionable test cases based on actual website elements
            - Each test case must be specific to the website's actual functionality
            - Avoid generic or template-based test cases
            - Focus on real user scenarios and business value
            - Consider the website's purpose and target audience
            
            🔬 DETAILED ANALYSIS REQUIREMENTS:
            - Analyze ALL website elements: forms, buttons, links, navigation, content
            - Consider ALL possible user interactions and workflows
            - Identify edge cases and boundary conditions specific to this website
            - Consider different user roles and access levels
            - Think about potential failure scenarios and error conditions
            - Analyze responsive design and cross-platform compatibility
            - Consider accessibility requirements (WCAG guidelines)
            - Think about security aspects and data validation
            
            📋 STRICT FORMAT for each test case:

            Title: rW   u  _[SequentialNumber]_[Specific_Action_Being_Tested]
            Scenario: [Clear, specific scenario describing what is being tested and why it matters]
            Preconditions: [Required setup, user state, or data needed before test execution]
            Steps to Reproduce:
            1. [Specific, actionable step with exact elements to interact with]
            2. [Next specific step with expected behavior]
            3. [Continue with detailed, measurable steps]
            Expected Result: [Specific, testable outcome with measurable criteria]
            Actual Result: [Leave as 'To be filled during execution']
            Priority: [High/Medium/Low - based on business impact and user frequency]
            Test Data: [Specific input values, test accounts, or environment details if needed]
            
            ✅ QUALITY CHECKLIST:
            - Each test case covers a UNIQUE and VALUABLE scenario
            - Steps are CLEAR, ACTIONABLE, and written for a QA engineer to follow
            - Expected Results are SPECIFIC and MEASURABLE (not vague)
            - Test cases are RELEVANT to the actual website functionality
            - No duplicate or overlapping scenarios
            - Professional QA terminology used throughout
            - Consider real-world user behavior and business impact
            
            🚫 AVOID:
            - Generic test cases that could apply to any website
            - Vague expected results like "it should work" or "page should load"
            - Duplicate scenarios with minor variations
            - Test cases not relevant to the actual website content
            - Mixing different test types in one test case
            your_openai_api_key_heremissing_api_keyuA   ⚠️ Invalid or missing OPENAI_API_KEY in environment variableszgpt-4o-minig333333?)r:   temperatureopenai_api_key	callbackszSending request to OpenAI for z test casesr1   c            
      V   > TR                  SST ST S    ST S    S3S.S	TS./5      $ )
Nsystem   You are a SENIOR QA ENGINEER with 10+ years of experience in web testing. Your expertise includes:

🎯 CORE RESPONSIBILITIES:
- Generate HIGH-QUALITY, ACTIONABLE test cases for     scenarios
- Focus on REAL-WORLD user scenarios and business value
- Create test cases that are SPECIFIC to the actual website functionality
- Ensure each test case is UNIQUE, VALUABLE, and EXECUTABLE

📊 QUALITY STANDARDS:
- Maximum rw   * test cases (quality over quantity)
- Use rW      as the prefix for all test case titles
- Base test cases on ACTUAL website elements and functionality
- Avoid generic or template-based test cases
- Focus on measurable, testable outcomes

🔍 ANALYSIS APPROACH:
- Thoroughly analyze the provided website data
- Identify specific user workflows and interactions
- Consider edge cases and error conditions
- Think about different user roles and scenarios
- Focus on business-critical functionality

✅ OUTPUT REQUIREMENTS:
- Each test case must be specific to the website being tested
- Steps must be clear and actionable for QA engineers
- Expected results must be measurable and specific
- Avoid vague statements like "it should work"
- Include relevant preconditions and test data when needed

Your goal is to create test cases that a QA team can immediately execute and that provide real value in ensuring the website works correctly for its intended users.rolerB   user)invoke)r4   current_llmpromptrV   s   r(   make_openai_call1generate_url_test_cases.<locals>.make_openai_call  si    &--$,,4 5>; ? +
  h e(h B "(F;E#/ # #r   z
Generated z% test cases successfully using OpenAIzTEST TYPE: z

z3Generated test cases failed quality validation for zReceived empty response for zOpenAI API failed for z test cases: z&Attempting fallback to OpenRouter for r-   z3OpenRouter configuration not available for fallbackzNo fallback API availablerF  rG  rH  rI  rJ  rK  rM  z2 test cases successfully using OpenRouter fallbackz (Generated via OpenRouter)

z$OpenRouter fallback also failed for z!Both OpenAI and OpenRouter failedz'Fallback to OpenRouter also failed for )rV   r4   r   website_data_keysfallback_errorz$Completed generation for test type: z!Failed to generate any test casesz&Successfully generated test cases for z test typeszTotal test cases length: z#Error in URL test case generation: )r   r9  z&Returning debug test case due to errorz
TEST TYPE: dashboard_functional

Title: TC_FUNC_001_Debug_Test
Scenario: Debug test case for URL generation
Steps to reproduce:
1. Navigate to z
2. Verify the page loads
3. Check basic functionality
Expected Result: Page should load successfully
Actual Result: To be filled during execution
Priority: Medium
)r%   rk   r&   rf   r   listkeysr$   rP   rQ   r   netlocr   r  ri   r<   r"   
ValueErrorr   tracerr   rB   rg   rr   rh   r0   r;   r   )r   r9  r   r   r   website_dataextraction_errorall_test_casesitemr   inpbtnhr   r-   	error_msgrQ  r   rU   validated_test_casestest_cases_with_headerr'   openrouter_configr3   rT  joined_test_casestotal_lengthr4   rO  rP  rV   s                              @@@@r(   generate_url_test_casesrg    s
   
KK89
KK%u
KK">"234?@S0A5JK
KK1#78
KK''789l9:	F/9[LKKEd<K\K\K^F_E`ab< 'IKK=i[IJ-i8F!=i[IJK K  Ku%&K'K !)*K+K  ,,>?@	KA	K \*567K8K ,w/01K2K ,w/01K2K L345K6K <123K4 K !$L$> ?@KAK  VW@UVVWKXK   ,,<=>!K ?#!K$ $0#?#E"F%K$G!%K* <H;UVYWY;Z![;Z4v,;Z![ \+K*]+K, [g  ho  [p  qs  rs  [t  u  [t  SW5 9:#txt|t|  ~F  HJ  uK  ?L  uKmpwwvswwW[]fOg?h  uK  ?L  >M  N  [t  u  v-K,v-K. 6B)5LSb5Qa5QcY_U`kc&k5Qab/K.c/K0 2>j1I"11MN1MAi1MNO1K0P 1K2 ;Gw:OPSQS:T :T$]cXdilmqrxmyiz}~i~f:T    A3K2A=3K6 >DM=R<S7K6 T\7K6 ]ccn\o[p7K6q7K` 8$%aK`&aKFZQ,.'-G"G7VgKg cILL+$Y// )' ##*%h	 <YK{ST $T2$ 3$L ,-%--335
+FzS\^dem^n+o(+j;`$ab3>ykNbMc1d.&--.DE)\]f\g'hi3>ykj\1Z.&--.DENN%A)K#XYR KK>ykJKQ (T LL<=<S=P<QQ\]^"KK7,-/~>?)))c  	FNN@EUAV@WXYKKEF $Xc]%9%9$:;$g'+^2NO#)3HI%-xrTVWX"/u4S T(.fMN*"&"&#((,#$$%#$%&	#L. KKDEE7	Fx "\ ?L  uaN @  E5i[cRSfXVWDYK{[\@(=(?%,4E4I4I)4T4T%Z[()DEE
 %-,4 5>; ? +
  h e(h B "(F;E# HJ "6h@Q!RJ!j;m$no3>ykIhisht1u.&--.DEE'KI;Va%bc()LMM  
LL#J9+Ubcfgucvbw!xy%a%."("-1,2C2C2E-F*-n*=*  H
wEf  :3q6(CD!SKL 	<= u  	s-  ]< ;T D]< $W	2]< ,W/+W	W#]< 4W	W]< W,]< <W#W#!	W#*#]< C/W(=]< >1W(/]< 0W(	:]< A]< 
W)BW;]< W]< W]< (]93=]41B&\]< $\
]1A],!]4%]< ,]11]44]99]< <
_A	___)r         ?)Tr   rh  )Iutils.error_loggerr   r   r   r   utils.error_monitorr   r   r   bs4r	   r#  urllib.parser
   r   loggingtypingr   r   r   r   langchain_openair   %langchain.callbacks.tracers.langchainr   openair   r   rK   r   rL   r   selenium.webdriver.common.byr   selenium.webdriver.support.uir   selenium.webdriver.supportr   r   selenium.common.exceptionsr   r   basicConfigINFO	getLogger__name__r%   rY  r"   r0   rQ   r;   r8  rT   rr   dictr   intfloatr   r   r   r   r   r   r   r   r   r   r   r   r   rg  r  r   r(   <module>r}     s4   W W K   	 *  , , ' A    5 + 7 @ K   ',,/e f			8	$ 
&<	=    T"4S#X#7 c3h T\]`Ta  #:T &8C 8C 8 8QYZ]Q^ 8t"+ "+ "+Hg@C g@C g@SX g@cghkmphpcq g@Rbc b b b`e bptuxz}u}p~ bH= =3 =
=M =c =

M 
d4S>.B 
 # $tCH~:N  4S#X+? 0= T$sCx.-A 	- 	3 	4S#X;O 	 # m s tDcN?S 7- 7C 7
- DcN } }d3i }t }gj }  D }  OW  X[  O\ }r   