Compare commits
	
		
			6 Commits 
		
	
	
		
			master
			...
			Bug518-Mpo
		
	
	| Author | SHA1 | Date | 
|---|---|---|
|  | 430705aef5 | |
|  | 35751c2c5f | |
|  | 35a6f1c828 | |
|  | a42e63dc27 | |
|  | 6500eeca84 | |
|  | 7d65782728 | 
|  | @ -0,0 +1 @@ | ||||||
|  | Subproject commit 8cbc7c9a0ce543db48f80a743c4168ca847ca500 | ||||||
|  | @ -54,12 +54,27 @@ def save_frequency_to_pickle(d, pickle_fname): | ||||||
|     pickle.dump(d2, f) |     pickle.dump(d2, f) | ||||||
|     f.close() |     f.close() | ||||||
| 
 | 
 | ||||||
| def unfamiliar(path,word): | ''' | ||||||
|     f = open(path,"rb") | Fixed function initializes a dictionary if file doesn't exist, increments word counts correctly, and  | ||||||
|     dic = pickle.load(f) | appends timestamps, preventing unintended count increases for previously marked words in subsequent uses. | ||||||
|     dic[word] += [datetime.now().strftime('%Y%m%d%H%M')] | ''' | ||||||
|     fp = open(path,"wb") | def unfamiliar(path, word): | ||||||
|     pickle.dump(dic,fp) |     try: | ||||||
|  |         with open(path, "rb") as f: | ||||||
|  |             dic = pickle.load(f) | ||||||
|  |     except FileNotFoundError: | ||||||
|  |         dic = {}  # Initialize an empty dictionary if the file doesn't exist | ||||||
|  | 
 | ||||||
|  |     if word in dic: | ||||||
|  |         dic[word][0] += 1  # Increment the count of the word | ||||||
|  |     else: | ||||||
|  |         dic[word] = [1, []]  # Initialize count to 1 and empty list for timestamps | ||||||
|  | 
 | ||||||
|  |     dic[word][1].append(datetime.now().strftime('%Y%m%d%H%M'))  # Add timestamp | ||||||
|  | 
 | ||||||
|  |     with open(path, "wb") as fp: | ||||||
|  |         pickle.dump(dic, fp) | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| def familiar(path,word): | def familiar(path,word): | ||||||
|     f = open(path,"rb") |     f = open(path,"rb") | ||||||
|  |  | ||||||
|  | @ -157,6 +157,7 @@ | ||||||
|                     update(data['today_article']); |                     update(data['today_article']); | ||||||
|                     check_pre(data['visited_articles']); |                     check_pre(data['visited_articles']); | ||||||
|                     check_next(data['result_of_generate_article']); |                     check_next(data['result_of_generate_article']); | ||||||
|  |                     toggleHighlighting(); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         }); |         }); | ||||||
|  | @ -170,6 +171,7 @@ | ||||||
|                 if(data['today_article']){ |                 if(data['today_article']){ | ||||||
|                     update(data['today_article']); |                     update(data['today_article']); | ||||||
|                     check_pre(data['visited_articles']); |                     check_pre(data['visited_articles']); | ||||||
|  |                     toggleHighlighting(); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|  | @ -9,5 +9,5 @@ def URL(): | ||||||
| 
 | 
 | ||||||
| @pytest.fixture | @pytest.fixture | ||||||
| def driver(): | def driver(): | ||||||
|     my_driver = webdriver.Edge()  # uncomment this line if you wish to run the test on your laptop     |     my_driver = webdriver.Chrome() | ||||||
|     return my_driver |     return my_driver | ||||||
|  |  | ||||||
|  | @ -0,0 +1,48 @@ | ||||||
|  | import uuid | ||||||
|  | from selenium.webdriver.support.ui import WebDriverWait | ||||||
|  | from selenium.webdriver.support import expected_conditions as EC | ||||||
|  | from selenium.common.exceptions import UnexpectedAlertPresentException, NoAlertPresentException | ||||||
|  | from selenium.webdriver.common.by import By | ||||||
|  | 
 | ||||||
|  | def signup(URL, driver): | ||||||
|  |     username = 'TestUser' + str(uuid.uuid1()).split('-')[0].title() | ||||||
|  |     password = '[Abc+123]' | ||||||
|  | 
 | ||||||
|  |     driver.get(URL) | ||||||
|  |      | ||||||
|  |     try: | ||||||
|  |         # Click the register link | ||||||
|  |         register_link = WebDriverWait(driver, 10).until( | ||||||
|  |             EC.element_to_be_clickable((By.LINK_TEXT, '注册')) | ||||||
|  |         ) | ||||||
|  |         register_link.click() | ||||||
|  |          | ||||||
|  |         # Fill the registration form | ||||||
|  |         username_field = WebDriverWait(driver, 10).until( | ||||||
|  |             EC.presence_of_element_located((By.ID, 'username')) | ||||||
|  |         ) | ||||||
|  |         username_field.send_keys(username) | ||||||
|  | 
 | ||||||
|  |         password_field = driver.find_element(By.ID, 'password') | ||||||
|  |         password_field.send_keys(password) | ||||||
|  | 
 | ||||||
|  |         confirm_password_field = driver.find_element(By.ID, 'password2') | ||||||
|  |         confirm_password_field.send_keys(password) | ||||||
|  | 
 | ||||||
|  |         # Click the register button | ||||||
|  |         register_button = driver.find_element(By.CLASS_NAME, 'btn') | ||||||
|  |         register_button.click() | ||||||
|  | 
 | ||||||
|  |         # Handle possible alert | ||||||
|  |         try: | ||||||
|  |             WebDriverWait(driver, 1).until(EC.alert_is_present()) | ||||||
|  |             alert = driver.switch_to.alert | ||||||
|  |             alert.accept() | ||||||
|  |         except (UnexpectedAlertPresentException, NoAlertPresentException): | ||||||
|  |             pass | ||||||
|  |          | ||||||
|  |         return username, password | ||||||
|  |      | ||||||
|  |     except Exception as e: | ||||||
|  |         print(f"An error occurred: {e}") | ||||||
|  |         return None, None | ||||||
|  | @ -0,0 +1,107 @@ | ||||||
|  | import random | ||||||
|  | import string | ||||||
|  | import time | ||||||
|  | 
 | ||||||
|  | from selenium.webdriver.common.by import By | ||||||
|  | from selenium.webdriver.support.ui import WebDriverWait | ||||||
|  | from selenium.webdriver.support import expected_conditions as EC | ||||||
|  | 
 | ||||||
|  | from helper import signup | ||||||
|  | 
 | ||||||
|  | def has_punctuation(s): | ||||||
|  |     return any(c in string.punctuation for c in s) | ||||||
|  | 
 | ||||||
|  | def login(driver, home, uname, password): | ||||||
|  |     driver.get(home) | ||||||
|  |     WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, '登录'))).click() | ||||||
|  |     driver.find_element(By.ID, 'username').send_keys(uname) | ||||||
|  |     driver.find_element(By.ID, 'password').send_keys(password) | ||||||
|  |     driver.find_element(By.XPATH, '//button[text()="登录"]').click() | ||||||
|  |     WebDriverWait(driver, 10).until(EC.title_is(f"EnglishPal Study Room for {uname}")) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def select_valid_word(driver): | ||||||
|  |     elem = driver.find_element(By.ID, 'text-content') | ||||||
|  |     essay_content = elem.text | ||||||
|  |     valid_word = random.choice([word for word in essay_content.split() if len(word) >= 6 and not has_punctuation( | ||||||
|  |         word) and 'font>' not in word and 'br>' not in word and 'p>' not in word]) | ||||||
|  |     driver.find_element(By.ID, 'selected-words').send_keys(valid_word) | ||||||
|  |     return valid_word | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def select_more_words(driver): | ||||||
|  |     elem = driver.find_element(By.ID, 'text-content') | ||||||
|  |     essay_content = elem.text | ||||||
|  |     valid_words = [word for word in essay_content.split() if len(word) >= 6 and not has_punctuation( | ||||||
|  |         word) and 'font>' not in word and 'br>' not in word and 'p>' not in word] | ||||||
|  |     words_to_send = ', '.join(valid_words[:7]) | ||||||
|  |     driver.find_element(By.ID, 'selected-words').send_keys(words_to_send) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def test_unfamiliar_button(driver, URL): | ||||||
|  |     try: | ||||||
|  |         username, password = signup(URL, driver) | ||||||
|  |         time.sleep(5) | ||||||
|  | 
 | ||||||
|  |         word = select_valid_word(driver) | ||||||
|  |          | ||||||
|  |         # Wait for the button to be clickable | ||||||
|  |         time.sleep(8) | ||||||
|  |        # Add selected word to the list of unfamiliar words | ||||||
|  |         add_to_unfamiliar_button =  driver.find_element(By.XPATH, '//button[text()="把生词加入我的生词库"]') | ||||||
|  |         add_to_unfamiliar_button.click() | ||||||
|  |         # Wait for the page to update | ||||||
|  |         time.sleep(3) | ||||||
|  | 
 | ||||||
|  |         add_words_button =  driver.find_element(By.XPATH, '//button[text()="加入我的生词簿"]') # Replace with actual ID or selector | ||||||
|  |         add_words_button.click() | ||||||
|  |         # Wait for the page to update again | ||||||
|  |         time.sleep(2) | ||||||
|  | 
 | ||||||
|  |       # Check if the added word appears in the word container | ||||||
|  |         word_container = driver.find_element(By.CLASS_NAME, 'word-container') | ||||||
|  |         words = word_container.find_elements(By.TAG_NAME, 'p') | ||||||
|  |         added_word_exists = any(word.text == word for word in words) | ||||||
|  |         time.sleep(2) | ||||||
|  | 
 | ||||||
|  |         # Mark word as unfamiliar | ||||||
|  |         time.sleep(5) | ||||||
|  |         for _ in range(16): | ||||||
|  |             time.sleep(1) | ||||||
|  |             unfamiliar_btn = driver.find_element(By.XPATH, '//a[contains(@class, "btn-warning") and text()="不熟悉"]') | ||||||
|  |             unfamiliar_btn.click() | ||||||
|  |         # Wait for the page to updatec | ||||||
|  |         time.sleep(5) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         #add new words | ||||||
|  |         word = select_more_words(driver) | ||||||
|  |         add_to_unfamiliar_button =  driver.find_element(By.XPATH, '//button[text()="把生词加入我的生词库"]') | ||||||
|  |         add_to_unfamiliar_button.click() | ||||||
|  |              | ||||||
|  |         time.sleep(5) | ||||||
|  | 
 | ||||||
|  |         #add the words to the list of words | ||||||
|  |         add_words_again =  driver.find_element(By.XPATH, '//button[text()="加入我的生词簿"]') # Replace with actual ID or selector | ||||||
|  |         add_words_again.click() | ||||||
|  |         # Wait for the page to update again | ||||||
|  |         time.sleep(3) | ||||||
|  |        | ||||||
|  |        | ||||||
|  |         #current count after adding new words | ||||||
|  |         current_unfamiliar_count = driver.find_element(By.XPATH, '//a[contains(@class, "btn-warning") and text()="不熟悉"]') | ||||||
|  |         current_unfamiliar_count = int(unfamiliar_btn.text.split('(')[1].split(')')[0]) | ||||||
|  |         print(f"Unfamiliar word count: {current_unfamiliar_count}") | ||||||
|  |         time.sleep(3) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         # Log out and close the browser | ||||||
|  |         driver.find_element(By.XPATH, '//a[contains(@class, "btn-secondary") and text()="退出"]') | ||||||
|  |         driver.execute_script("window.open('');window.close();") | ||||||
|  |         WebDriverWait(driver, 2) | ||||||
|  |         driver.execute_script("window.open('');") | ||||||
|  |         driver.switch_to.window(driver.window_handles[-1]) | ||||||
|  | 
 | ||||||
|  |     finally: | ||||||
|  |         driver.quit() | ||||||
|  | @ -0,0 +1,43 @@ | ||||||
|  | import time | ||||||
|  | import pytest | ||||||
|  | import uuid | ||||||
|  | from selenium import webdriver | ||||||
|  | from selenium.webdriver import ActionChains | ||||||
|  | from selenium.webdriver.common.by import By | ||||||
|  | from selenium.webdriver.support.ui import WebDriverWait | ||||||
|  | from selenium.webdriver.support import expected_conditions as EC | ||||||
|  | from selenium.common.exceptions import UnexpectedAlertPresentException, NoAlertPresentException, NoSuchElementException, \ | ||||||
|  |     TimeoutException | ||||||
|  | from conftest import URL | ||||||
|  | driver = webdriver.Chrome() | ||||||
|  | def test_bug555(): | ||||||
|  |     try: | ||||||
|  |         driver.maximize_window() | ||||||
|  |         base_url = "http://127.0.0.1:5000" | ||||||
|  |         driver.get(base_url) | ||||||
|  |         article = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, 'article'))) | ||||||
|  |         perform_actions_on_article(driver, article) | ||||||
|  | 
 | ||||||
|  |         next_button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, 'load_next_article'))) | ||||||
|  |         next_button.click() | ||||||
|  |         print("Clicked next article button.") | ||||||
|  | 
 | ||||||
|  |         prev_button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, 'load_pre_article'))) | ||||||
|  |         prev_button.click() | ||||||
|  |         print("Clicked previous article button.") | ||||||
|  | 
 | ||||||
|  |     except (TimeoutException, NoSuchElementException) as e: | ||||||
|  |         print(f"An error occurred: {e}") | ||||||
|  | 
 | ||||||
|  |     finally: | ||||||
|  |         driver.quit() | ||||||
|  |         print("Driver closed.") | ||||||
|  | 
 | ||||||
|  | def perform_actions_on_article(driver, article): | ||||||
|  |     actions = ActionChains(driver) | ||||||
|  |     actions.move_to_element(article) | ||||||
|  |     actions.click_and_hold() | ||||||
|  |     actions.move_by_offset(450, 200) | ||||||
|  |     actions.release() | ||||||
|  |     actions.perform() | ||||||
|  |     print("Performed actions on article.") | ||||||
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 20 KiB | 
		Loading…
	
		Reference in New Issue