2016-03-29 32 views
2

我需要一個像while()這樣的重複塊來驗證執行前的條件。我的代碼如下,但一段時間不工作...循環與量角器中的開始處的條件

var foundPersonen = true; 

     while (foundPersonen) { 
     detailPage.getAllPersonen().then(function(value) { 
      if (value.length == 0) { 
      foundPersonen = true; 
      remoteControl(Keys.HK_BACK); 
      remoteControl(Keys.HK_P_up); 
      remoteControl(Keys.HK_INFO, 1, 3000); 
      } 
      else { 
      foundPersonen = false; 
      } 
     }); 
     } 

我該如何更換,但仍然有我需要的結果?

+0

這是什麼語言?它似乎是C#。這個問題有點不清楚; 「一段時間不工作」的意思是什麼? – Codor

+0

這是javascript - 量角器工具。我認爲量角器沒有while循環,所以它需要類似的東西來解決我的問題。我想重複該塊,直到我的布爾條件變爲false,然後停止。如果我使用這段時間,我的測試甚至沒有開始,我得到的瀏覽器,但頁面不加載,然後它失敗,並出現一個奇怪的消息:<---最後幾次GC ---> 189098 ms:標記掃描1270.6(1457.6) - > 1270.6(1457.6)MB,2569.1/0 ms [al 位置故障] [請求的舊空間中的GC]。 192186 ms:標記掃描1270.6(1457.6) - > 1270.6(1457.6)MB,3087.6/0 ms [ –

回答

0

我認爲你可以browser.wait()解決這個問題:

browser.wait(function() { 
    return detailPage.getAllPersonen().count().then(function (count) { 
     if (count == 0) { 
      remoteControl(Keys.HK_BACK); 
      remoteControl(Keys.HK_P_up); 
      remoteControl(Keys.HK_INFO, 1, 3000); 
      return false; 
     } 
     else { 
      return true; 
     } 
    } 
}, 10000); 

而計數爲0如果是0將執行條件功能可達10秒,它執行遠程控制功能。請測試。

+0

謝謝,但這並不能解決我的問題。我需要從(count == 0)開始重複該塊,從那裏開始的所有動作,直到(count!= 0)。 –

+0

@ oc.bara'browser.wait()'將持續執行該函數,直到其計算結果爲true或發生超時。如果你嘗試了會發生什麼? – alecxe

1

是的,因爲量角器不斷將所有內容添加到控制流中,像while這樣的塊不能按預期工作。嘗試在函數中遞歸調用它。

function keepChecking(){ while (foundPersonen) { detailPage.getAllPersonen().then(function(value) { if (value.length == 0) { foundPersonen = true; remoteControl(Keys.HK_BACK); remoteControl(Keys.HK_P_up); remoteControl(Keys.HK_INFO, 1, 3000); keepchecking(); } else { foundPersonen = false; } }); } } keepchecking();

+0

我試過這個,但它仍然不起作用...我得到同樣的錯誤。 –

2

我同意alecxe至少部分。一些「等待」訂單應該解決這個問題。我只想解釋我的想法,希望它對你有用......因爲我在這類問題上花了很多時間^^。

對我來說最重要的是量角器異步運行一切。 當您運行測試時,Protractor基本上會運行您的代碼的每個部分,即直到它遇到承諾。當它遇到一個承諾,量角器可以做兩件事情,這取決於你是否已設定browser.ignoreSynchronization = true;(這是我的情況)

  1. 如果這是真的,量角器創建一個新線程,並等待承諾解決,但在「主線程」量角器繼續執行您的代碼。如果你想要量角器等待某件事,你必須明確寫出它。
  2. 如果它是假的(默認情況下是這種情況),量角器將在繼續之前添加一個browser.waitForAngular。但是,當然你可以在你的代碼中添加顯式的等待命令,並且在某些情況下你可能想要得到更穩定的代碼。

如果您想了解更多相關信息,請閱讀this post

var foundPersonen = true; 
     while (foundPersonen){ 
      detailPage.getAllPersonen().then(function(value) { 
      if (value.length == 0) { 
       foundPersonen = true; 
       remoteControl(Keys.HK_BACK); 
       remoteControl(Keys.HK_P_up); 
       remoteControl(Keys.HK_INFO, 1, 3000); 
      } 
      else { 
       foundPersonen = false; 
      }    
     } 

在我的情況(browser.ignoreSynchronization = true;),這是發生了什麼:

  1. 分配的內存中的一個位的布爾和將該值設置爲1;
  2. 評估位
  3. 如果是1

    創建一個線程。在這個線程,創建一個承諾,等待它來解決,然後做一些與承諾

    在主線程的值,回到步驟2

  4. 如果是0,則繼續

這個解釋導致了一個簡單的預測。因爲將布爾值設置爲0的代碼在之後被處理爲該承諾被解決,所以這段代碼將盡可能快地創建承諾直到這些承諾中的一個將被解析並將布爾值設置爲假

這樣的結果呢?在第一個承諾將被解決之前,您的代碼將達到最大內存。 - >你會收到一些與內存分配有關的異常。

我測試了一下這個代碼:

return scenariiSteps.AtlasLogin("my", "credentials") 
    .then(function() { 

     var foundDialogs = element.all(by.xpath("//div[@dialog-id]")); 
     var foundDialogsZero = true; 
     while (foundDialogs) { 
      foundDialogs.count().then(function (value) { 
       if (value == 0) { 
        foundDialogsZero = true; 
        console.log("0, man") 
       } 
       else { 
        console.log("Found something!") 
        foundDialogsZero = false; 
       } 
      }); 
     } 
    }); 

這段代碼做的是

  1. 登錄
  2. 分配內存對於一些對象(將股票在網頁對話框的列表我的應用程序)
  3. 爲布爾值分配一位內存並將其設置爲false。
  4. 評估位
  5. 如果是1

    創建一個承諾,等待它來解決,然後做一些與承諾

    返回步驟的價值4

而且,爲了確保我的解釋離子,請注意,我的應用程序包含2個對話一旦用戶登錄。

,因爲我以爲,我收到FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory

「好吧,謝謝你這麼長時間的解釋,但是......應該是什麼我現在做的 ?」

基本上,你必須告訴量角器等待一些條件,然後再執行你想要的動作。最好的辦法取決於你的要求和你的環境。例如,我不認爲alecxe的解決方案可以解決我的環境中的問題。

如果您想獲得更多幫助,瞭解更多關於您想要做什麼的信息會更有幫助。

+0

好的,非常感謝,這裏是我想要做的事情:我有一個電視頁面 - >選擇去一個頻道。到那裏後,通過我的特定CSS獲取所有元素。如果至少有一個包含該CSS的元素,則執行一些操作,如果不是,則返回上一頁的主菜單並移至另一個通道。 –

+0

好的我只是找不到在評論中編寫代碼的正確方法,但是...您對此有何看法?我喜歡遞歸函數,但是您必須絕對確定至少有一個「好」通道。但是,您仍然可以在evaluteChannel中添加一些條件。 'VAR evaluateChannel =函數(){' \t'(去一些信道)' \t'element.all(by.css( '標識符'))。COUNT()。然後(函數(值){ ' \t \t'如果(值=== 0){' \t \t \t'evaluateChannel();' \t \t'}' \t \t'否則{' \t \t \t'的console.log( 「Yihaaaa」)' \t \t'}' \t'})' '}' –