Javascript 在循环中使用条件
我是javascript和nightwatch js的新手 我正在尝试自动化一个在线测试,其中最多有4到5个随机生成的问题。每个问题都会进入一个新的页面,所以基本上你回答一个问题,提交它,然后在下一个问题上呈现 答案可以是不同的类型,有些是“是/否”按钮,有些是您单击的多项选择,有些是在文本字段中键入数据,然后您必须按键盘上的Enter键提交。幸运的是,用于这些类型答案中每一种的定位器总是相同的(不是动态生成的)。例如是/否问题,答案将始终为是。回答是或如果是文本字段,则始终为#回答框 我需要把这4到5个问题通读一遍,如果我答对了也没关系 我正在考虑使用一个for循环,在这里我检查我是否得到了我已经确定的这些元素中的一个,如果是的话,我执行操作并继续到下一页,直到问卷完成 我想到了下面的例子。我认为这是行不通的,因为javascript是异步的——我还没有完全理解Javascript 在循环中使用条件,javascript,loops,if-statement,asynchronous,nightwatch.js,Javascript,Loops,If Statement,Asynchronous,Nightwatch.js,我是javascript和nightwatch js的新手 我正在尝试自动化一个在线测试,其中最多有4到5个随机生成的问题。每个问题都会进入一个新的页面,所以基本上你回答一个问题,提交它,然后在下一个问题上呈现 答案可以是不同的类型,有些是“是/否”按钮,有些是您单击的多项选择,有些是在文本字段中键入数据,然后您必须按键盘上的Enter键提交。幸运的是,用于这些类型答案中每一种的定位器总是相同的(不是动态生成的)。例如是/否问题,答案将始终为是。回答是或如果是文本字段,则始终为#回答框 我需要把
for (i = 0; i < 10; i++) {
if (client.waitForElementVisible('.element1',1000)) {
client.click('.element1'); //This would select first answer
client.click('nextButton'); //This would continue to the next question
}
else if (client.waitForElementVisible('.element2',1000)) {
client.click('.element2'); //This would select first answer
client.click('nextButton'); //This would continue to the next question
}
else if (client.waitForElementVisible('.element3',1000)) {
client.click('.element3'); //This would select first answer
client.click('nextButton'); //This would continue to the next question
}
else if (client.waitForElementVisible('.element4',1000)) {
client.click('.element4'); //This would select first answer
client.click('nextButton'); //This would continue to the next question
}
else if (client.waitForElementVisible('.element5',1000)) { //element 5 would be the confirmation that test is over
client.click('.element5'); //this would click the OK button when notified test is done
leaveTheLoop(); //Not sure what would be the command to leave the loop
}
}
(i=0;i<10;i++)的
if(client.waitForElementVisible('.element1',1000)){
client.click('.element1');//这将选择第一个答案
client.click('nextButton');//这将继续下一个问题
}
else if(client.waitForElementVisible('.element2',1000)){
client.click('.element2');//这将选择第一个答案
client.click('nextButton');//这将继续下一个问题
}
else if(client.waitForElementVisible('.element3',1000)){
client.click('.element3');//这将选择第一个答案
client.click('nextButton');//这将继续下一个问题
}
else if(client.waitForElementVisible('.element4',1000)){
client.click('.element4');//这将选择第一个答案
client.click('nextButton');//这将继续下一个问题
}
否则,如果(client.waitForElementVisible('.element5',1000)){//element 5将确认测试已结束
click('.element5');//当通知的测试完成时,这将单击OK按钮
leveTheLoop();//不确定要退出循环的命令是什么
}
}
我还研究了javascript的Switch语句,但我认为我无法在表达式中编写一些东西来验证我所期望的任何元素是否都存在于一个表达式中。您可以继续链接
.waitForElementVisible(选择器、超时、中止失败、回调)
检查元素是否可见
通过将abortOnFailure
设置为false
,使整个测试不会失败,您可以继续进行元素2、3、4、5,即使元素1不可见
代码如下:
test(client){
client.waitForElementVisible('.element1',1000,false,function(){
client.click('.element1'); //This would select the first answer
.click('nextButton');
})
.waitForElementVisible('.element2',1000,false,function(){
client.click('.element2'); //This would select the second answer
.click('nextButton');
})
.waitForElementVisible('.element3',1000,false,function(){
client.click('.element3'); //This would select the third answer
.click('nextButton');
})
.waitForElementVisible('.element4',1000,false,function(){
client.click('.element4'); //This would select the forth answer
.click('nextButton');
})
.waitForElementVisible('.element5',1000,false,function(){
client.click('.element5'); //This would select the fifth answer
})
}
详细说明:
用法:
do{
test(client);
client.click('submit_or_whatevertothenextpage');
}while (client.except.to.not.be.visible(".result_element_non_existing"));
我用下面的代码解决了我的问题
嗨,谢谢你的回答。但我确实需要一个循环,因为问题和答案是随机生成的,所以我可能一次又一次地得到相同类型的答案。对于您的代码,一旦找到,它就会完成。更新了答案,但这是一种愚蠢的方式,因为您没有描述每次测试后的行为,所以只需将上面的代码转换为方法并重用它。
for (var i = 0; i < 15; i++) {
//If answer type is yes/no, do this
preTestPage.api.element('css selector', preTestPage.elements.yesAnswer.selector, function (result) {
if (result.value && result.value.ELEMENT) {
preTestPage.expect.element('@yesAnswer').to.be.visible.after(5000);
preTestPage.click('@yesAnswer');
preTestPage.api.pause(2000);
}
});
//If answer type is text input, do this
preTestPage.api.element('css selector', preTestPage.elements.textInputAnswer.selector, function (result) {
if (result.value && result.value.ELEMENT) {
preTestPage.setValue('@textInputAnswer',10);
preTestPage.api.keys(client.Keys.ENTER);
preTestPage.api.pause(2000);
}
});
//If answer type is multiple choise with submit button, do this
preTestPage.api.element('css selector', preTestPage.elements.submitAnswerButton.selector, function (result) {
if (result.value && result.value.ELEMENT) {
preTestPage.expect.element('@firstSubmitAnswer').to.be.visible.after(5000);
preTestPage.click('@firstSubmitAnswer');
client.pause(1500);
preTestPage.expect.element('@submitAnswerButton').to.be.enabled.after(5000);
preTestPage.click('@submitAnswerButton');
preTestPage.api.pause(2000);
}
});
//If answer type is multiple answer, do this
preTestPage.api.element('css selector', preTestPage.elements.firstMultipleAnswer.selector, function (result) {
if (result.value && result.value.ELEMENT) {
preTestPage.click('@firstMultipleAnswer');
preTestPage.api.pause(2000);
}
});
//If none of the above then is the end of the test so do this
preTestPage.api.element('css selector', preTestPage.elements.wellDoneButton.selector, function (result) {
if (result.value && result.value.ELEMENT) {
// Element is visible, do the appropriate tests
preTestPage.expect.element('@wellDoneButton').to.be.visible.after(5000);
preTestPage.click('@wellDoneButton');
preTestPage.api.pause(1000);
i = false;
console.log("i = " + i + "contador = " + contador);
return;
}
});
}
} },
var i = true;
var count = 0;
while (i) {
//If answer type is yes/no, do this
preTestPage.api.element('css selector', preTestPage.elements.yesAnswer.selector, function (result) {
if (result.value && result.value.ELEMENT) {
preTestPage.expect.element('@yesAnswer').to.be.visible.after(5000);
preTestPage.click('@yesAnswer');
preTestPage.api.pause(2000);
}
});
//If answer type is text input, do this
preTestPage.api.element('css selector', preTestPage.elements.textInputAnswer.selector, function (result) {
if (result.value && result.value.ELEMENT) {
preTestPage.setValue('@textInputAnswer',10);
preTestPage.api.keys(client.Keys.ENTER);
preTestPage.api.pause(2000);
}
});
//If answer type is multiple choise with submit button, do this
preTestPage.api.element('css selector', preTestPage.elements.submitAnswerButton.selector, function (result) {
if (result.value && result.value.ELEMENT) {
preTestPage.expect.element('@firstSubmitAnswer').to.be.visible.after(5000);
preTestPage.click('@firstSubmitAnswer');
client.pause(1500);
preTestPage.expect.element('@submitAnswerButton').to.be.enabled.after(5000);
preTestPage.click('@submitAnswerButton');
preTestPage.api.pause(2000);
}
});
//If answer type is multiple answer, do this
preTestPage.api.element('css selector', preTestPage.elements.firstMultipleAnswer.selector, function (result) {
if (result.value && result.value.ELEMENT) {
preTestPage.click('@firstMultipleAnswer');
preTestPage.api.pause(2000);
}
});
//If none of the above then is the end of the test so do this
preTestPage.api.element('css selector', preTestPage.elements.wellDoneButton.selector, function (result) {
if (result.value && result.value.ELEMENT) {
// Element is visible, do the appropriate tests
preTestPage.expect.element('@wellDoneButton').to.be.visible.after(5000);
preTestPage.click('@wellDoneButton');
preTestPage.api.pause(1000);
i = false;
console.log("i = " + i + "count = " + count);
return;
}
});
count++;
}