Node.js Nightwatch.js-如何在不重复代码的情况下通过多个链接并输入值?
我正在尝试创建一个将评估分数输入系统的工具。我目前有它的工作,但代码是非常重复。我有一个带有学生标记的JSON文件。然后,我循环遍历数据的长度,并将值输入到相应的输入中。完成后,我提交并进入下一个评估。如何减少重复的数量Node.js Nightwatch.js-如何在不重复代码的情况下通过多个链接并输入值?,node.js,selenium-webdriver,nightwatch.js,nightwatch,Node.js,Selenium Webdriver,Nightwatch.js,Nightwatch,我正在尝试创建一个将评估分数输入系统的工具。我目前有它的工作,但代码是非常重复。我有一个带有学生标记的JSON文件。然后,我循环遍历数据的长度,并将值输入到相应的输入中。完成后,我提交并进入下一个评估。如何减少重复的数量 const data = require('data.json') module.exports = { '@tags': ['Assessment'], 'Enter data for each page'(browser) { const courseAc
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)
}
}
const data=require('data.json'))
module.exports={
“@tags”:[“评估”],
“为每个页面输入数据”(浏览器){
const courseActionLink=
“#数据模型(DataModel)数据链接(u your assessment)数据(u 1)项目(u READYTOMARK)值”
const submitBtn='[aria label=“提交结果”]'
const nextAssessmentBtn='[aria label=“下一次评估”]'
const alertBtn=“#警报关闭”
for(设d=0;d
我发现重构有两个很好的机会:
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) for循环的唯一区别是从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)
}
}
您还可以调用
标记评估
中的单击按钮
,将单击下一步
作为第二个参数添加到标记评估
。从那里,您可以将成员名存储在一个数组中,并使用memberNameArray.forEach
为您完成大部分繁重的工作,这取决于您的需要,但此时只需要删除一些额外的行。第一个问题是您需要执行多少次?这是静态数字还是动态数字?如果它是一个静态数字,那么您可以尝试在while
循环中抛出您已经拥有的所有代码。如果数字是动态的,有没有办法通过其他方法返回该数字?
markAssessment('a1total')
clickButtons(true)
markAssessment('sbatotal')
clickButtons(true)
markAssessment('practicalstotal')
clickButtons(true)
markAssessment('a2total')
clickButtons(false)