F#で書かれたセレンUIテスト(canopyセレンナゲットパッケージを使用)があります。私はページセレクタとヘルパー関数を定義するモジュールを持っています。 ページモジュールは、テストモジュールによって呼び出されます。テストモジュール内では、handlemobimodals()という関数を呼び出しています。これは4つのサブ関数(if/elseコードブロック)を実行して、ページ上の要素の存在を探し、それがあればそれをクリックします。関数を2回呼び出すときにstackoverflow例外が発生するのはなぜですか?
私が直面している問題は、テスト中に 'handlemobimodals()'関数が2回目に呼び出されたときに、スタックオーバーフロー例外(WebDriverプロセスがStackOverflowExceptionのために終了している)サブ関数が呼び出されます。
この関数は初めて完全に正常に実行されますが(テストの前の別の関数から間接的に呼び出されます)、テストで直接呼び出されたときに2回目に失敗します。私は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()**)はtrueまたはfalseです。 – codet3str