@@ -32,8 +32,10 @@ class BIABPage(BasePage):
3232 PROXY_AGENT = "//span[normalize-space()='Proxy Agent']"
3333 APPROVE_TASK_PLAN = "//button[normalize-space()='Approve Task Plan']"
3434 PROCESSING_PLAN = "//span[contains(text(),'Processing your plan and coordinating with AI agen')]"
35- RETAIL_CUSTOMER_RESPONSE_VALIDATION = "//p[contains(text(),'🎉🎉 Emily Thompson ')]"
35+ RETAIL_CUSTOMER_RESPONSE_VALIDATION = "//p[contains(text(),'🎉🎉')]"
3636 PRODUCT_MARKETING_RESPONSE_VALIDATION = "//p[contains(text(),'🎉🎉')]"
37+ RFP_RESPONSE_VALIDATION = "//p[contains(text(),'🎉🎉')]"
38+ CC_RESPONSE_VALIDATION = "//p[contains(text(),'🎉🎉')]"
3739 PM_COMPLETED_TASK = "//div[@title='Write a press release about our current products']"
3840 CREATING_PLAN_LOADING = "//span[normalize-space()='Creating your plan...']"
3941 PRODUCT_AGENT = "//span[normalize-space()='Product Agent']"
@@ -47,6 +49,12 @@ class BIABPage(BasePage):
4749 ORDER_DATA = "//span[normalize-space()='Order Data']"
4850 CUSTOMER_DATA = "//span[normalize-space()='Customer Data']"
4951 ANALYSIS_RECOMMENDATION = "//span[normalize-space()='Analysis Recommendation']"
52+ RFP_SUMMARY = "//span[.='Rfp Summary']"
53+ RFP_RISK = "//span[normalize-space()='Rfp Risk']"
54+ RFP_COMPLIANCE = "//span[normalize-space()='Rfp Compliance']"
55+ CONTRACT_SUMMARY = "//span[.='Contract Summary']"
56+ CONTRACT_RISK = "//span[normalize-space()='Contract Risk']"
57+ CONTRACT_COMPLIANCE = "//span[normalize-space()='Contract Compliance']"
5058 PRODUCT = "//span[normalize-space()='Product']"
5159 MARKETING = "//span[normalize-space()='Marketing']"
5260 TECH_SUPPORT = "//span[normalize-space()='Technical Support']"
@@ -57,7 +65,12 @@ class BIABPage(BasePage):
5765 HOME_INPUT_TITLE_WRAPPER = "//div[@class='home-input-title-wrapper']"
5866 SOURCE_TEXT = "//p[contains(text(),'source')]"
5967 RAI_VALIDATION = "//span[normalize-space()='Failed to submit clarification']"
60-
68+ RFP_SUMMARY_AGENT = "//span[normalize-space()='Rfp Summary Agent']"
69+ RFP_RISK_AGENT = "//span[normalize-space()='Rfp Risk Agent']"
70+ RFP_COMPLIANCE_AGENT = "//span[normalize-space()='Rfp Compliance Agent']"
71+ CC_SUMMARY_AGENT = "//span[normalize-space()='Contract Summary Agent']"
72+ CC_RISK_AGENT = "//span[normalize-space()='Contract Risk Agent']"
73+ CC_AGENT = "//span[normalize-space()='Contract Compliance Agent']"
6174
6275 def __init__ (self , page ):
6376 """Initialize the BIABPage with a Playwright page instance."""
@@ -275,6 +288,42 @@ def validate_hr_agents(self):
275288
276289 logger .info ("All HR agents validation completed successfully!" )
277290
291+ def validate_rfp_agents_visible (self ):
292+ """Validate that all RFP agents are visible."""
293+ logger .info ("Validating all RFP agents are visible..." )
294+
295+ logger .info ("Checking RFP Summary Agent visibility..." )
296+ expect (self .page .locator (self .RFP_SUMMARY_AGENT )).to_be_visible (timeout = 10000 )
297+ logger .info ("✓ RFP Summary Agent is visible" )
298+
299+ logger .info ("Checking RFP Risk Agent visibility..." )
300+ expect (self .page .locator (self .RFP_RISK_AGENT )).to_be_visible (timeout = 10000 )
301+ logger .info ("✓ RFP Risk Agent is visible" )
302+
303+ logger .info ("Checking RFP Compliance Agent visibility..." )
304+ expect (self .page .locator (self .RFP_COMPLIANCE_AGENT )).to_be_visible (timeout = 10000 )
305+ logger .info ("✓ RFP Compliance Agent is visible" )
306+
307+ logger .info ("All RFP agents validation completed successfully!" )
308+
309+ def validate_contract_compliance_agents_visible (self ):
310+ """Validate that all Contract Compliance agents are visible."""
311+ logger .info ("Validating all Contract Compliance agents are visible..." )
312+
313+ logger .info ("Checking Contract Summary Agent visibility..." )
314+ expect (self .page .locator (self .CC_SUMMARY_AGENT )).to_be_visible (timeout = 10000 )
315+ logger .info ("✓ Contract Summary Agent is visible" )
316+
317+ logger .info ("Checking Contract Risk Agent visibility..." )
318+ expect (self .page .locator (self .CC_RISK_AGENT )).to_be_visible (timeout = 10000 )
319+ logger .info ("✓ Contract Risk Agent is visible" )
320+
321+ logger .info ("Checking Contract Compliance Agent visibility..." )
322+ expect (self .page .locator (self .CC_AGENT )).to_be_visible (timeout = 10000 )
323+ logger .info ("✓ Contract Compliance Agent is visible" )
324+
325+ logger .info ("All Contract Compliance agents validation completed successfully!" )
326+
278327 def cancel_retail_task_plan (self ):
279328 """Cancel the retail task plan."""
280329 logger .info ("Starting retail task plan cancellation process..." )
@@ -298,7 +347,7 @@ def approve_retail_task_plan(self):
298347 #self.validate_agent_message_api_status(agent_name="CustomerDataAgent")
299348
300349 logger .info ("Waiting for plan processing to complete..." )
301- self .page .locator (self .PROCESSING_PLAN ).wait_for (state = "hidden" , timeout = 200000 )
350+ self .page .locator (self .PROCESSING_PLAN ).wait_for (state = "hidden" , timeout = 400000 )
302351 logger .info ("✓ Plan processing completed" )
303352
304353 # Check if INPUT_CLARIFICATION textbox is enabled
@@ -334,7 +383,7 @@ def approve_task_plan(self):
334383 #self.validate_agent_message_api_status(agent_name="CustomerDataAgent")
335384
336385 logger .info ("Waiting for plan processing to complete..." )
337- self .page .locator (self .PROCESSING_PLAN ).wait_for (state = "hidden" , timeout = 200000 )
386+ self .page .locator (self .PROCESSING_PLAN ).wait_for (state = "hidden" , timeout = 400000 )
338387 logger .info ("✓ Plan processing completed" )
339388
340389 logger .info ("Task plan approval and processing completed successfully!" )
@@ -355,7 +404,7 @@ def approve_product_marketing_task_plan(self):
355404 #self.validate_agent_message_api_status(agent_name="CustomerDataAgent")
356405
357406 logger .info ("Waiting for plan processing to complete..." )
358- self .page .locator (self .PROCESSING_PLAN ).wait_for (state = "hidden" , timeout = 200000 )
407+ self .page .locator (self .PROCESSING_PLAN ).wait_for (state = "hidden" , timeout = 400000 )
359408 logger .info ("✓ Plan processing completed" )
360409
361410 # Check if INPUT_CLARIFICATION textbox is enabled
@@ -394,6 +443,73 @@ def approve_product_marketing_task_plan(self):
394443
395444 logger .info ("Task plan approval and processing completed successfully!" )
396445
446+ def approve_rfp_task_plan (self ):
447+ """Approve the RFP task plan and wait for processing to complete."""
448+ logger .info ("Starting RFP task plan approval process..." )
449+
450+ logger .info ("Clicking 'Approve Task Plan' button..." )
451+ self .page .locator (self .APPROVE_TASK_PLAN ).click ()
452+ self .page .wait_for_timeout (2000 )
453+ logger .info ("✓ 'Approve Task Plan' button clicked" )
454+
455+ logger .info ("Waiting for 'Processing your plan' message to be visible..." )
456+ expect (self .page .locator (self .PROCESSING_PLAN )).to_be_visible (timeout = 10000 )
457+ logger .info ("✓ 'Processing your plan' message is visible" )
458+
459+ logger .info ("Waiting for plan processing to complete..." )
460+ self .page .locator (self .PROCESSING_PLAN ).wait_for (state = "hidden" , timeout = 400000 )
461+ logger .info ("✓ Plan processing completed" )
462+
463+ # Check if INPUT_CLARIFICATION textbox is enabled
464+ logger .info ("Checking if clarification input is enabled..." )
465+ clarification_input = self .page .locator (self .INPUT_CLARIFICATION )
466+ try :
467+ if clarification_input .is_visible (timeout = 5000 ) and clarification_input .is_enabled ():
468+ logger .error ("⚠ Clarification input is enabled - RFP Task plan approval requires clarification" )
469+ raise ValueError ("INPUT_CLARIFICATION is enabled - retry required" )
470+ logger .info ("✓ No clarification required - task completed successfully" )
471+ except ValueError :
472+ # Re-raise the clarification exception to trigger retry
473+ raise
474+ except (TimeoutError , Exception ) as e :
475+ # No clarification input detected, proceed normally
476+ logger .info (f"✓ No clarification input detected - proceeding normally: { e } " )
477+
478+ logger .info ("RFP task plan approval and processing completed successfully!" )
479+
480+ def approve_contract_compliance_task_plan (self ):
481+ """Approve the Contract Compliance task plan and wait for processing to complete."""
482+ logger .info ("Starting Contract Compliance task plan approval process..." )
483+
484+ logger .info ("Clicking 'Approve Task Plan' button..." )
485+ self .page .locator (self .APPROVE_TASK_PLAN ).click ()
486+ self .page .wait_for_timeout (2000 )
487+ logger .info ("✓ 'Approve Task Plan' button clicked" )
488+
489+ logger .info ("Waiting for 'Processing your plan' message to be visible..." )
490+ expect (self .page .locator (self .PROCESSING_PLAN )).to_be_visible (timeout = 10000 )
491+ logger .info ("✓ 'Processing your plan' message is visible" )
492+
493+ logger .info ("Waiting for plan processing to complete..." )
494+ self .page .locator (self .PROCESSING_PLAN ).wait_for (state = "hidden" , timeout = 400000 )
495+ logger .info ("✓ Plan processing completed" )
496+
497+ # Check if INPUT_CLARIFICATION textbox is enabled
498+ logger .info ("Checking if clarification input is enabled..." )
499+ clarification_input = self .page .locator (self .INPUT_CLARIFICATION )
500+ try :
501+ if clarification_input .is_visible (timeout = 5000 ) and clarification_input .is_enabled ():
502+ logger .error ("⚠ Clarification input is enabled - Contract Compliance Task plan approval requires clarification" )
503+ raise ValueError ("INPUT_CLARIFICATION is enabled - retry required" )
504+ logger .info ("✓ No clarification required - task completed successfully" )
505+ except ValueError :
506+ # Re-raise the clarification exception to trigger retry
507+ raise
508+ except (TimeoutError , Exception ) as e :
509+ # No clarification input detected, proceed normally
510+ logger .info (f"✓ No clarification input detected - proceeding normally: { e } " )
511+
512+ logger .info ("Contract Compliance task plan approval and processing completed successfully!" )
397513 def validate_retail_customer_response (self ):
398514 """Validate the retail customer response."""
399515
@@ -474,6 +590,64 @@ def validate_hr_response(self):
474590 except (AssertionError , TimeoutError ) as e :
475591 logger .warning (f"⚠ HR Helper Agent is NOT Utilized in response: { e } " )
476592
593+ def validate_rfp_response (self ):
594+ """Validate the RFP response."""
595+
596+ logger .info ("Validating RFP response..." )
597+ expect (self .page .locator (self .RFP_RESPONSE_VALIDATION )).to_be_visible (timeout = 20000 )
598+ logger .info ("✓ RFP response is visible" )
599+
600+ # Soft assertions for RFP Summary, RFP Risk, and RFP Compliance
601+ logger .info ("Checking RFP Summary visibility..." )
602+ try :
603+ expect (self .page .locator (self .RFP_SUMMARY ).first ).to_be_visible (timeout = 10000 )
604+ logger .info ("✓ RFP Summary is visible" )
605+ except (AssertionError , TimeoutError ) as e :
606+ logger .warning (f"⚠ RFP Summary Agent is NOT Utilized in response: { e } " )
607+
608+ logger .info ("Checking RFP Risk visibility..." )
609+ try :
610+ expect (self .page .locator (self .RFP_RISK ).first ).to_be_visible (timeout = 10000 )
611+ logger .info ("✓ RFP Risk is visible" )
612+ except (AssertionError , TimeoutError ) as e :
613+ logger .warning (f"⚠ RFP Risk Agent is NOT Utilized in response: { e } " )
614+
615+ logger .info ("Checking RFP Compliance visibility..." )
616+ try :
617+ expect (self .page .locator (self .RFP_COMPLIANCE ).first ).to_be_visible (timeout = 10000 )
618+ logger .info ("✓ RFP Compliance is visible" )
619+ except (AssertionError , TimeoutError ) as e :
620+ logger .warning (f"⚠ RFP Compliance Agent is NOT Utilized in response: { e } " )
621+
622+ def validate_contract_compliance_response (self ):
623+ """Validate the Contract Compliance response."""
624+
625+ logger .info ("Validating Contract Compliance response..." )
626+ expect (self .page .locator (self .CC_RESPONSE_VALIDATION )).to_be_visible (timeout = 20000 )
627+ logger .info ("✓ Contract Compliance response is visible" )
628+
629+ # Soft assertions for Contract Summary, Contract Risk, and Contract Compliance
630+ logger .info ("Checking Contract Summary visibility..." )
631+ try :
632+ expect (self .page .locator (self .CONTRACT_SUMMARY ).first ).to_be_visible (timeout = 10000 )
633+ logger .info ("✓ Contract Summary is visible" )
634+ except (AssertionError , TimeoutError ) as e :
635+ logger .warning (f"⚠ Contract Summary Agent is NOT Utilized in response: { e } " )
636+
637+ logger .info ("Checking Contract Risk visibility..." )
638+ try :
639+ expect (self .page .locator (self .CONTRACT_RISK ).first ).to_be_visible (timeout = 10000 )
640+ logger .info ("✓ Contract Risk is visible" )
641+ except (AssertionError , TimeoutError ) as e :
642+ logger .warning (f"⚠ Contract Risk Agent is NOT Utilized in response: { e } " )
643+
644+ logger .info ("Checking Contract Compliance visibility..." )
645+ try :
646+ expect (self .page .locator (self .CONTRACT_COMPLIANCE ).first ).to_be_visible (timeout = 10000 )
647+ logger .info ("✓ Contract Compliance is visible" )
648+ except (AssertionError , TimeoutError ) as e :
649+ logger .warning (f"⚠ Contract Compliance Agent is NOT Utilized in response: { e } " )
650+
477651 def click_new_task (self ):
478652 """Click on the New Task button."""
479653 logger .info ("Clicking on 'New Task' button..." )
0 commit comments