1
0
Fork 0

Compare commits

...

50 Commits

Author SHA1 Message Date
lixiaofeng e3db7c30b0 上传文件至 app/static/js 2024-05-28 19:55:38 +08:00
lixiaofeng 9f03cc49fa 上传文件至 app/static/js 2024-05-28 19:55:26 +08:00
lixiaofeng eed852cd66 上传文件至 app/templates 2024-05-28 19:55:07 +08:00
lixiaofeng c6f8a3448d 上传文件至 app/test 2024-05-28 19:54:46 +08:00
黄慧玲 d8af2a7e54 Merge pull request 'Bug545-HuangHuiLing' (#122) from Bug545-HuangHuiLing into Alpha-snapshot20230621
Reviewed-on: mrlan/EnglishPal#122
2024-05-28 13:36:01 +08:00
1994836463@qq.com a0c9b82ee7 参考了一下tangxinyuan小组的写法,将选取单词的方法由模拟鼠标选取单词改为根据id获取文章,随机从文章中挑选一个单词放入生词框中,这样是一定可以选取到文章中的单词。
然后根据span标签定位到选择的生词,双击再次选择,从而在生词框中删除该单词
2024-05-27 14:35:56 +08:00
1994836463@qq.com 4a42c5c22c 我又将tangxinyuan小组的测试代码改回去了,我改完我的测试代码之后,只有使用未经我修改的tangxinyuan小组的测试代码才能通过。 2024-05-27 14:26:54 +08:00
1994836463@qq.com 101c359596 我将tangxinyuan小组的测试文件改了一下,只是改了一下点击按钮的方法,将点击退出按钮,使用ActionChains去点击,因为我测试的时候,用driver去点击大部分会报出'退出'的按钮被浏览器拦截的错误, 2024-05-26 11:32:39 +08:00
1994836463@qq.com 64a82bee22 测试文件也进行了修改,为了避免选择的单词出现空格的情况,增加了一个判断,若选中空格,则更换文章再次选择,这样总会选择到非空格的单词。 2024-05-26 11:27:15 +08:00
1994836463@qq.com 9537024339 再次选择高亮单词,由于标记高亮单词的标签由<mark>改为了<span>,所以在取消单词高亮状态时将标签均改为了<span>,替换时的代码也冗余了,所以也进行了一部分删除。 2024-05-26 11:22:20 +08:00
1994836463@qq.com 85a3a9ce6a 这里的代码写多余了,删除了一部分 2024-05-26 11:19:28 +08:00
1994836463@qq.com f3b9fd8790 change 2024-05-25 15:24:49 +08:00
1994836463@qq.com 624426b6cf change 2024-05-25 15:20:31 +08:00
1994836463@qq.com d1589f6062 time.sleep(1) 2024-05-25 15:14:31 +08:00
1994836463@qq.com fcd2c83904 change 2024-05-25 12:03:37 +08:00
1994836463@qq.com 29a673cd92 change 2024-05-25 11:59:38 +08:00
1994836463@qq.com 1bec0bd107 Merge remote-tracking branch 'origin/Bug545-HuangHuiLing' into Bug545-HuangHuiLing 2024-05-21 20:35:38 +08:00
1994836463@qq.com 630cb6befa delete 2024-05-21 20:34:28 +08:00
黄慧玲 5dbdf60a2c Merge branch 'Alpha-snapshot20230621' into Bug545-HuangHuiLing 2024-05-21 20:02:08 +08:00
1994836463@qq.com 101506a511 test and fix 2024-05-21 20:00:32 +08:00
丁晟晔 d8e4fbbb2d Merge pull request 'Bug551-DingZeYu' (#114) from Bug551-DingZeYu into Alpha-snapshot20230621
Reviewed-on: mrlan/EnglishPal#114
2024-05-20 16:12:25 +08:00
1994836463@qq.com 9b3551bbc8 fix 2024-05-20 15:30:38 +08:00
1994836463@qq.com 90ac789bb4 Merge remote-tracking branch 'origin/Bug545-HuangHuiLing' into Bug545-HuangHuiLing
# Conflicts:
#	app/static/js/fillword.js
#	app/static/js/highlight.js
2024-05-20 15:26:30 +08:00
1994836463@qq.com 8575a0dc33 fix 2024-05-20 15:25:34 +08:00
黄慧玲 3373ba1429 Merge pull request 'Bug545-HuangHuiLing' (#120) from Bug545-HuangHuiLing into Alpha-snapshot20230621
Reviewed-on: mrlan/EnglishPal#120
2024-05-20 15:16:09 +08:00
黄慧玲 d296580b3b Merge branch 'Alpha-snapshot20230621' into Bug545-HuangHuiLing 2024-05-20 15:13:50 +08:00
Lan Hui a4db1edffb Close the web browswer after finishing each test case 2024-05-20 13:28:23 +08:00
丁晟晔 49ead93bcb 更新 app/test/test_bug551_DingZeYu.py 2024-05-20 08:24:36 +08:00
丁晟晔 9afd38a09a 更新 app/test/test_bug551_DingZeYu.py 2024-05-20 08:21:02 +08:00
丁晟晔 d97743649a 更新 app/test/test_bug551_DingZeYu.py 2024-05-19 22:51:32 +08:00
丁晟晔 9f6a007426 更新 app/test/test_bug551_DingZeYu.py 2024-05-19 21:21:25 +08:00
丁晟晔 7fe3feae9a 更新 app/test/test_bug551_DingZeYu.py 2024-05-18 09:23:36 +08:00
丁晟晔 b2a53a0e40 更新 app/test/test_bug551_DingZeYu.py 2024-05-18 09:18:22 +08:00
丁晟晔 0301c39cf0 更新 app/test/test_bug551_DingZeYu.py 2024-05-18 09:14:05 +08:00
丁晟晔 5857395251 更新 app/test/test_bug551_DingZeYu.py 2024-05-18 09:08:10 +08:00
丁晟晔 77ed63441b 更新 app/static/css/bootstrap.css 2024-05-14 23:26:53 +08:00
丁晟晔 b19eabd225 更新 app/static/config.yml 2024-05-14 23:26:11 +08:00
丁晟晔 b9d0ad4a15 上传文件至 app/static/css 2024-05-14 23:24:26 +08:00
丁晟晔 aca827a912 更新 app/static/css/bootstrap.css 2024-05-14 23:24:06 +08:00
丁晟晔 23f0dfd8ca 更新 app/test/test_bug551_DingZeYu.py
我这边好像没有helper文件所以我直接判断有没有这个账号,如果没有就注册一个来进行测试。这样子可以吗
2024-05-12 13:39:14 +08:00
丁晟晔 6ee94d1610 上传文件至 app/test 2024-05-06 11:48:19 +08:00
丁晟晔 416f40222e 删除 app/test/test_bug551_DingZeYu.py 2024-05-06 11:46:39 +08:00
丁晟晔 66f5c28ead 上传文件至 app/test 2024-05-06 11:46:15 +08:00
丁晟晔 ff6286cf01 删除 app/test/test_bug551_DingZeYu.py 2024-05-06 11:42:32 +08:00
丁晟晔 1d7e61d751 上传文件至 app/test 2024-05-06 11:36:36 +08:00
丁晟晔 c9c0ef60d8 Merge branch 'Alpha-snapshot20230621' into Bug551-DingZeYu 2024-05-06 11:34:44 +08:00
丁晟晔 393264a6fe 更新 app/static/js/highlight.js 2024-04-19 10:51:18 +08:00
丁晟晔 d5c76674da 更新 app/static/css/bootstrap.css 2024-04-19 10:50:43 +08:00
丁晟晔 b8222c951b revert 4120e7e54b
revert Fix bug 551
2024-04-19 10:49:41 +08:00
dingchengye 4120e7e54b Fix bug 551 2024-04-19 10:06:48 +08:00
9 changed files with 160 additions and 15 deletions

View File

@ -2,7 +2,7 @@
css: css:
item: item:
- ../static/css/bootstrap.css - ../static/css/bootstrap.css
- ../static/css/highlighted.css
# 全局引入的js文件地址 # 全局引入的js文件地址
js: js:
head: # 在页面加载之前加载 head: # 在页面加载之前加载

View File

@ -0,0 +1,5 @@
.highlighted {
color: red;
font-weight: normal;
}

View File

@ -1,4 +1,3 @@
// initialize from localStorage
let isRead = localStorage.getItem('readChecked') !== 'false'; // default to true let isRead = localStorage.getItem('readChecked') !== 'false'; // default to true
let isChoose = localStorage.getItem('chooseChecked') !== 'false'; let isChoose = localStorage.getItem('chooseChecked') !== 'false';
@ -9,8 +8,15 @@ function getWord() {
function fillInWord() { function fillInWord() {
let word = getWord(); let word = getWord();
if (isRead) Reader.read(word, inputSlider.value); if (isRead) Reader.read(word, inputSlider.value);
if (!isChoose) return; if (!isChoose) {
if(isHighlight){
const element = document.getElementById("selected-words3");
element.value = element.value + " " + word;
}
return;
}
const element = document.getElementById("selected-words"); const element = document.getElementById("selected-words");
localStorage.setItem('nowWords', element.value);
element.value = element.value + " " + word; element.value = element.value + " " + word;
localStorage.setItem('selectedWords', element.value); localStorage.setItem('selectedWords', element.value);
} }
@ -38,3 +44,4 @@ function onChooseClick() {
if (performance.getEntriesByType("navigation")[0].type == "reload") { if (performance.getEntriesByType("navigation")[0].type == "reload") {
Reader.stopRead(); Reader.stopRead();
} }

View File

@ -22,38 +22,48 @@ function getWord() {
function highLight() { function highLight() {
if (!isHighlight) return; if (!isHighlight) return;
let word = (getWord() + "").trim();
let articleContent = document.getElementById("article").innerHTML; // innerHTML保留HTML标签来保持部分格式且适配不同的浏览器 let articleContent = document.getElementById("article").innerHTML; // innerHTML保留HTML标签来保持部分格式且适配不同的浏览器
let pickedWords = document.getElementById("selected-words"); // words picked to the text area let pickedWords = document.getElementById("selected-words"); // words picked to the text area
let dictionaryWords = document.getElementById("selected-words2"); // words appearing in the user's new words list let dictionaryWords = document.getElementById("selected-words2"); // words appearing in the user's new words list
let allWords = dictionaryWords === null ? pickedWords.value + " " : pickedWords.value + " " + dictionaryWords.value; let allWords = dictionaryWords === null ? pickedWords.value + " " : pickedWords.value + " " + dictionaryWords.value;
highlightWords = document.getElementById("selected-words3");
allWords = highlightWords == null ? allWords : allWords + " " + highlightWords.value;
const list = allWords.split(" "); // 将所有的生词放入一个list中 const list = allWords.split(" "); // 将所有的生词放入一个list中
if(word !== null && word !== "" && word !== " "){
let articleContent_fb2 = articleContent;
if(localStorage.getItem("nowWords").indexOf(word) !== -1 || localStorage.getItem("nowWords").indexOf(word.toLowerCase()) !== -1){
articleContent = articleContent.replace(new RegExp('<span class="highlighted">' + word + '</span>', "gi"), word);
pickedWords.value = localStorage.getItem("nowWords").replace(word,"");
document.getElementById("article").innerHTML = articleContent;
return;
}
}
let totalSet = new Set(); let totalSet = new Set();
for (let i = 0; i < list.length; ++i) { for (let i = 0; i < list.length; ++i) {
list[i] = list[i].replace(/(^\W*)|(\W*$)/g, ""); // 消除单词两边的非单词字符 list[i] = list[i].replace(/(^\W*)|(\W*$)/g, ""); // 消除单词两边的非单词字符
list[i] = list[i].replace('|', "");
list[i] = list[i].replace('?', "");
if (list[i] != "" && !totalSet.has(list[i])) { if (list[i] != "" && !totalSet.has(list[i])) {
// 返回所有匹配单词的集合, 正则表达式RegExp()中, "\b"匹配一个单词的边界, g 表示全局匹配, i 表示对大小写不敏感。 // 返回所有匹配单词的集合, 正则表达式RegExp()中, "\b"匹配一个单词的边界, g 表示全局匹配, i 表示对大小写不敏感。
let matches = new Set(articleContent.match(new RegExp("\\b" + list[i] + "\\b", "gi"))); let matches = new Set(articleContent.match(new RegExp("\\b" + list[i] + "\\b", "gi")));
if (matches.has("mark")) {
// 优先处理单词为 "mark" 的情况
totalSet = new Set(["mark", ...totalSet]);
}
totalSet = new Set([...totalSet, ...matches]); totalSet = new Set([...totalSet, ...matches]);
} }
} }
// 删除所有的mark标签,防止标签发生嵌套 // 删除所有的"<span class='highlighted'>"标签,防止标签发生嵌套
articleContent = articleContent.replace(/<(mark)[^>]*>/gi, ""); articleContent = articleContent.replace(new RegExp('<span class="highlighted">',"gi"), "")
articleContent = articleContent.replace(/<(\/mark)[^>]*>/gi, ""); articleContent = articleContent.replace(new RegExp("</span>","gi"), "");
// 将文章中所有出现该单词word的地方改为"<mark>" + word + "<mark>"。 // 将文章中所有出现该单词word的地方改为"<span class='highlighted'>" + word + "</span>"。
for (let word of totalSet) { for (let word of totalSet) {
articleContent = articleContent.replace(new RegExp("\\b" + word + "\\b", "g"), "<mark>" + word + "</mark>"); articleContent = articleContent.replace(new RegExp("\\b" + word + "\\b", "g"), "<span class='highlighted'>" + word + "</span>");
} }
document.getElementById("article").innerHTML = articleContent; document.getElementById("article").innerHTML = articleContent;
} }
function cancelHighlighting() { function cancelHighlighting() {
let articleContent = document.getElementById("article").innerHTML; let articleContent = document.getElementById("article").innerHTML;
articleContent = articleContent.replace(/<(mark)[^>]*>/gi, ""); articleContent = articleContent.replace(new RegExp('<span class="highlighted">',"gi"), "")
articleContent = articleContent.replace(/<(\/mark)[^>]*>/gi, ""); articleContent = articleContent.replace(new RegExp("</span>","gi"), "");
document.getElementById("article").innerHTML = articleContent; document.getElementById("article").innerHTML = articleContent;
} }

View File

@ -166,6 +166,7 @@
<input id="selected-words2" type="hidden" value="{{ words }}"> <input id="selected-words2" type="hidden" value="{{ words }}">
{% endif %} {% endif %}
</div> </div>
<label id="selected-words3" type="hidden"></label>
{{ yml['footer'] | safe }} {{ yml['footer'] | safe }}
{% if yml['js']['bottom'] %} {% if yml['js']['bottom'] %}
{% for js in yml['js']['bottom'] %} {% for js in yml['js']['bottom'] %}
@ -291,7 +292,7 @@
</body> </body>
<style> <style>
mark { mark {
color: #{{ yml['highlight']['color'] }}; color: red;
background-color: rgba(0, 0, 0, 0); background-color: rgba(0, 0, 0, 0);
} }
</style> </style>

View File

@ -1,5 +1,7 @@
import random import random
import string import string
import time
from selenium.webdriver.common.by import By from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support import expected_conditions as EC

View File

@ -0,0 +1,44 @@
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 selenium.webdriver.common.action_chains import ActionChains
from helper import signup
def has_punctuation(s):
return any(c in string.punctuation for c in s)
def select_one(driver):
elem = driver.find_element(By.ID, 'article')
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)
driver.find_element(By.ID, 'article').click()
return valid_word
def select_two(driver):
word = driver.find_element(By.CLASS_NAME, 'highlighted')
# 创建ActionChains对象
actions = ActionChains(driver)
actions.move_to_element(word)
# 模拟鼠标按下并拖动以选择文本
actions.double_click()
actions.perform()
def test_selected_second_word(driver, URL):
try:
signup(URL, driver)
selected_words = select_one(driver);
assert selected_words.strip() != "", "选中的单词被放置框中"
select_two(driver)
selected_second_words = driver.find_element(By.ID, 'selected-words').get_attribute('value')
assert selected_second_words.strip() == "", "选中的单词被删除"
finally:
driver.quit()

View File

@ -0,0 +1,39 @@
from selenium.webdriver.common.action_chains import ActionChains
from helper import signup
def test_highlight(driver, URL):
try:
# 打开网页
driver.get(URL)
driver.maximize_window()
# 注册
signup(URL, driver)
# 取消勾选“划词入库按钮”
highlight_checkbox = driver.find_element_by_id("chooseCheckbox")
driver.execute_script("arguments[0].click();", highlight_checkbox)
article = driver.find_element_by_id("article")
# 创建 ActionChains 对象
actions = ActionChains(driver)
# 移动鼠标到起点位置
actions.move_to_element(article)
# actions.move_to_element_with_offset(article, 50, 100)
# 按下鼠标左键
actions.click_and_hold()
# 拖动鼠标到结束位置
actions.move_by_offset(400,50)
# 释放鼠标左键
actions.release()
# 执行操作链
actions.perform()
# time.sleep(10)
assert driver.find_elements_by_class_name("highlighted") is not None
finally:
# 测试结束后关闭浏览器
driver.quit()

View File

@ -0,0 +1,37 @@
import time
import pytest
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.common.alert import Alert
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from helper import signup
def test_bug551(driver, URL):
driver.maximize_window()
driver.get(URL)
username, password = signup(URL, driver)
article = driver.find_element(By.ID, 'article')
actions = ActionChains(driver)
actions.move_to_element(article)
actions.click_and_hold()
actions.move_by_offset(450, 200)
actions.release()
actions.perform()
# 获取选中高亮部分的单词的元素
highlighted_words = driver.find_elements(By.CLASS_NAME, 'highlighted')
# 验证选中部分的单词是否同时应用了需求样式
expected_font_weight = "400"
for word in highlighted_words:
font_weight = word.value_of_css_property("font-weight")
assert font_weight == expected_font_weight, f"选中部分的单词的字体样式错误"
time.sleep(5)
driver.quit()