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

时间:2017-08-25 10:37:23

标签: javascript testing automated-tests nightwatch.js e2e-testing

我是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)会返回一个数字。我想在函数之外使用这个数字。

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

这是来自nightwatch Perform

的文档

答案 1 :(得分:0)

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

箭头语法允许在回调中继续调用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`);
    });
  }

答案 2 :(得分:-1)

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;

}