Merge branch 'Alpha-snapshot20230621' into Bug544-TangXinyuan
# Conflicts: # app/test/conftest.pypull/105/head
						commit
						46233ead1e
					
				| 
						 | 
					@ -14,4 +14,8 @@ app/db/wordfreqapp.db
 | 
				
			||||||
app/static/donate-the-author.jpg
 | 
					app/static/donate-the-author.jpg
 | 
				
			||||||
app/static/donate-the-author-hidden.jpg
 | 
					app/static/donate-the-author-hidden.jpg
 | 
				
			||||||
app/model/__pycache__/
 | 
					app/model/__pycache__/
 | 
				
			||||||
 | 
					app/test/__pycache__/
 | 
				
			||||||
 | 
					app/test/.pytest_cache/
 | 
				
			||||||
 | 
					app/test/pytest_report.html
 | 
				
			||||||
 | 
					app/test/assets
 | 
				
			||||||
app/log.txt
 | 
					app/log.txt
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										20
									
								
								README.md
								
								
								
								
							
							
						
						
									
										20
									
								
								README.md
								
								
								
								
							| 
						 | 
					@ -129,6 +129,26 @@ We welcome feedback on EnglishPal.  Feedback examples:
 | 
				
			||||||
EnglishPal's bugs and improvement suggestions are recorded in [Bugzilla](http://118.25.96.118/bugzilla/buglist.cgi?bug_status=__all__&list_id=1302&order=Importance&product=EnglishPal&query_format=specific).  Send (lanhui at zjnu.edu.cn) an email message for opening a Bugzilla account or reporting a bug.
 | 
					EnglishPal's bugs and improvement suggestions are recorded in [Bugzilla](http://118.25.96.118/bugzilla/buglist.cgi?bug_status=__all__&list_id=1302&order=Importance&product=EnglishPal&query_format=specific).  Send (lanhui at zjnu.edu.cn) an email message for opening a Bugzilla account or reporting a bug.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## End-to-end testing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					We use the Selenium test framework to test our app.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In order to run the test, first we need to download a webdriver executable.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Microsoft Edge's webdriver can be downloaded from [microsoft-edge-tools-webdriver](https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/). Make sure the version we download matches the version of the web browser installed on our laptop.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					After extracting the downloaded zip file (e.g., edgedriver_win64.zip), rename msedgedriver.exe to MicrosoftWebDriver.exe.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Add MicrosoftWebDriver.exe's path to system's PATH variable.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Install the following dependencies too:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- pip install -U selenium==3.141.0
 | 
				
			||||||
 | 
					- pip install -U urllib3==1.26.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Run the test using pytest as follows: pytest --html=pytest_report.html test_add_word.py
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The above command will generate a HTML report file pytest_report.html after finishing executing test_add_word.py.  Note: you need to install pytest-html package first: pip install pytest-html.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## TODO
 | 
					## TODO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
import pytest
 | 
					import pytest
 | 
				
			||||||
 | 
					import sqlite3
 | 
				
			||||||
from selenium import webdriver
 | 
					from selenium import webdriver
 | 
				
			||||||
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@pytest.fixture
 | 
					@pytest.fixture
 | 
				
			||||||
def URL():
 | 
					def URL():
 | 
				
			||||||
| 
						 | 
					@ -9,8 +10,7 @@ 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
 | 
					    return webdriver.Edge()  # uncomment this line if you wish to run the test on your laptop
 | 
				
			||||||
    return my_driver
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@pytest.fixture
 | 
					@pytest.fixture
 | 
				
			||||||
| 
						 | 
					@ -21,3 +21,17 @@ def UNAME():
 | 
				
			||||||
@pytest.fixture
 | 
					@pytest.fixture
 | 
				
			||||||
def PASSWORD():
 | 
					def PASSWORD():
 | 
				
			||||||
    return 'l0ve1t'
 | 
					    return 'l0ve1t'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@pytest.fixture(autouse=True)
 | 
				
			||||||
 | 
					def restore_sqlite_database():
 | 
				
			||||||
 | 
					    '''
 | 
				
			||||||
 | 
					    Automatically restore SQLite database file app/db/wordfreqapp.db
 | 
				
			||||||
 | 
					    using SQL statements from app/static/wordfreqapp.sql
 | 
				
			||||||
 | 
					    '''
 | 
				
			||||||
 | 
					    con = sqlite3.connect('../db/wordfreqapp.db')
 | 
				
			||||||
 | 
					    with con:
 | 
				
			||||||
 | 
					        con.executescript('DROP TABLE IF EXISTS user;')
 | 
				
			||||||
 | 
					        con.executescript('DROP TABLE IF EXISTS article;')
 | 
				
			||||||
 | 
					        con.executescript(open('../static/wordfreqapp.sql', encoding='utf8').read())
 | 
				
			||||||
 | 
					    con.close()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,33 @@
 | 
				
			||||||
 | 
					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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    return username, password
 | 
				
			||||||
| 
						 | 
					@ -1,68 +1,23 @@
 | 
				
			||||||
# -*- coding: utf-8 -*-
 | 
					import time
 | 
				
			||||||
# Run the docker image using the following command:
 | 
					from helper import signup
 | 
				
			||||||
# docker run -d -p 4444:4444 selenium/standalone-chrome
 | 
					 | 
				
			||||||
from selenium import webdriver
 | 
					 | 
				
			||||||
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import random, time
 | 
					 | 
				
			||||||
import string
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
driver = webdriver.Remote('http://localhost:4444/wd/hub', DesiredCapabilities.FIREFOX)
 | 
					 | 
				
			||||||
driver.implicitly_wait(10)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
HOME_PAGE = 'http://121.4.94.30:91/'
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def has_punctuation(s):
 | 
					def test_add_word(URL, driver):
 | 
				
			||||||
    return [c for c in s if c in string.punctuation] != []
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
def test_add_word():
 | 
					 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
        driver.get(HOME_PAGE)
 | 
					        username, password = signup(URL, driver) # sign up a new account and automatically log in
 | 
				
			||||||
        assert 'English Pal -' in driver.page_source
 | 
					        time.sleep(1)
 | 
				
			||||||
    
 | 
					 | 
				
			||||||
        # login
 | 
					 | 
				
			||||||
        elem = driver.find_element_by_link_text('登录')
 | 
					 | 
				
			||||||
        elem.click()
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
        uname = 'lanhui'
 | 
					 | 
				
			||||||
        password = 'l0ve1t'
 | 
					 | 
				
			||||||
        elem = driver.find_element_by_name('username')
 | 
					 | 
				
			||||||
        elem.send_keys(uname)
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
        elem = driver.find_element_by_name('password')
 | 
					 | 
				
			||||||
        elem.send_keys(password)
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        elem = driver.find_element_by_xpath('//form[1]/p[3]/input[1]') # 找到登录按钮
 | 
					 | 
				
			||||||
        elem.click()
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
        assert 'EnglishPal Study Room for ' + uname in  driver.title
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
        # get essay content
 | 
					 | 
				
			||||||
        elem = driver.find_element_by_id('text-content')
 | 
					 | 
				
			||||||
        essay_content = elem.text
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # enter the word in the text area
 | 
				
			||||||
        elem = driver.find_element_by_id('selected-words')
 | 
					        elem = driver.find_element_by_id('selected-words')
 | 
				
			||||||
        word = random.choice(essay_content.split())
 | 
					        word = 'devour'
 | 
				
			||||||
        while 'font>' in word or 'br>' in word or 'p>' in word or len(word) < 6 or has_punctuation(word):
 | 
					 | 
				
			||||||
            word = random.choice(essay_content.split())
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        elem.send_keys(word)
 | 
					        elem.send_keys(word)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        elem = driver.find_element_by_xpath('//form[1]//input[1]') # 找到get所有词频按钮
 | 
					        elem = driver.find_element_by_xpath('//form[1]//button[1]') # 找到"把生词加入我的生词库"按钮
 | 
				
			||||||
        elem.click()
 | 
					        elem.click()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        elems = driver.find_elements_by_xpath("//input[@type='checkbox']")
 | 
					        elem = driver.find_element_by_name('add-btn') # 找到"加入我的生词簿"按钮
 | 
				
			||||||
        for elem in elems:
 | 
					 | 
				
			||||||
            if elem.get_attribute('name') == 'marked':
 | 
					 | 
				
			||||||
        elem.click()
 | 
					        elem.click()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        elem = driver.find_element_by_name('add-btn') # 找到加入我的生词簿按钮
 | 
					 | 
				
			||||||
        elem.click()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        driver.refresh()
 | 
					 | 
				
			||||||
        driver.refresh()
 | 
					 | 
				
			||||||
        driver.refresh()        
 | 
					 | 
				
			||||||
        elems = driver.find_elements_by_xpath("//p[@class='new-word']/a")
 | 
					        elems = driver.find_elements_by_xpath("//p[@class='new-word']/a")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        found = 0
 | 
					        found = 0
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue