2017-08-17 47 views
2

我是javascript和nightwatch js的新手。在循環中使用條件

我試圖自動化一個在線測試,其中最多有4到5個問題是隨機生成的。每個問題都會出現在新的頁面上,所以基本上你會回答一個問題,提交它,然後再呈現下一個問題。

答案可以是不同的類型,其中一些是YES/NO按鈕,其中一些是您單擊的多項選擇,其中一些是將數據輸入到文本字段中,然後您必須通過按在鍵盤上輸入鍵。幸運的是,用於這些類型答案的每一個的定位符總是相同的(不是動態生成的)。例如。是/否問題,是的答案將始終是.answer是或者如果它的文本字段將始終是#answerBox。

我需要通過4或5個問題,如果我正確回答它們並不重要。

我在考慮使用for循環來檢查我是否已經識別出這些元素之一,如果是這樣,我會執行操作並繼續下一頁,直到問卷完成。

我想到下面的例子。我不認爲這將工作,因爲JavaScript是異步的 - 我還沒有完全理解。

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 
    } 
} 

我也看着switch語句的JavaScript,但我不認爲我可以在表達寫東西,如果任何我期待的元素將出現在所有的一個表達,將驗證。

回答

3

您可以繼續鏈接 .waitForElementVisible(selector,timeout,abortOnFailure,callback)檢查元素是否可見。

通過將abortOnFailure設置爲false,這樣整個測試不會失敗,並且您可以繼續使用元素2,3,4,5,即使element1不可見。

下面是代碼:

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

詳細說明: http://nightwatchjs.org/api/#waitForElementVisible

用法:

do{ 
    test(client); 
    client.click('submit_or_whatevertothenextpage'); 
}while (client.except.to.not.be.visible(".result_element_non_existing")); 
+0

您好,感謝回答。但我確實需要一個循環,因爲問題和答案是隨機生成的,所以我可能會一遍又一遍地得到相同類型的答案。使用你的代碼,一旦發現,它會完成。 – Sparda2

+0

更新了答案,但有點愚蠢的做法,因爲您沒有在每次測試後描述行爲,所以只需將上面的代碼轉換爲方法並重用它。 – Raymond

0

我種解決我的問題與下面的代碼。

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; 

    } 
    }); 

    } 


} }, 

現在的問題是,由於IM不知道有多少問題,總共有它似乎是nightwatch JS(或node.js的林不知道)繼續for循環不甚理想在我的循環中運行所有的迭代,即使我在最後一個屏幕出現時放置一箇中斷。所以我的測試掛起並保持在那裏,直到for循環完成後臺檢查所有答案,直到我設置的迭代次數。

有人建議使用while(true),但現在的問題是,由於某種原因node.js掛起,它似乎即時在這裏做一個無限循環,所以它完全崩潰。我懷疑我的休息;命令在這裏沒有做任何事情。我在這裏做錯了什麼?

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++; 

    }