我有用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"
注意:爲了簡單和清晰起見,編輯片段。
快速評論:當您檢查布爾函數的結果時,不需要'= true'。如果mobiOkayGotItDisplayed()= true,只需使用'if mobiOkayGotItDisplayed()'而不是''。 – rmunn
@munn,因爲從語言的角度來看不需要'= true',有些團隊/開發人員更願意顯式地編寫預期條件,因爲在省略'= true'的情況下,代碼的可讀性將取決於描述性條件函數命名。 – Fabio
@rmunn用'if'評估函數的結果(例如** mobiOkayGotItDisplayed()**)可能是真或假。 – codet3str