为什么在两次调用函数时会出现 stackoverflow 异常?
Why am I getting stackoverflow exception when calling a function twice?
我有一个用 F# 编写的 selenium UI 测试(使用 canopy selenium nuget 包)。我有一个定义 page 选择器和辅助函数的模块。 page 模块由 test 模块调用。在测试模块中,我调用了一个名为 'handlemobimodals()' 的函数,该函数运行四个子函数(if/else 代码块),用于查找页面上是否存在某个元素并单击它(如果存在) .
我面临的问题是,当 'handlemobimodals()' 函数在测试中被第二次调用时,我得到一个 Stack Overflow Exception(WebDriver Process is terminated due to WhosebugException),紧随其后第一个子函数被调用。
该函数第一次运行完全正常(在测试中从另一个函数间接调用),但在测试中直接调用时第二次失败。我是 F# 的新手,我不知道我是如何在我的测试中引起递归的,正如 Whosebug 异常所暗示的那样。
如有任何见解,我们将不胜感激。
来自页面模块的代码段:
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"
注意:为了简单明了,对片段进行了编辑。
这不是一个直接的答案,但我相信这将有助于更容易地找到问题。我确实注意到一些东西使得调试这个问题有些困难。您从另一个函数调用多个函数,并从测试中调用这个函数。将这些功能拆分为单独的测试并将测试更改为 WIP 模式应该有助于查明您的问题。那个测试中有很多可能的失败点。
例如,您可以在 Canopy 的上下文中使用 before(fun _ -> some function(s) here) 或 once(fun _ -> some function(s) here) 来启动新浏览器并登录, 将该部分与测试分开。
此问题似乎已自行解决。我相信我最近的 Chrome 自动更新解决了这个问题。
我有一个用 F# 编写的 selenium UI 测试(使用 canopy selenium nuget 包)。我有一个定义 page 选择器和辅助函数的模块。 page 模块由 test 模块调用。在测试模块中,我调用了一个名为 'handlemobimodals()' 的函数,该函数运行四个子函数(if/else 代码块),用于查找页面上是否存在某个元素并单击它(如果存在) .
我面临的问题是,当 'handlemobimodals()' 函数在测试中被第二次调用时,我得到一个 Stack Overflow Exception(WebDriver Process is terminated due to WhosebugException),紧随其后第一个子函数被调用。
该函数第一次运行完全正常(在测试中从另一个函数间接调用),但在测试中直接调用时第二次失败。我是 F# 的新手,我不知道我是如何在我的测试中引起递归的,正如 Whosebug 异常所暗示的那样。
如有任何见解,我们将不胜感激。
来自页面模块的代码段:
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"
注意:为了简单明了,对片段进行了编辑。
这不是一个直接的答案,但我相信这将有助于更容易地找到问题。我确实注意到一些东西使得调试这个问题有些困难。您从另一个函数调用多个函数,并从测试中调用这个函数。将这些功能拆分为单独的测试并将测试更改为 WIP 模式应该有助于查明您的问题。那个测试中有很多可能的失败点。
例如,您可以在 Canopy 的上下文中使用 before(fun _ -> some function(s) here) 或 once(fun _ -> some function(s) here) 来启动新浏览器并登录, 将该部分与测试分开。
此问题似乎已自行解决。我相信我最近的 Chrome 自动更新解决了这个问题。