2020RETRY_DELAY = 3 # seconds
2121
2222
23- # Helper function to capture screenshots at key steps - reusable across all tests
24- def capture_screenshot (page , step_name , test_prefix = "test " ):
23+ # Helper function to capture screenshots only on test failures
24+ def capture_failure_screenshot (page , test_name , error_info = " " ):
2525 """
26- Capture a screenshot and save it to the screenshots directory.
26+ Capture a screenshot when a test fails and save it to the screenshots directory.
2727
2828 Args:
2929 page: Playwright page object
30- step_name : Name/description of the step being captured
31- test_prefix: Prefix for the screenshot filename (default: "test")
30+ test_name : Name of the test that failed
31+ error_info: Additional error information to include in filename
3232 """
3333 try :
3434 from datetime import datetime
35- screenshots_dir = os .path .join (os .path .dirname (__file__ ), ".." , "screenshots" )
35+ screenshots_dir = os .path .join (os .path .dirname (__file__ ), ".." , "screenshots" , "failures" )
3636 os .makedirs (screenshots_dir , exist_ok = True )
3737
3838 timestamp = datetime .now ().strftime ("%Y%m%d_%H%M%S" )
39- screenshot_name = f"{ test_prefix } _{ step_name } _{ timestamp } .png"
39+ error_suffix = f"_{ error_info } " if error_info else ""
40+ screenshot_name = f"FAILED_{ test_name } { error_suffix } _{ timestamp } .png"
4041 screenshot_path = os .path .join (screenshots_dir , screenshot_name )
4142
4243 page .screenshot (path = screenshot_path )
43- logger .info ("📸 Screenshot saved: %s" , screenshot_name )
44+ logger .error ("📸 Failure screenshot saved: %s" , screenshot_name )
4445 except Exception as e :
45- logger .warning ("⚠️ Failed to capture screenshot for %s: %s" , step_name , str (e ))
46+ logger .warning ("⚠️ Failed to capture failure screenshot for %s: %s" , test_name , str (e ))
47+
48+
49+ # Legacy function - kept for compatibility but updated to do nothing
50+ def capture_screenshot (page , step_name , test_prefix = "test" ):
51+ """
52+ Legacy function - now does nothing as screenshots are only captured on failures.
53+ Use capture_failure_screenshot() for test failures.
54+ """
55+ pass
4656
4757
4858@pytest .mark .goldenpath
@@ -76,7 +86,6 @@ def test_docgen_golden_path_refactored(login_logout, request):
7686 logger .info ("Step 1: Validate home page is loaded and navigating to Browse Page" )
7787 start = time .time ()
7888 home_page .validate_home_page ()
79- capture_screenshot (page , "step1_home_page" , "golden_path" )
8089 home_page .click_browse_button ()
8190 duration = time .time () - start
8291 logger .info ("Execution Time for 'Validate home page and navigate to Browse': %.2fs" , duration )
@@ -91,7 +100,6 @@ def test_docgen_golden_path_refactored(login_logout, request):
91100 browse_page .enter_a_question (question )
92101 browse_page .click_send_button ()
93102 browse_page .validate_response_status (question_api = question )
94- capture_screenshot (page , f"step2_{ idx } _browse_response" , "golden_path" )
95103 browse_page .click_expand_reference_in_response ()
96104 browse_page .click_reference_link_in_response ()
97105 browse_page .close_citation ()
@@ -103,9 +111,7 @@ def test_docgen_golden_path_refactored(login_logout, request):
103111 logger .info ("Step 4: Navigate to Generate page and delete chat history" )
104112 start = time .time ()
105113 browse_page .click_generate_button ()
106- capture_screenshot (page , "step4_before_delete_history" , "golden_path" )
107114 generate_page .delete_chat_history ()
108- capture_screenshot (page , "step4_after_delete_history" , "golden_path" )
109115 duration = time .time () - start
110116 logger .info ("Execution Time for 'Navigate to Generate and delete chat history': %.2fs" , duration )
111117
@@ -126,7 +132,6 @@ def test_docgen_golden_path_refactored(login_logout, request):
126132
127133 if latest_response not in [invalid_response , invalid_response1 ]:
128134 logger .info ("[%s] Valid response received on attempt %d" , generate_question1 , attempt )
129- capture_screenshot (page , f"step5_generate_response_attempt{ attempt } " , "golden_path" )
130135 question_passed = True
131136 break
132137 else :
@@ -158,7 +163,6 @@ def test_docgen_golden_path_refactored(login_logout, request):
158163 start = time .time ()
159164 generate_page .enter_a_question (add_section )
160165 generate_page .click_send_button ()
161- capture_screenshot (page , "step6_add_section_response" , "golden_path" )
162166 duration = time .time () - start
163167 logger .info ("Execution Time for 'Add Section Prompt': %.2fs" , duration )
164168
@@ -167,7 +171,6 @@ def test_docgen_golden_path_refactored(login_logout, request):
167171 start = time .time ()
168172 generate_page .click_generate_draft_button ()
169173 draft_page .validate_draft_sections_loaded ()
170- capture_screenshot (page , "step7_draft_sections_loaded" , "golden_path" )
171174 duration = time .time () - start
172175 logger .info ("Execution Time for 'Generate Draft and Validate Sections': %.2fs" , duration )
173176
@@ -176,7 +179,6 @@ def test_docgen_golden_path_refactored(login_logout, request):
176179 start = time .time ()
177180 browse_page .click_generate_button ()
178181 generate_page .show_chat_history ()
179- capture_screenshot (page , "step8_chat_history_shown" , "golden_path" )
180182 duration = time .time () - start
181183 logger .info ("Execution Time for 'Validate chat history is saved': %.2fs" , duration )
182184
@@ -238,7 +240,6 @@ def test_browse_generate_tabs_accessibility(login_logout, request):
238240 home_page .open_home_page ()
239241
240242 home_page .validate_home_page ()
241- capture_screenshot (page , "step1_home_page" , "tc9366" )
242243 duration = time .time () - start
243244 logger .info ("Execution Time for 'Validate home page is loaded': %.2fs" , duration )
244245
@@ -250,7 +251,6 @@ def test_browse_generate_tabs_accessibility(login_logout, request):
250251
251252 # Verify chat conversation elements are present on Browse page
252253 browse_page .validate_browse_page ()
253- capture_screenshot (page , "step2_browse_tab_accessible" , "tc9366" )
254254
255255 logger .info ("Browse tab is visible and enabled" )
256256 duration = time .time () - start
@@ -264,7 +264,6 @@ def test_browse_generate_tabs_accessibility(login_logout, request):
264264
265265 # Verify chat conversation elements are present on Generate page
266266 generate_page .validate_generate_page ()
267- capture_screenshot (page , "step3_generate_tab_accessible" , "tc9366" )
268267
269268 logger .info ("Generate tab is visible and enabled" )
270269 duration = time .time () - start
@@ -282,7 +281,6 @@ def test_browse_generate_tabs_accessibility(login_logout, request):
282281 "FAILED: 'Generate Draft' button should be disabled on launch before creating a template"
283282
284283 logger .info ("✅ Draft button is properly disabled on launch" )
285- capture_screenshot (page , "step4_draft_button_disabled" , "tc9366" )
286284 duration = time .time () - start
287285 logger .info ("Execution Time for 'Verify Draft tab is disabled': %.2fs" , duration )
288286
@@ -297,6 +295,11 @@ def test_browse_generate_tabs_accessibility(login_logout, request):
297295
298296 logger .info ("Test TC 9366 - Browse and Generate tabs accessibility test completed successfully" )
299297
298+ except Exception as e :
299+ # Capture screenshot only on failure
300+ capture_failure_screenshot (page , "test_browse_generate_tabs_accessibility" , "exception" )
301+ logger .error (f"Test failed with exception: { str (e )} " )
302+ raise
300303 finally :
301304 logger .removeHandler (handler )
302305
@@ -347,7 +350,6 @@ def test_draft_tab_accessibility_after_template_creation(login_logout, request):
347350 start = time .time ()
348351 home_page .open_home_page ()
349352 home_page .validate_home_page ()
350- capture_screenshot (page , "step1_home_page" , "tc9369" )
351353 logger .info ("✅ Login successful and 'Document Generation' page is displayed" )
352354 duration = time .time () - start
353355 logger .info ("Execution Time for Step 1: %.2fs" , duration )
@@ -357,7 +359,6 @@ def test_draft_tab_accessibility_after_template_creation(login_logout, request):
357359 start = time .time ()
358360 home_page .click_browse_button ()
359361 browse_page .validate_browse_page ()
360- capture_screenshot (page , "step2_browse_page" , "tc9369" )
361362 logger .info ("✅ Chat conversation page is displayed" )
362363 duration = time .time () - start
363364 logger .info ("Execution Time for Step 2: %.2fs" , duration )
@@ -371,7 +372,6 @@ def test_draft_tab_accessibility_after_template_creation(login_logout, request):
371372 logger .info ("Send button clicked" )
372373 page .wait_for_timeout (3000 )
373374 browse_page .validate_response_status (question_api = browse_question1 )
374- capture_screenshot (page , "step3_browse_response" , "tc9369" )
375375 logger .info ("✅ Response is generated with typical sections from promissory notes" )
376376 duration = time .time () - start
377377 logger .info ("Execution Time for Step 3: %.2fs" , duration )
@@ -386,7 +386,6 @@ def test_draft_tab_accessibility_after_template_creation(login_logout, request):
386386 "FAILED: Draft tab should be disabled before template creation"
387387
388388 logger .info ("✅ Draft tab should be disabled" )
389- capture_screenshot (page , "step4_draft_tab_disabled" , "tc9369" )
390389 duration = time .time () - start
391390 logger .info ("Execution Time for Step 4: %.2fs" , duration )
392391
@@ -397,7 +396,6 @@ def test_draft_tab_accessibility_after_template_creation(login_logout, request):
397396 browse_page .click_generate_button ()
398397 page .wait_for_timeout (3000 )
399398 generate_page .validate_generate_page ()
400- capture_screenshot (page , "step5_generate_page" , "tc9369" )
401399 logger .info ("✅ Chat conversation page is displayed" )
402400 duration = time .time () - start
403401 logger .info ("Execution Time for Step 5: %.2fs" , duration )
@@ -413,7 +411,6 @@ def test_draft_tab_accessibility_after_template_creation(login_logout, request):
413411 "FAILED: Generate Draft icon should be disabled before template creation"
414412
415413 logger .info ("✅ Generate Draft icon is disabled" )
416- capture_screenshot (page , "step6_draft_button_disabled" , "tc9369" )
417414 duration = time .time () - start
418415 logger .info ("Execution Time for Step 6: %.2fs" , duration )
419416
@@ -450,7 +447,6 @@ def test_draft_tab_accessibility_after_template_creation(login_logout, request):
450447
451448 if latest_response not in [invalid_response , invalid_response1 ]:
452449 logger .info ("✅ Promissory note is generated on attempt %d" , attempt )
453- capture_screenshot (page , f"step7_promissory_note_attempt{ attempt } " , "tc9369" )
454450 question_passed = True
455451 break
456452 else :
@@ -499,7 +495,6 @@ def test_draft_tab_accessibility_after_template_creation(login_logout, request):
499495
500496 # Verify Draft sections are loaded
501497 draft_page .validate_draft_sections_loaded ()
502- capture_screenshot (page , "step8_draft_section_displayed" , "tc9369" )
503498
504499 logger .info ("✅ 'Generate draft' icon is enabled and Draft section is displayed" )
505500 duration = time .time () - start
@@ -518,6 +513,11 @@ def test_draft_tab_accessibility_after_template_creation(login_logout, request):
518513 logger .info ("Step 8: Draft section displayed after template creation ✓" )
519514 logger .info ("=" * 80 )
520515
516+ except Exception as e :
517+ # Capture screenshot only on failure
518+ capture_failure_screenshot (page , "test_draft_tab_accessibility_after_template_creation" , "exception" )
519+ logger .error (f"Test failed with exception: { str (e )} " )
520+ raise
521521 finally :
522522 logger .removeHandler (handler )
523523
0 commit comments