如何使我的变量全局化,以及如何使程序等到特定条件?

问题描述 投票:0回答:1

刚刚开始编写代码,所以我仍然很难理解一些东西。因此,我创建了一个脚本Nightmare,该脚本使用库进行自动测试,但是我不明白为什么我的变量value不是全局变量。

1]如何从“如果条件”中导出“ value”并在控制台中显示?现在,我得到的结果是1

2)如何推迟显示value变量,直到测试完成?我认为setTimeout function对此不利。

 const Nightmare = require('nightmare');
const nightmare = Nightmare({ show: true });
let value = '1';


nightmare
.goto('some-link-here')

.type('input#register-form-promo','111112')
.insert('input#register-form-username','Test')
.insert('input#register-form-email','[email protected]')
.insert('input#register-form-password','Password123456')
.evaluate(() => {
    var allButtons = document.getElementsByTagName('button');
    for (var i = 0; i < allButtons.length; i++) {
        if (allButtons[i].innerText == 'Зарегистрироваться') allButtons[i].id = 'loginbutton';
    }
})
.click('button[id=loginbutton]')
.evaluate(function (value) {
    var element =  document.getElementsByClassName('help-block')[3];
    if (element.innerHTML == "Значение «Promo» неверно.") {
        value = true;
    console.log(value) }
        else {
        value = false;
        console.log(value)
        }
    }
  )
.wait(1000)
.end()
.then(result => {

}); 
setTimeout(function (){

    console.log(value);

  }, 10000);
javascript node.js nightmare
1个回答
0
投票

您编写的代码是异步的。因此,如果您在setTime out中写入console.log(value),则您预计上述代码集将在10000毫秒内完成。这是错误的方法,因为如果操作花费超过10000毫秒会发生什么,您将无法在console.log中看到更新的值。因此,您应该在then()函数和[]之后添加另一个evaluate

 const Nightmare = require('nightmare');
 const nightmare = Nightmare({ show: true });
 let value = '1';
 nightmare
 .goto('some-link-here')
 .type('input#register-form-promo','111112')
 .insert('input#register-form-username','Test')
 .insert('input#register-form-email','[email protected]')
 .insert('input#register-form-password','Password123456')
 .evaluate(() => {
   var allButtons = document.getElementsByTagName('button');
   for (var i = 0; i < allButtons.length; i++) {
    if (allButtons[i].innerText == 'Зарегистрироваться') allButtons[i].id = 'loginbutton';
   }
  })
  .click('button[id=loginbutton]')
  .evaluate(function (value) {
    var element =  document.getElementsByClassName('help-block')[3];
    if (element.innerHTML == "Значение «Promo» неверно.") {
      value = true;
     }
     else {
       value = false;
     }
     return value
   })
  .then(value => {
    // do something here
    console.log(value)
   })
  .wait(1000)
  .end()
  .then(result => {

  }); 
© www.soinside.com 2019 - 2024. All rights reserved.