Compare commits
	
		
			6 Commits 
		
	
	
		
			master
			...
			Bug518-Mpo
		
	
	| Author | SHA1 | Date | 
|---|---|---|
| 
							
							
								
									
								
								 | 
						430705aef5 | |
| 
							
							
								
									
								
								 | 
						35751c2c5f | |
| 
							
							
								
									
								
								 | 
						35a6f1c828 | |
| 
							
							
								
									
								
								 | 
						a42e63dc27 | |
| 
							
							
								
									
								
								 | 
						6500eeca84 | |
| 
							
							
								
									
								
								 | 
						7d65782728 | 
| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
Subproject commit 8cbc7c9a0ce543db48f80a743c4168ca847ca500
 | 
			
		||||
| 
						 | 
				
			
			@ -54,13 +54,28 @@ def save_frequency_to_pickle(d, pickle_fname):
 | 
			
		|||
    pickle.dump(d2, f)
 | 
			
		||||
    f.close()
 | 
			
		||||
 | 
			
		||||
'''
 | 
			
		||||
Fixed function initializes a dictionary if file doesn't exist, increments word counts correctly, and 
 | 
			
		||||
appends timestamps, preventing unintended count increases for previously marked words in subsequent uses.
 | 
			
		||||
'''
 | 
			
		||||
def unfamiliar(path, word):
 | 
			
		||||
    f = open(path,"rb")
 | 
			
		||||
    try:
 | 
			
		||||
        with open(path, "rb") as f:
 | 
			
		||||
            dic = pickle.load(f)
 | 
			
		||||
    dic[word] += [datetime.now().strftime('%Y%m%d%H%M')]
 | 
			
		||||
    fp = open(path,"wb")
 | 
			
		||||
    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):
 | 
			
		||||
    f = open(path,"rb")
 | 
			
		||||
    dic = pickle.load(f)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -157,6 +157,7 @@
 | 
			
		|||
                    update(data['today_article']);
 | 
			
		||||
                    check_pre(data['visited_articles']);
 | 
			
		||||
                    check_next(data['result_of_generate_article']);
 | 
			
		||||
                    toggleHighlighting();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
| 
						 | 
				
			
			@ -170,6 +171,7 @@
 | 
			
		|||
                if(data['today_article']){
 | 
			
		||||
                    update(data['today_article']);
 | 
			
		||||
                    check_pre(data['visited_articles']);
 | 
			
		||||
                    toggleHighlighting();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,5 +9,5 @@ def URL():
 | 
			
		|||
 | 
			
		||||
@pytest.fixture
 | 
			
		||||
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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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