自定义函数 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
我是 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