2017-04-09 14 views
1

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" 

注:スニペットは、わかりやすくするために編集されています。

+0

クイックコメント:ブール関数の結果をチェックするときに '= true'の必要はありません。 mobiOkayGotItDisplayed()= true'ではなく、 'if mobiOkayGotItDisplayed()'を使用してください。 – rmunn

+0

@munn言語の観点からは '= true'の必要はないので、' = true'を省略した場合、コードの可読性は記述的条件関数名を指定します。 – Fabio

+0

@rmunn 'if'で評価された関数の結果(例:** mobiOkayGotItDisplayed()**)はtrueまたはfalseです。 – codet3str

答えて

0

この問題は解決しているようです。最新のChromeの自動アップデートがこの問題を解決したと思います。

1

これは直接的な回答ではありませんが、問題をはるかに簡単に見つけるのに役立つと思います。私はこの問題をデバッグするのがやや難しいものに気付いた。あなたは別の関数から複数の関数を呼び出して、この単一の関数をテストから呼び出しています。これらの機能を別々のテストに分割し、テストをWIPモードに変更することで、問題を特定するのに役立ちます。その1つのテストでは、多くの可能な故障箇所があります。

たとえば、Canopyのコンテキスト内でbefore(fun _ - > some function)またはonce(fun _ - > some function)を使用して新しいブラウザを起動してログインしたり、その部分をテストから分離する。

+0

提案していただきありがとうございます。私は問題を再訪したばかりで、解決したようです。私は最近のChromeの自動アップデートが問題を解決したと確信しています - 私はできる限りコードをデバッグしていましたので、論理フローに問題がないことを知っています(つまり、 。 – codet3str

関連する問題