2017-04-09 61 views
1

我有用F#編寫的硒UI測試(使用canopy硒nuget包)。我有一個模塊,它定義了選擇器和幫助器函數。模塊由測試模塊調用。在測試模塊中,我調用一個名爲'handlemobimodals()'的函數,該函數運行四個子函數(if/else代碼塊),用於查找頁面上是否存在元素並單擊它(如果存在)。爲什麼我在調用函數兩次時遇到了stackoverflow異常?

我面臨的問題是,當在測試中第二次調用'handlemobimodals()'函數時,我得到一個堆棧溢出異常(WebDriver進程由於StackOverflowException而終止)子函數被調用。

該函數第一次運行完全正常(在測試中早些時候間接從另一個函數間接調用),但在測試中直接調用時第二次失敗。我對F#非常陌生,並且我無法弄清楚我是如何在我的測試中導致遞歸的,因爲stackoverflow異常提示。

任何見解將不勝感激。

從頁面模塊段:

module some_page 

    let isOKGotItDisplayed() = 
     isDisplayed <| "div.action-button.dismiss-overlay" 

    let clickOKGotit() = 
     if isOKGotItDisplayed() = true then 
     click "OK, GOT IT" 
     describe "OK, Got It clicked" 
     else describe "Got nothing" 

    let isGoToSearchDisplayed() = 
     isDisplayed <| "button:contains('Go to Search')" 

    let clickGoToSearch() = 
     if isGoToSearchDisplayed() = true then 
     click "button:contains('Go to Search')" 
     describe "go search button clicked" 
     else describe "Got nothing" 

    let isSkipDisplayed() = 
     isDisplayed <| "#uploadPhotos > div.continue.skip" 

    let clickSkip() = 
     if isSkipDisplayed() = true then 
     click "Skip" 
     describe "Skip link clicked" 
     else describe "Got nothing" 

    let mobiOkayGotItDisplayed() = 
     isDisplayed <| "Okay, got it" 

    let mobiOKGotit() = 
     if mobiOkayGotItDisplayed() = true then 
     click "Okay, got it" 
     describe "Okay, got it" 
     else describe "Got nothing" 

    let handleMobiModals() = 
     clickSkip() 
     clickOKGotit() 
     clickGoToSearch() 
     mobiOKGotit() 


    loginForPathAs user = 
     username << "somename" 
     paswword << "somepassword" 
     handleMobiModals() 

片段從測試模塊(注意handleMobiModals函數被調用在LoginforPathAs功能,這是同一頁的定義模塊中定義的第一個實例) :

module_sometest 

open some_page 

     "Test 001: Log in and do something" &&& fun _ -> 
     newBrowser platform 
     loginForPathAs user1  
     displayed quicknoteSendButton 
     click quicknoteSendButton 
     handleMobiModals() 
     displayed "Subscribe" 

注意:爲了簡單和清晰起見,編輯片段。

+0

快速評論:當您檢查布爾函數的結果時,不需要'= true'。如果mobiOkayGotItDisplayed()= true,只需使用'if mobiOkayGotItDisplayed()'而不是''。 – rmunn

+0

@munn,因爲從語言的角度來看不需要'= true',有些團隊/開發人員更願意顯式地編寫預期條件,因爲在省略'= true'的情況下,代碼的可讀性將取決於描述性條件函數命名。 – Fabio

+0

@rmunn用'if'評估函數的結果(例如** mobiOkayGotItDisplayed()**)可能是真或假。 – codet3str

回答

0

此問題似乎已經解決。我相信我最近的Chrome自動更新解決了這個問題。

1

這不是一個直接的答案,但我相信這將有助於更容易地發現問題。我注意到有些東西讓調試這個問題有點困難。您正在從另一個函數調用多個函數,並從測試中調用這個單一函數。將這些功能分解爲單獨的測試並將測試更改爲WIP模式應該有助於明確您的問題。在一次測試中有很多可能的失敗點。例如,您可以在Canopy的上下文中使用before(fun _ - >這裏的一些函數)或者once(fun_ - >這裏的一些函數)來啓動一個新的瀏覽器並登錄,將該部分從測試中分離出來。

+0

感謝您的建議。我剛剛重新訪問了這個問題,似乎已經解決了。我相信Chrome的最新自動更新解決了這個問題 - 我確實儘可能地調試了代碼,所以我知道邏輯流程沒有任何問題(即沒有草草邏輯) 。 – codet3str

相關問題