U
    h                     @   sP  d dl mZmZmZmZ d dlmZmZ d dlZd dl	m
Z
 d dlZd dlmZmZ d dlZd dlmZmZmZmZ d dlmZ d dlmZ d d	lm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 dl)m*Z*m+Z+ d dl,m-Z- ej.ej/dd e0e1Z2eddZ3edd Z4edd Z5eddeee6e6f  ee6e6f ee6 dddZ7e8dd d!Z9e6e6e6ee6 d"d#d$Z:e6e;d%d&d'Z<dQe6e=e>ee6ef d*d+d,Z?dRe6e8e=e>ee6ef d-d.d/Z@e
e6d0d1d2ZAe
e6d0d3d4ZBe
eee6e6f  d0d5d6ZCe
e6eee6e6f  d7d8d9ZDe
eee6ef  d0d:d;ZEe
eee6e6f  d0d<d=ZFe
e6eee6e6f  d7d>d?ZGe
e6d0d@dAZHe
e6eee6e6f  d7dBdCZIe
e6d0dDdEZJe
ee6ef d0dFdGZKe
e6ee6ef dHdIdJZLee6ef e6ee6ef dKdLdMZMdSe6ee6 e8e=e>ee6 dNdOdPZNdS )T    )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)Service)By)WebDriverWait)expected_conditions)TimeoutExceptionWebDriverExceptionChromeDriverManagerz4%(asctime)s - %(name)s - %(levelname)s - %(message)s)levelformatzopenai-cost-tracking)project_namec               
   C   s^   zddl m}  | W S  tk
rX } z(td|  t|ddi W Y dS d}~X Y nX dS )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!   e r)   =/var/www/html/testcasegenerator.evdpl.com/ai/url_generator.pyr#      s    r#   c               
   C   sn   z"ddl m} m}m} | ||dW S  tk
rh } z(td|  t|ddi W Y dS d}~X Y nX dS )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(   r)   r)   r*   r1   *   s    r1   Tcritical)messagesconfigreturnc              
   C   s   zb|r| ds td W dS td|d d}|jjj|d |d di d	| d
}|jd jj	W S  t
k
r } z(td|  t|ddi W Y dS d}~X Y nX dS )z'Make API call to OpenRouter as fallbackr.   z OpenRouter API key not availableNzhttps://openrouter.ai/api/v1)base_urlr.   r/   r0   )zHTTP-RefererzX-Titlez deepseek/deepseek-chat-v3.1:free)extra_headers
extra_bodymodelr4   r   z"Error making OpenRouter API call: r"   make_openrouter_call)getr&   r'   r   chatcompletionscreatechoicesmessagecontentr%   r   )r4   r5   client
completionr(   r)   r)   r*   r;   9   s*    

r;   )r6   c               
   C   s  zddl m}  ddlm} ddlm} z"|  }td|  W W dS  t	k
r } z t
dt|  W Y W dS d	}~X Y nX W nx tk
r } zt
d
t|  W Y dS d	}~X Y n> t	k
r } zt
dt|  W Y dS d	}~X Y nX d	S )zSCheck if Selenium and ChromeDriver are available without creating a driver instancer   r   r   r   zChromeDriver found at: Tz(ChromeDriver installation check failed: FNz)Required Selenium modules not available: z%Selenium/ChromeDriver not available: )seleniumr   !selenium.webdriver.chrome.optionsr   webdriver_manager.chromer   installr&   infor%   warningstrImportError)r   r   r   Zdriver_pathZdriver_errorr(   r)   r)   r*   check_selenium_availabilityW   s"    
rM   )
test_cases	test_typeprefixr6   c           
   
      sH  z  rt   dk r(td W dS dddddg}g }|D ]}| kr>|| q>|rjtd	|  |r| d
 krtd|  dddddg}t fdd|D }|dkrtd| d  d}|dk rtd| d td|   W S  tk
rB }	 z t	dt
|	    W Y S d}	~	X Y nX dS )z,Validate the quality of generated test casesd   zTest cases too short or emptyNz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   s"   | ]}|     krd V  qdS )   N)lower).0phraserN   r)   r*   	<genexpr>   s      z._validate_test_case_quality.<locals>.<genexpr>   Found z vague phrases in test cases   zOnly z* test cases generated, expected at least 3z(Test case quality validation passed for z$Error validating test case quality: )lenstripr&   rJ   appendsumcountrI   r%   r'   rK   )
rN   rO   rP   Zrequired_elementsZmissing_elementselementZvague_phrasesZvague_countZtitle_countr(   r)   rW   r*   _validate_test_case_qualityo   sF    

rb   )rO   r6   c              	   C   sN   ddddddddddddd	d
ddddddddddd}| | i S )z2Get the configuration for a specific URL test typeTC_FUNCzXfunctional test cases focusing on valid inputs, form submissions, and expected behaviors2   )rP   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<   )rO   base_configsr)   r)   r*   get_url_test_type_config   s4     rt            ?)url	wait_timescroll_pauser6   c                 C   s`  d}z
zdtd|   t }|d |d |d |d |d |d	 |d
 |ddg |dd tt	 
 }tj||d}|d ||  td| d t| td |d}d}d}	||	k rT|d t| |d}
|
|kr*td qT|
}|d7 }td| d|	 d|
  q|d td z t|dttjdf W n  tk
r   td  Y nX |j}t|d!d"d#}| t|t|t|t|| t|t|t || t!|t"|| t#|t$|t%|| d$}t&|| }td%|   td&t'|d'  d(t'|d)  d*t'|d+  d, |W W S  t(k
r } z0t)d-|  d.t*|  t+|| d/d0  W 5 d}~X Y nP tk
r } z0t)d1|  d.t*|  t+|| d/d0  W 5 d}~X Y nX W 5 |rZz|   W n4 tk
rX } ztd|  W 5 d}~X Y nX X dS )2zPExtract comprehensive data from a website URL using Selenium for dynamic contentNzError closing WebDriver: z#Fetching dynamic content from URL: z
--headlessz--no-sandboxz--disable-dev-shm-usagez--disable-gpuz--window-size=1920,1080z|--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36z---disable-blink-features=AutomationControlledZexcludeSwitcheszenable-automationZuseAutomationExtensionF)serviceoptionszEObject.defineProperty(navigator, 'webdriver', {get: () => undefined})zWaiting z! seconds for initial page load...z$Scrolling to load dynamic content...z!return document.body.scrollHeightr   ru   z/window.scrollTo(0, document.body.scrollHeight);z(No more content to load, stopping scrollrS   zScroll attempt /z, new height: zwindow.scrollTo(0, 0);
   bodyz3Timeout waiting for body element, proceeding anywayhtml.parserutf-8)from_encodingrw   titlemeta_descriptionheadingslinksformsbuttonsimagestext_content
navigationfooterpage_structurefunctionalityz)Successfully extracted dynamic data from rZ   r   z links, r   z forms, r   z buttonszSelenium WebDriver error for : rE   )rw   methodz!Error in Selenium extraction for ),quitr%   r&   rJ   rI   r   add_argumentZadd_experimental_optionr   r   rH   r   ZChromeZexecute_scriptr<   timesleepr   ZuntilECZpresence_of_element_locatedr   ZTAG_NAMEr   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_structure_extract_website_functionality_validate_extracted_datar\   r   r'   rK   r   )rw   rx   ry   driverr(   Zchrome_optionsrz   Zlast_heightZscroll_attemptsZmax_scroll_attemptsZ
new_heightr   soupdatar)   r)   r*   "extract_website_data_with_selenium   s    





















6
r   )rw   use_seleniumrx   ry   r6   c                 C   s  |rlt  rlztd|   t| ||W S  tk
rh } z"tdt|  td W 5 d}~X Y qzX n|rztd ztd|  d t }|j	
dd	d
dddddddddd d}tdD ],}zv|dkr|j| dd}nJ|dkr|j	
ddi |j| dd}n |j	
ddd |j| dd}|  W  qW q tjjk
r } z>|jjdkr|dk rtd|d  d  W Y 
qn W 5 d}~X Y q tk
r } z0|dk rtd!|d  d" W Y 
qn W 5 d}~X Y qX q|dkrtjd#|jpd}	|	r0|	 d$kr4d}	z|j	d%d& }
td'|
  d(|j	d)d& krddl}||jj|	d*d+}nHd,|j	d)d& krddl}||jj|	d*d+}n|jj|	d*d+}| d-s$td. |d/s$d0| krntd1 d2|  d3}t|d4}W n ttfk
r } ztd5t| d6 z|jjdd*d+}t|d4}W nN tk
r } z.td7t|  d2|  d8}t|d4}W 5 d}~X Y nX W 5 d}~X Y nX | t |t!|t"|t#|| t$|t%|t&|| t'|t(|| t)|t*|t+|| d9}t,|| }td:|   |W S  tk
r } z.td;|  d<t|  t-|d=| i  W 5 d}~X Y nX dS )>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, brr   1z
keep-alivedocumentZnavigatenonez	max-age=0)
User-AgentAcceptzAccept-LanguagezAccept-EncodingzAccept-CharsetZDNT
ConnectionzUpgrade-Insecure-RequestszSec-Fetch-DestzSec-Fetch-ModezSec-Fetch-SitezCache-Controlr[   r      )timeoutrS   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  rY   z403 Forbidden on attempt z, trying different approach...zRequest failed on attempt z, retrying...z$All attempts to fetch the URL failedz
iso-8859-1zcontent-type zContent-Type: gzipzcontent-encodingignoreerrorsdeflate<zAContent doesn't appear to be HTML, might be compressed or encodedz	<!DOCTYPEz<htmlz.Content appears to be non-HTML, using fallbackz<html><body><p>Content from zH - automated extraction blocked or content is not HTML</p></body></html>r   zUnicode decode error: z, trying fallbackzFallback decode also failed: z9 - encoding issues prevented extraction</p></body></html>r   z!Successfully extracted data from zError fetching content from r   rw   ).rM   r&   rI   r   r%   rJ   rK   requestsSessionheadersupdateranger<   raise_for_status
exceptions	HTTPErrorresponsestatus_codeRequestExceptionencodingrT   r   
decompressrB   decodezlibr]   
startswithr   UnicodeDecodeErrorUnicodeErrorr'   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )rw   r   rx   ry   Zselenium_errorsessionr   attemptr(   r   content_typer   rB   r   r   fallback_errorr   r)   r)   r*   extract_website_data<  s    


 





.
r   )r   r6   c              
      s   z|  d}|r|  }t|tr4|jddd}ddl}t|j d	 fdd	|D }| }t
|dkrt
|d
k r|W S tdt
|  W dS W dS  tk
r } ztdt|  W Y dS d}~X Y nX dS )z0Extract page title with proper encoding handlingr   r   r   r   r   Nr   c                 3   s"   | ]}| ks|  r|V  qd S NisspacerU   charZprintable_charsr)   r*   rX     s       z!_extract_title.<locals>.<genexpr>   z-Title extraction resulted in invalid length: zError extracting title: )findget_textr]   
isinstancebytesr   stringset	printablejoinr\   r&   rJ   r%   rK   )r   Z	title_tagr   r   r(   r)   r   r*   r     s$    


r   c              
      s   zt| j dddid}|rp|dd}t|tr<|jddd	}d
dl}t|j d fdd|D }|	 W S W dS  t
k
r } ztdt|  W Y dS d}~X Y nX dS )z6Extract meta description with proper encoding handlingmetanamere   )attrsrB   r   r   r   r   r   Nc                 3   s"   | ]}| ks|  r|V  qd S r   r   r   r   r)   r*   rX     s       z,_extract_meta_description.<locals>.<genexpr>z#Error extracting meta description: )r   r<   r   r   r   r   r   r   r   r]   r%   r&   rJ   rK   )r   Z	meta_descrB   r   r(   r)   r   r*   r     s    


r   c              
   C   sD   g }dD ]6}|  |D ]&}|||  |ddd qq|S )z.Extract all headings with their text and level)h1h2h3h4h5h6idr   r   textr   )find_allr^   r   r]   r<   )r   r   tagheadingr)   r)   r*   r     s    

r   )r   r7   r6   c              	   C   sZ   g }| j dddD ]B}|d}|  }|r|r||t|||ddd q|S )z*Extract all links with their text and hrefaThrefr   r   r   r   r   r   )r   r<   r   r]   r^   r	   )r   r7   r   linkr   r   r)   r)   r*   r   	  s    


r   c              	   C   s   g }|  dD ]}g }| dddgD ]\}|j|dd|dd|dd|d	d
k	d}|jdkrx|dd|d< || q&||dd|dd|d q|S )z1Extract all forms with their inputs and structureforminputtextareaselectr   r   r   placeholderrequiredNtyper   r   r   r   r   r   
input_typeactionr   r<   r   r   inputs)r   r   r<   r^   )r   r   r   r   Z	input_tag
input_datar)   r)   r*   r     s&    






r   c                 C   s|   g }|  ddgD ]d}|jdkr0|ddkr0q||  pJ|dd|dd|ddd|d	g d
 q|S )zExtract all buttonsbuttonr   r   )r   submitresetvaluer   r    classr   r   r   r  )r   r   r<   r^   r   r]   r   )r   r   r   r)   r)   r*   r   /  s    


r   c              	   C   sH   g }|  dD ]4}|t||dd|dd|ddd q|S )zExtract all imagesimgsrcr   altr   r  r	  r   )r   r^   r	   r<   )r   r7   r   r  r)   r)   r*   r   >  s    


r   c              
      s  zT| ddgD ]}|   qd}| jddddgtdtjd	}|rx|D ],}| }|rJt| d
krJ||d 7 }qJ| s|  }t|t	r|j
ddd}dd | D }dd |D }ddd |D }ddl}	t|	j d fdd|D }d| }t| dk rFtdt| d dt| dW S d}
|d|
 W S  tk
r } ztdt|  W Y dS d}~X Y nX dS )z7Extract main text content with proper encoding handlingscriptstyler   mainarticlesectiondivzmain|content|body|containerclass_   r  r   r   r   c                 s   s   | ]}|  V  qd S r   )r]   )rU   liner)   r)   r*   rX   c  s     z(_extract_text_content.<locals>.<genexpr>c                 s   s&   | ]}| d D ]}| V  qqdS )z  N)splitr]   )rU   r  rV   r)   r)   r*   rX   d  s       c                 s   s   | ]}|r|V  qd S r   r)   )rU   chunkr)   r)   r*   rX   e  s      r   Nc                 3   s"   | ]}| ks|  r|V  qd S r   r   r   r   r)   r*   rX   j  s       rd   zText content too short: z charactersz&Limited content extracted from page - z characters availablei N  zError extracting text content: z0Content extraction failed due to encoding issues)	decomposer   recompileIr   r\   r]   r   r   r   
splitlinesr   r   r   r   r  r&   rJ   r%   rK   )r   r  Zmain_contentZ
main_areasareaZ	area_textlineschunksr   r   ZMAX_TEXT_LENGTHr(   r)   r   r*   r   I  s:    
 

r   c              
   C   sr   g }| j dddgtdtjd}|D ]F}|j dddD ]2}||  t||d	|d
dd q8q&|S )zExtract navigation elementsnavulolznav|menu|navigationr  r   Tr   r   r   r   r   )	r   r  r  r  r^   r   r]   r	   r<   )r   r7   Z	nav_itemsZnav_elementsr  r   r)   r)   r*   r   }  s    

r   c                 C   s0   | j ddgtdtjd}|r,|  S dS )zExtract footer contentr   r  r  r   )r   r  r  r  r   r]   )r   r   r)   r)   r*   r     s    r   c                 C   s   t | ddgt | dgt | jtdtjdt | dddgt| d	t| d
t| dt| dddgdS )zAnalyze overall page structureheaderr  r   zsidebar|asider  r  r  r  r   r  r   r   zinput[type="button"]zinput[type="submit"]
has_headerZ
has_footerZhas_sidebarZhas_main_contentZtotal_linksZtotal_imagesZtotal_formsZtotal_buttons)boolr   r  r  r  r\   r   )r   r)   r)   r*   r     s    r   )r   rw   r6   c                 C   s  zng g g g g g d}| j dddgtdtjd}|D ]R}|ddksT|jdkr8|d	 |dd
|  |d|ddd q8|  ddddg}|D ]\}|ddkr|d |j|dd|  p|dd|dd|ddk	d q|  d}|D ]X}| dddg}dd |D }	|d |dd|ddt	t
|	t|d q| j ddd }
|
dd! D ]L}|  }|rt|d"kr|d# ||dd|d$dd% qd&d'd(d)d*d+d,d-d.d/g
}|D ]0}| j t|tjd}|r|d0 | qd1d2d3d4d5d6d7d8d9d:g
}|D ]0}| j t|tjd}|r:|d; | q:|W S  tk
r } z.td<t|  g g g g g g d W Y S d}~X Y nX dS )=z3Extract detailed website functionality and featuresauthentication_featuresinteractive_elementsdata_input_methodsnavigation_patternsuser_workflowsbusiness_functionsr   r   r   z+login|signin|signup|register|logout|signoutr   r   )r  r   r'  r   r   r   r   r   r   r   r   r   )hiddenr   r(  r  r   r   Nr   r   r   r   r   r   c                 S   s   g | ]}| d |jqS )r   )r<   r   rU   inpr)   r)   r*   
<listcomp>  s     z2_extract_website_functionality.<locals>.<listcomp>r)  r   r<   r   r   input_typesinput_countTr   r  rY   r*  r   r   searchfiltersortaddremoveeditdeleteviewZdownloaduploadr+  productrz   contactaboutZpricingsupporthelpZfaqnewsZblogr,  z(Error extracting website functionality: )r   r  r  r  r<   r   r^   r   r]   listr   r\   r%   r&   rJ   rK   )r   rw   r   Zauth_elementselemr(  r   r   Zform_inputsr5  Z	nav_linksr   Z	link_textZworkflow_keywordskeywordelementsZbusiness_keywordsr(   r)   r)   r*   r     s    






	





r   )r   rw   r6   c                 C   sf  zt d|  t| dd dkpft| dg dkpft| dg dkpft| dg dk}|s~t d	|  t|}|j}| | d
d| dd| ddd| ddddddddddgd|ddd| dddd| dddg| dd d!d"d#d$d%d&d'gd(gd)d*d+d,d-d.d*d/d0d-gd|ddd1| d2d1dd3| d4d3dgd5 t d6|  t d7| d8 t d9t| dd  t d:t| dg   t d;t| dg   t d<t| dg   t d=t| d>g   | W S  t	k
r` } z t 
d?t|  |  W Y S d@}~X Y nX d@S )Az+Validate and enhance extracted website datazValidating extracted data for r   r   rQ   r   r   r   r   z3Extracted data appears to have minimal content for  - Website AnalysiszAnalysis of z# website functionality and featuresWebsite analysis for zg. This site appears to be a web application with various features and functionality that can be tested.r   Welcome to r   r   Main Featuresr   
NavigationHome	Home Pager   About/aboutAbout UsContact/contact
Contact Us/searchr<   r   qr7  	Search...Fr   r   r   r   r   r   r   r   Searchr  
search-btnbtn btn-primaryr  Submit
submit-btnbtn btn-successProducts	/productsServices	/services)r   r   r   r   r   r   r   r   z#Enhanced fallback data created for zData quality metrics for :z  - Text content length: z  - Headings count: z  - Links count: z  - Forms count: z  - Buttons count: r   z!Error validating extracted data: N)r&   rI   r\   r<   r]   rJ   r
   netlocr   r%   r'   rK   )r   rw   Zhas_content
parsed_urldomainr(   r)   r)   r*   r     sd    






"r   )rw   selected_typesr   rx   ry   r6   c              6      s	  t d t d|   t d|  | s<t d dS |rLt|dkrZt d dS t d|   t d	|  zt d
 d}z,t| |||}t dt|   W nT tk
r } z2t dt	|  t d t
| }|j}| | dd| ddd| ddddddddddddddddddgd| d d!d"|  d#d$d!d%|  d&d'd!d(|  d)d*d!d+|  d,d-d!d.|  d/d0d!d1|  d2d3d!g|  d4d5d6d7d8d9d:d;d<d6d=d=d>d:d;d<gd?|  d&d@d6dAdAdBdCd;d<d6dDdDdEdCdDd<dFdGdGdHdCdIgd?gdJdKdLdMdNdOdKdPdQdNdRdSdTdUdNd.dKdVdMdNd1dKdWdXdNg|  dY| dZd[d\|  d]d^d_d\gd`| dad| dd!d(|  d)d(d!d+|  d,d+d!d"|  d#d$d!d%|  d&d'd!gdb| dcdCdCdCdCdddededfdgdhd.|  d/didhd1|  d2digd6d;djd9d:dkd6dDdjdEdCdkdSdKdJdjd:dkdSdKdOdjd:dkg|  d4d5d6gdedl|  d&d@d6dFgdmdlgd| dd!d(|  d)d(d!d+|  d,d+d!d"|  d#d$d!d%|  d&d'd!gd8dndodpgdqdrdpdsdtgdudv}t dw W 5 d}~X Y nX g }	|D ]t dx  t  sNt dy  q|dzi }
d{|d|  d}|d~  d|d  dt|d  dt|d  dt|d  dt|d  dt|d  dt|d  dtdd |d D  d|d  d|d dd  ddd |d dd D  ddd |d ddf D  ddd |d dd D  ddd |d ddf D  ddd |d dd D  ddd |
dg ddf D  ddd |
dg dd D  ddd |
dg ddm D  dd|
dg dd  dd|
dg dd  ddd |
dg dd D  d d  d d  d d  d5zt }|r|dks|dkrd}t | t|tdd|dtgdt d d tdCd fddĄ}| }|j }|rjt| d }|r>t dň dƝ dǈ d| }|	| n*t dɈ  dǈ d| }|	| nt dʈ d W nz tk
r } zXt dˈ dt	|  t d͈ d zt }|r|dΡst dϡ tdЃdd҈ dӈ d  dԈ d  d՝d֜d׈d֜g}t||}|r\t dň d؝ dǈ d| }|	| nt dڈ d tdۃW np tk
r } zPt d܈ dt	|  t| | t| t	|dݜ W Y W Y qW 5 d}~X Y nX W 5 d}~X Y nX t dވ  q|		s&t dߡ W dS t dt|	 d dȠ|	}t|}t d|  d| W S  tk
	r } zBt dt	|  t|| |d t d d|  d W Y S d}~X Y nX dS )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: z4Proceeding with enhanced fallback data extraction...rJ  zComprehensive analysis of z< website functionality and features for test case generationr   rL  z
main-titler   r   rM  featuresrN  r   r   zUser Interfacez
ui-sectionzForms and Inputszforms-sectionrO  rP  r   rQ  rR  rS  rT  rU  rV  ra  rb  zOur Productsrc  rd  zOur ServicesZLoginz/loginz
User LoginZRegisterz	/registerzUser RegistrationrW  r<   r   rX  r7  rY  Fr   rZ  categoryCategoryr   postr   z	Your NameTemailz
Your Emailr   rA   zYour Messager   r[  r  r\  r]  r  r^  r_  r`  ZCancelr   z
cancel-btnzbtn btn-secondaryz	login-btnzregister-btnzbtn btn-outline-primaryz	/logo.pngz LogozCompany Logor
  z/hero-image.jpgz
Hero ImagezMain Hero ImagerK  a9  . This site appears to be a comprehensive web application with various features including navigation, forms, user authentication, product listings, and contact functionality. The website likely includes responsive design elements, interactive components, and multiple user workflows that can be thoroughly tested.zFooter content for z! - Copyright and additional links   rY   ru   r#  r   r.  r   r0  r4  r[   r8  r>  rA  r@  rz   rB  rC  r&  r   z3Enhanced fallback website data created successfullyz#Starting generation for test type: zSkipping unknown test type: r   u:   
            🎯 WEBSITE ANALYSIS DATA:
            URL: rw   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: z" items
            - Form inputs: c                 s   s   | ]}t |d  V  qdS )r   Nr\   rU   r   r)   r)   r*   rX     s     z*generate_url_test_cases.<locals>.<genexpr>z, total inputs
            - Page structure: r   u0   
            
            📝 CONTENT SUMMARY: r   i   u[   ...
            
            🔗 SPECIFIC ELEMENTS FOUND:
            - Navigation items: c                 S   s   g | ]}|d  qS r-  r)   )rU   itemr)   r)   r*   r3    s     z+generate_url_test_cases.<locals>.<listcomp>r}   z
            - Form fields: c              	   S   s4   g | ],}| d d ddd | dg D  qS )r   zN/Az - c              	   S   s    g | ]}| d | ddqS )r   r   Zunnamedrr   r1  r)   r)   r*   r3    s     z6generate_url_test_cases.<locals>.<listcomp>.<listcomp>r   rr   rq  r)   r)   r*   r3    s     z
            - Button texts: c                 S   s   g | ]}|d  r|d  qS r-  r)   )rU   Zbtnr)   r)   r*   r3    s      z
            - Key headings: c                 S   s   g | ]}|d  qS r-  r)   )rU   hr)   r)   r*   r3    s     z 
            - Important links: c                 S   s,   g | ]$}|d  rt |d  dkr|d  qS )r   r[   rp  )rU   r   r)   r)   r*   r3    s       uf   
            
            🚀 WEBSITE FUNCTIONALITY ANALYSIS:
            - Authentication features: c                 S   s   g | ]}|d  qS r-  r)   )rU   authr)   r)   r*   r3    s     r'  z%
            - Interactive elements: c                 S   s0   g | ](}| d s| dr|d  p*|d qS )r   r   rr   )rU   rG  r)   r)   r*   r3    s     
 
 r(  z#
            - Data input methods: c                 S   s@   g | ]8}|d     d|d  dd|d dd  dqS )	r   z form with r6  z	 inputs (, r5  Nr[   ))upperr   )rU   r   r)   r)   r*   r3    s     r)  z
            - User workflows: ru  r+     z#
            - Business functions: r,  z$
            - Navigation patterns: c                 S   s   g | ]}|d  qS r-  r)   )rU   r  r)   r)   r*   r3    s     r*  u>   

            🎯 TASK: Generate HIGH-QUALITY test cases for re   z (up to rf   ue   maximum).
            
            ⚡ CRITICAL REQUIREMENTS:
            - Generate ONLY test cases based on the ACTUAL website elements and functionality listed above
            - Each test case must reference SPECIFIC elements found on this website (buttons, forms, links, etc.)
            - Use the exact text, names, and IDs of elements found in the analysis
            - Create scenarios that test the REAL functionality identified in the website analysis
            - Focus on the specific user workflows and business functions discovered
            - Avoid generic test cases that could apply to any website
            
            🔬 MANDATORY ANALYSIS APPROACH:
            - Use the SPECIFIC navigation items, form fields, and buttons listed above
            - Test the EXACT authentication features and interactive elements found
            - Create scenarios for the SPECIFIC user workflows identified (search, filter, etc.)
            - Test the ACTUAL business functions discovered (products, services, contact, etc.)
            - Consider the SPECIFIC data input methods and form structures found
            - Test the EXACT navigation patterns and link structures identified
            - Create edge cases for the SPECIFIC interactive elements and their properties
            
            📋 STRICT FORMAT for each test case:

            Title: rP   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?i.  )r:   temperatureopenai_api_key
max_tokens	callbackszSending request to OpenAI for z test casesr2   c                
      s6    dd d d  d d  ddd	dgS )
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 rf   * test cases (quality over quantity)
- Use rP      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)invoker)   r5   current_llmpromptrO   r)   r*   make_openai_call.  s    	
!z1generate_url_test_cases.<locals>.make_openai_callz
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 availabler  r  r  r  r  r  r  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 )rO   r5   rw   Zwebsite_data_keysr   z$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: )rw   ri  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&   rI   r'   r\   r   rF  keysr%   rJ   rK   r
   rf  rt   r<   r_   r   r#   
ValueErrorr   tracerr   rB   r]   rb   r^   r1   r;   r   )rw   ri  r   rx   ry   Zwebsite_dataZextraction_errorrg  rh  all_test_casesr   r.   	error_msgr  r   rN   Zvalidated_test_casestest_cases_with_headerr(   openrouter_configr4   r   Zjoined_test_casestotal_lengthr)   r  r*   generate_url_test_cases8  s   










	




_


	




 !##8U
&

	
!%

4



r  )ru   rv   )Tru   rv   )Tru   rv   )O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   rE   r   rF   r   Z!selenium.webdriver.chrome.servicer   Zselenium.webdriver.common.byr   Zselenium.webdriver.support.uir   Zselenium.webdriver.supportr   r   Zselenium.common.exceptionsr   r   rG   r   basicConfigINFO	getLogger__name__r&   r  r#   r1   rK   r;   r%  rM   rb   dictrt   intfloatr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r)   r)   r)   r*   <module>   s`   




,:$o  4U"F