import unittest from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time class EchoLightAppTest(unittest.TestCase): @classmethod def setUpClass(cls): # Adjust the path to your chromedriver if needed cls.driver = webdriver.Chrome() cls.driver.get('http://localhost:5500/index.html') # Use your local server/port cls.driver.maximize_window() cls.wait = WebDriverWait(cls.driver, 10) @classmethod def tearDownClass(cls): cls.driver.quit() def test_1_text_chat(self): driver = self.driver wait = self.wait # Find input and send a message input_box = wait.until(EC.presence_of_element_located((By.ID, 'messageInput'))) input_box.clear() input_box.send_keys('Hello, how are you?') input_box.send_keys(Keys.ENTER) # Wait for echo reply wait.until(lambda d: len(d.find_elements(By.CSS_SELECTOR, '.message.echo')) > 0) messages = driver.find_elements(By.CSS_SELECTOR, '.message.echo') self.assertTrue(any('how are you' in m.text.lower() or m.text for m in messages)) def test_2_empty_message(self): driver = self.driver wait = self.wait input_box = wait.until(EC.presence_of_element_located((By.ID, 'messageInput'))) input_box.clear() input_box.send_keys(' ') input_box.send_keys(Keys.ENTER) # No new user message should be added time.sleep(1) user_msgs = driver.find_elements(By.CSS_SELECTOR, '.message.user') self.assertFalse(user_msgs[-1].text.strip() == '') def test_3_modes_navigation(self): driver = self.driver wait = self.wait # Modes grid modes = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.mode-card'))) for mode in modes: mode.click() time.sleep(0.5) # Check that the screen is active active = driver.find_elements(By.CSS_SELECTOR, '.screen.active') self.assertTrue(len(active) > 0) def test_4_vocabulary_card(self): driver = self.driver wait = self.wait # Go to vocabulary mode vocab_mode = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.mode-card')))[1] vocab_mode.click() time.sleep(0.5) # Check card content word = driver.find_element(By.ID, 'cardWord').text self.assertTrue(len(word) > 0) # Next card next_btn = driver.find_element(By.ID, 'nextCardBtn') if driver.find_elements(By.ID, 'nextCardBtn') else None if next_btn: next_btn.click() time.sleep(0.5) new_word = driver.find_element(By.ID, 'cardWord').text self.assertNotEqual(word, new_word) def test_5_achievements(self): driver = self.driver wait = self.wait # Go to achievements/progress screen progress_btn = driver.find_element(By.ID, 'progressBtn') if driver.find_elements(By.ID, 'progressBtn') else None if progress_btn: progress_btn.click() time.sleep(0.5) achievements = driver.find_elements(By.CSS_SELECTOR, '.achievement-card') self.assertTrue(len(achievements) > 0) if __name__ == '__main__': unittest.main()