自定义函数 select 并在 Nightwatch 中点击一个随机元素

custom function to select and click a random element in Nightwatch

我是 e2e 测试(和 JS)的新手。我使用 Nightwatch 框架。

我正在尝试创建一个函数,该函数从具有相同选择器的元素列表中选择一个随机元素,然后单击它。

这是我试过的:

  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`);
  }

但在这种情况下,optionsLength is not defined

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

我试图将完整的函数存储在一个变量中,如:

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

但是那样 optionsLength 记录 [object Object] 而不是数字。

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

箭头语法允许在回调中继续调用 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`);
    });
  }
function postimgname() {
var date = new Date();
var str =$scope.data_user.user_id + "" +date.getFullYear() + "" + (date.getMonth() + 1) + "" + date.getDate() + "" +  date.getHours() + "" + date.getMinutes() + "" + date.getSeconds() 
+ "" + Math.floor(Math.random() * 6) + 1 ;
return str;

}

在回调中定义第二个和第三个函数是不好的,它会导致回调地狱。

您应该改用 .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();
            })

这是守夜人的文档Perform