Javascript 自定义函数,用于选择并单击Nightwatch中的随机元素

Javascript 自定义函数,用于选择并单击Nightwatch中的随机元素,javascript,testing,automated-tests,nightwatch.js,e2e-testing,Javascript,Testing,Automated Tests,Nightwatch.js,E2e Testing,我是e2e测试(和JS)的新手。我使用夜间监视框架 我试图创建一个函数,用同一个选择器从元素列表中选择一个随机元素,然后单击它 这就是我所尝试的: pickOne(selector, target) { this.api.elements(selector, target, function(res) { optionsLength = Math.floor((Math.random() * res.value.length) + 1); }); thi

我是e2e测试(和JS)的新手。我使用夜间监视框架

我试图创建一个函数,用同一个选择器从元素列表中选择一个随机元素,然后单击它

这就是我所尝试的:

  pickOne(selector, target) {
    this.api.elements(selector, target, function(res) {
       optionsLength = Math.floor((Math.random() * res.value.length) + 1);
    });
    this.api.waitForElementVisible(`${target}:nth-child(${optionsLength})`);
    this.api.click(`${target}:nth-child(${optionsLength}) .action-button`);
  }
但在这种情况下,
选项长度未定义

Math.floor((Math.random()*res.value.length)+1)
返回一个数字。我想在函数之外使用这个数字

我尝试将完整函数存储在变量中,如下所示:

const optionsLength = this.api.elements(selector, element, function(res) {
       Math.floor((Math.random() * res.value.length) + 1);
    });

但是那样的话,
optionsLength
记录的是一个数字。

用箭头语法声明函数并将所有内容包装到回调中解决了(范围)问题

箭头语法允许在回调中继续调用
this.api.x

  pickOne(selector, target) {
     this.api.elements(selector, target, res => {
        optionsLength = Math.floor((Math.random() * res.value.length) + 1);
        this.api.waitForElementVisible(`${target}:nth-child(${optionsLength})`);
        this.api.click(`${target}:nth-child(${optionsLength}) .action-button`);
    });
  }

}在回调中定义第二个和第三个函数不好,这会导致回调地狱

您应该改用
.perform()
api,它将链接您的函数:

pickOne(selector, target) {    
            this.api.elements(selector, target, function(res) {
               optionsLength = Math.floor((Math.random() * res.value.length) + 1);
            })
             .perform(function (client, done) {
                 console.log(optionsLength) ;// ***you can access optionsLength in above function***

                 done();
            })
我是夜视的医生

pickOne(selector, target) {    
            this.api.elements(selector, target, function(res) {
               optionsLength = Math.floor((Math.random() * res.value.length) + 1);
            })
             .perform(function (client, done) {
                 console.log(optionsLength) ;// ***you can access optionsLength in above function***

                 done();
            })