我是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]
而不是数字。
答案 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;
}