javascript - 如何使我的变量成为全局变量以及如何使程序等待特定条件?

标签 javascript node.js nightmare

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

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

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

 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','kodjima33@gmail.com')
.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);

最佳答案

您编写的代码是异步的。因此,如果您将 console.log(value) 写入 setTime out 内,您将预测上述代码集将在 10000 毫秒内完成。这是一种错误的方法,因为如果操作花费的时间超过 10000 毫秒,您将无法在 console.log 中看到更新的值。因此,您应该在 evaluate 函数和

之后添加另一个 then()
 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','kodjima33@gmail.com')
 .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;
     }
     // a new function
     doSomething(value)
   })
  .wait(1000)
  .end()
  .then(result => {

  }); 

  function doSomething(value) {
    console.log(value)
  }

关于javascript - 如何使我的变量成为全局变量以及如何使程序等待特定条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58673020/

相关文章:

javascript - 请求的资源 : Mean stack 上不存在 'Access-Control-Allow-Origin' header

javascript - foreach 对象和异步函数

javascript - 字母 "pyramid"

linux - Nightmare js 在 Linux 服务器上只运行一次

javascript - jquery提交和button提交的区别

JavaScript 行为重用 : What side effects will this approach have?

javascript - Node Express Passport 应用程序尝试登录时出现 404ing

node.js - 阻止客户端发送消息socket.io

javascript - 在 NightmareJS 实例中保留 cookie

javascript - Nightmare 测试 click() 选择器