为什么在调用函数两次时会出现stackoverflow异常?

时间:2017-04-09 08:49:14

标签: f# canopy-web-testing

我有一个用F#编写的selenium UI测试(使用canopy selenium nuget包)。我有一个定义页面选择器和辅助函数的模块。 页面模块由测试模块调用。在测试模块中,我正在调用一个名为' handlemobimodals()'的函数,该函数运行四个子函数(if / else代码块),查找页面上是否存在元素并单击它,如果它存在。

我面临的问题是,当' handlemobododals()'函数在测试中第二次被调用,我得到一个Stack Overflow Exception(WebDriver Process由于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()

来自测试模块的片段(请注意,在LoginforPathAs函数中调用handleMobiModals函数的第一个实例,该函数在同一页面定义模块中定义):

module_sometest

open some_page

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

注意:为了简单和清晰起见,编辑了片段。

2 个答案:

答案 0 :(得分:1)

这不是一个直接的答案,但我相信这将有助于更容易地找到问题。我确实注意到了调试这个问题有点困难的事情。您正在从另一个函数调用多个函数,并从测试中调用此单个函数。将这些功能拆分为单独的测试并将测试更改为WIP模式应该有助于查明您的问题。在一次测试中有很多可能的失败点。

例如,您可以在Canopy的上下文中使用之前(有趣的_ - >一些函数)或一次(有趣的_ - >一些函数)来启动新的浏览器并登录,将该部分与测试分开。

答案 1 :(得分:0)

这个问题似乎已经解决了。我相信我最新的Chrome自动更新解决了这个问题。