Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Nightwatch.js-如何在不重复代码的情况下通过多个链接并输入值?_Node.js_Selenium Webdriver_Nightwatch.js_Nightwatch - Fatal编程技术网

Node.js Nightwatch.js-如何在不重复代码的情况下通过多个链接并输入值?

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

我正在尝试创建一个将评估分数输入系统的工具。我目前有它的工作,但代码是非常重复。我有一个带有学生标记的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)
  }
}
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)