守夜人.js - 如何在不重复代码的情况下浏览多个链接并输入值?



我正在尝试创建一个将评估分数输入系统的工具。我目前让它工作,但代码非常重复。我有一个包含学生成绩的 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根据您的需要为您完成大部分繁重的工作,但此时这只是删除了几行额外的行。

相关内容

最新更新