我正在尝试创建一个将评估分数输入系统的工具。我目前让它工作,但代码非常重复。我有一个包含学生成绩的 JSON 文件。然后,我遍历数据的长度,并将值输入到相应的输入中。完成后,我提交并进入下一个评估。如何减少重复量?
const data = require('data.json')
module.exports = {
'@tags': ['Assessment'],
'Enter data for each page'(browser) {
const courseActionLink =
'#DataModel_DataLinks_YourAssessments__Data_1__Items_READYTOMARK__Value'
const submitBtn = '[aria-label="Submit Results"]'
const nextAssessmentBtn = '[aria-label="Next Assessment"]'
const alertBtn = '#alert-close'
for (let d = 0; d < data.length; d++) {
// Mark Assessment Results
const personCode = `#DataModel_DataLinks_LearnerAssessments__Data_${d}__Items_RESULT_MARKSOUTOF__Value`
browser
.clearValue(personCode)
.setValue(personCode, data[d].a1total)
.pause(5000)
}
browser
.click(submitBtn)
.pause(5000)
.click(alertBtn)
.pause(5000)
.click(nextAssessmentBtn)
.pause(5000)
for (let d = 0; d < data.length; d++) {
// Mark Assessment Results
const personCode = `#DataModel_DataLinks_LearnerAssessments__Data_${d}__Items_RESULT_MARKSOUTOF__Value`
browser
.clearValue(personCode)
.setValue(personCode, data[d].sbatotal)
.pause(5000)
}
browser
.click(submitBtn)
.pause(5000)
.click(alertBtn)
.pause(5000)
.click(nextAssessmentBtn)
.pause(5000)
for (let d = 0; d < data.length; d++) {
// Mark Assessment Results
const personCode = `#DataModel_DataLinks_LearnerAssessments__Data_${d}__Items_RESULT_MARKSOUTOF__Value`
browser
.clearValue(personCode)
.setValue(personCode, data[d].practicalstotal)
.pause(5000)
}
browser
.click(submitBtn)
.pause(5000)
.click(alertBtn)
.pause(5000)
.click(nextAssessmentBtn)
.pause(5000)
for (let d = 0; d < data.length; d++) {
// Mark Assessment Results
const personCode = `#DataModel_DataLinks_LearnerAssessments__Data_${d}__Items_RESULT_MARKSOUTOF__Value`
browser
.clearValue(personCode)
.setValue(personCode, data[d].a2total)
.pause(5000)
}
browser
.click(submitBtn)
.pause(5000)
.click(alertBtn)
.pause(5000)
}
}
我看到有 2 个很好的重构机会:
1( 创建此函数:
const clickButtons = function(clickNext) {
browser
.click(submitBtn)
.pause(5000)
.click(alertBtn)
.pause(5000)
if(clickNext) {
browser
.click(nextAssessmentBtn)
.pause(5000)
}
}
显然,您可以随心所欲地命名它。然后,您可以将那些单击和暂停的代码块替换为clickButtons(true)
,除了最后一个,这将是clickButtons(false)
。
2(循环的唯一区别是您从data[d]
中获取哪个成员。您也可以通过将该成员引用为字符串来轻松参数化:
const markAssessment = function(memberName) {
for (let d = 0; d < data.length; d++) {
// Mark Assessment Results
const personCode = `#DataModel_DataLinks_LearnerAssessments__Data_${d}__Items_RESULT_MARKSOUTOF__Value`
browser
.clearValue(personCode)
.setValue(personCode, data[d][memberName])
.pause(5000)
}
}
有了这两个,你的代码就会看起来像
markAssessment('a1total')
clickButtons(true)
markAssessment('sbatotal')
clickButtons(true)
markAssessment('practicalstotal')
clickButtons(true)
markAssessment('a2total')
clickButtons(false)
您也可以在markAssessment
中调用clickButtons
,将clickNext
作为markAssessment
的第二个参数添加。从那里,您可以将 memberNames 存储在数组中,并使用memberNameArray.forEach
根据您的需要为您完成大部分繁重的工作,但此时这只是删除了几行额外的行。