Skip to content

Commit fa80b67

Browse files
test: Enhance US04 tests with fallback WebDriver setup, improved screenshot handling, and error logging
1 parent 95fb02c commit fa80b67

File tree

1 file changed

+74
-0
lines changed

1 file changed

+74
-0
lines changed

tests/us4.py

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)