From 1f9aa562f0166e3bbc17b737631070d862e384f5 Mon Sep 17 00:00:00 2001 From: abdo <3810322580@qq.com> Date: Sun, 23 Jun 2024 13:21:56 +0800 Subject: [PATCH] Fix Bug 513 and Test script --- app/pickle_idea.py | 27 +++++++-- app/test/helper.py | 55 +++++++++++------ app/test/test_bug513_mayada.py | 108 +++++++++++++++++++++++++++++++++ 3 files changed, 164 insertions(+), 26 deletions(-) create mode 100644 app/test/test_bug513_mayada.py diff --git a/app/pickle_idea.py b/app/pickle_idea.py index 45bd19a..b5c1eb5 100644 --- a/app/pickle_idea.py +++ b/app/pickle_idea.py @@ -54,12 +54,27 @@ def save_frequency_to_pickle(d, pickle_fname): pickle.dump(d2, f) f.close() -def unfamiliar(path,word): - f = open(path,"rb") - dic = pickle.load(f) - dic[word] += [datetime.now().strftime('%Y%m%d%H%M')] - fp = open(path,"wb") - pickle.dump(dic,fp) + +''' +Updated function loads or initializes a dictionary, increments word counts and appends + timestamps, then saves changes, ensuring accurate tracking of unfamiliar words with timestamps. +''' +def unfamiliar(path, word): + try: + with open(path, "rb") as f: + dic = pickle.load(f) + except FileNotFoundError: + dic = {} + + if word in dic: + count, timestamps = dic[word] + dic[word] = (count + 1, timestamps + [datetime.now().strftime('%Y%m%d%H%M')]) + else: + dic[word] = (1, [datetime.now().strftime('%Y%m%d%H%M')]) + + with open(path, "wb") as fp: + pickle.dump(dic, fp) + def familiar(path,word): f = open(path,"rb") diff --git a/app/test/helper.py b/app/test/helper.py index 2b0deec..a6991d0 100644 --- a/app/test/helper.py +++ b/app/test/helper.py @@ -2,32 +2,47 @@ 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) - - elem = driver.find_element_by_link_text('注册') - elem.click() - elem = driver.find_element_by_id('username') - elem.send_keys(username) - - elem = driver.find_element_by_id('password') - elem.send_keys(password) - - elem = driver.find_element_by_id('password2') - elem.send_keys(password) - - elem = driver.find_element_by_class_name('btn') # 找到"注册"按钮 - elem.click() - try: - WebDriverWait(driver, 1).until(EC.alert_is_present()) - driver.switch_to.alert.accept() - except (UnexpectedAlertPresentException, NoAlertPresentException): - pass + # 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 - return username, password + except Exception as e: + print(f"An error occurred: {e}") + return None, None \ No newline at end of file diff --git a/app/test/test_bug513_mayada.py b/app/test/test_bug513_mayada.py new file mode 100644 index 0000000..0091b04 --- /dev/null +++ b/app/test/test_bug513_mayada.py @@ -0,0 +1,108 @@ +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) + + # Add selected word to the list of unfamiliar words + time.sleep(5) + add_to_unfamiliar_button = driver.find_element(By.XPATH, '//button[text()="把生词加入我的生词库"]') + add_to_unfamiliar_button.click() + 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) + + + #Get unfimiliar word count + initial_count = driver.find_element(By.ID, 'freq_'+ word).text + + #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() + time.sleep(3) + + + #Count unfamiliar words + current_unfamiliar_count = driver.find_element(By.XPATH, '//a[contains(@class, "btn-warning") and text()="不熟悉"]') + current_unfamiliar_count = int(unfamiliar_btn.text) + time.sleep(4) + + # Verify that the number of unfamiliar words has increased + assert current_unfamiliar_count > initial_count, "Unfamiliar word count did not increase as expected" + 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() \ No newline at end of file