@@ -31,6 +31,80 @@ class US04Tests(unittest.TestCase):
3131 # Simpler CSS selector for the back button - targeting the first button in the nav-bar
3232 NAV_BACK_BUTTON_SELECTOR = "nav.nav-bar > button.nav-bar__button:first-child"
3333 HOME_CONTAINER_SELECTOR = "div.home__container"
34+
35+ def set_driver_fixture (self , driver ):
36+ self .driver = driver
37+ self .wait_short = WebDriverWait (self .driver , 5 )
38+ self .wait_long = WebDriverWait (self .driver , 15 )
39+ if not os .path .exists ("screenshots" ):
40+ os .makedirs ("screenshots" )
41+
42+ def setUp (self ):
43+ # This setup is primarily for direct unittest execution.
44+ # Pytest will use the fixture from conftest.py
45+ if not hasattr (self , 'driver' ) or not self .driver :
46+ logger .info ("WebDriver not set by fixture, attempting fallback setup for direct unittest execution." )
47+ try :
48+ options = webdriver .ChromeOptions ()
49+ # Add any desired options here, e.g., headless
50+ # options.add_argument('--headless')
51+ # options.add_argument('--disable-gpu')
52+ self .driver = webdriver .Chrome (options = options )
53+ self .set_driver_fixture (self .driver ) # Call to setup waits and screenshot dir
54+ self .is_driver_managed_by_fallback = True
55+ logger .info ("Fallback WebDriver initialized for direct unittest execution." )
56+ except Exception as e :
57+ logger .error (f"Failed to initialize fallback WebDriver: { e } " )
58+ self .fail (f"Failed to initialize fallback WebDriver: { e } " )
59+ else :
60+ logger .info ("WebDriver already set, likely by a pytest fixture." )
61+ self .is_driver_managed_by_fallback = False
62+ self ._initial_setup ()
63+
64+ def tearDown (self ):
65+ if hasattr (self , 'is_driver_managed_by_fallback' ) and self .is_driver_managed_by_fallback :
66+ if self .driver :
67+ self .driver .quit ()
68+ logger .info ("Fallback WebDriver quit." )
69+ else :
70+ logger .info ("Driver teardown managed by pytest fixture (if applicable)." )
71+
72+ def _take_screenshot (self , name_suffix ):
73+ timestamp = int (time .time ())
74+ test_method_name = getattr (self , '_testMethodName' , 'unknown_test' )
75+ screenshot_name = f"screenshots/{ test_method_name } _{ name_suffix } _{ timestamp } .png"
76+ try :
77+ if hasattr (self , 'driver' ) and self .driver :
78+ self .driver .save_screenshot (screenshot_name )
79+ logger .info (f"Screenshot saved: { screenshot_name } " )
80+ except Exception as e :
81+ logger .error (f"Error saving screenshot { screenshot_name } : { e } " )
82+
83+ def _get_current_weighted_average (self ):
84+ """Extract and return the current weighted average from the result page."""
85+ try :
86+ current_avg_element = self .wait_long .until (
87+ EC .presence_of_element_located ((By .CSS_SELECTOR , self .CURRENT_AVERAGE_DISPLAY_SELECTOR ))
88+ )
89+ current_avg_text = current_avg_element .text .strip ()
90+ logger .info (f"Current average text found: '{ current_avg_text } '" )
91+
92+ # Extract the numeric value using regex - looking for decimal number
93+ match = re .search (r'(\d+\.\d+)' , current_avg_text )
94+ if match :
95+ current_avg = float (match .group (1 ))
96+ logger .info (f"Extracted current average: { current_avg } " )
97+ return current_avg
98+ else :
99+ logger .error (f"Failed to extract numeric average from text: '{ current_avg_text } '" )
100+ self ._take_screenshot ("average_extraction_failed" )
101+ self .fail (f"Could not extract numeric average from: '{ current_avg_text } '" )
102+
103+ except Exception as e :
104+ logger .error (f"Error getting current weighted average: { e } " )
105+ self ._take_screenshot ("get_current_avg_error" )
106+ self .fail (f"Error getting current weighted average: { e } " )
107+ return None
34108
35109 def _initial_setup (self ):
36110 if not hasattr (self , 'driver' ) or not self .driver :
0 commit comments