Skip to content

Commit

Permalink
Performance - 3 optimizations
Browse files Browse the repository at this point in the history
  • Loading branch information
lefthandedgoat committed Sep 1, 2014
1 parent d2365c5 commit 47641ff
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 7 deletions.
22 changes: 17 additions & 5 deletions src/canopy/canopy.fs
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ let waitFor = waitFor2 "Condition not met in given amount of time. If you want t

//find related
let rec private findElements cssSelector (searchContext : ISearchContext) : IWebElement list =
searchedFor <- (cssSelector, browser.Url) :: searchedFor
if optmizeByDisablingCoverageReport = false then searchedFor <- (cssSelector, browser.Url) :: searchedFor
let findInIFrame () =
let iframes = findByCss "iframe" searchContext.FindElements
if iframes.IsEmpty then
Expand All @@ -210,10 +210,14 @@ let rec private findElements cssSelector (searchContext : ISearchContext) : IWeb

try
let results =
configuredFinders cssSelector searchContext.FindElements
|> Seq.filter(fun list -> not(list.IsEmpty))
if (hints.ContainsKey cssSelector) then
let finder = hints.[cssSelector]
seq { yield finder cssSelector searchContext.FindElements }
else
configuredFinders cssSelector searchContext.FindElements
|> Seq.filter(fun list -> not(list.IsEmpty))
if Seq.isEmpty results then
findInIFrame()
if optimizeBySkippingIFrameCheck then [] else findInIFrame()
else
results |> Seq.head
with | ex -> []
Expand Down Expand Up @@ -771,4 +775,12 @@ let addFinder finder =
let currentFinders = configuredFinders
configuredFinders <- (fun cssSelector f ->
currentFinders cssSelector f
|> Seq.append (seq { yield finder cssSelector f }))
|> Seq.append (seq { yield finder cssSelector f }))

//hints
let css selector = hints.[selector] <- findByCss; selector
let xpath selector = hints.[selector] <- findByXpath; selector
let jquery selector = hints.[selector] <- findByJQuery; selector
let label selector = hints.[selector] <- findByLabel; selector
let text selector = hints.[selector] <- findByText; selector
let value selector = hints.[selector] <- findByValue; selector

This comment has been minimized.

Copy link
@sergey-tihon

sergey-tihon Sep 3, 2014

Collaborator

It is interesting implementation if hints...
Could different type of selector have similar selector string representation?
Something like:

let x= label "canopy"
let y= text "canopy"
let res= elements x// Result is wrong

This comment has been minimized.

Copy link
@sergey-tihon

sergey-tihon Sep 3, 2014

Collaborator

As a workaround, you can change hints dictionary signature to

let hints = new System.Collections.Generic.Dictionary<string, (string -> (By -> System.Collections.ObjectModel.ReadOnlyCollection<IWebElement>) -> IWebElement list) list>()

and map selector to list of finders.

And css function check that findByCss are exist in hints.[selector] list and add if required.

Also would be nice to mention somewhere that theoretically possible the situation when hints will contain too many elements and must be cleared manually.

4 changes: 3 additions & 1 deletion src/canopy/configuration.fs
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,6 @@ let mutable disableSuggestOtherSelectors = false
let mutable autoPinBrowserRightOnLaunch = true
let mutable throwIfMoreThanOneElement = false
let mutable configuredFinders = finders.defaultFinders
let mutable writeToSelectWithOptionValue = true
let mutable writeToSelectWithOptionValue = true
let mutable optimizeBySkippingIFrameCheck = false
let mutable optmizeByDisablingCoverageReport = false

This comment has been minimized.

Copy link
@sergey-tihon

sergey-tihon Sep 3, 2014

Collaborator

it is better to rename variable to optimizeByDisablingCoverageReport

4 changes: 3 additions & 1 deletion src/canopy/finders.fs
Original file line number Diff line number Diff line change
Expand Up @@ -64,4 +64,6 @@ let mutable defaultFinders =
yield findByText cssSelector f
yield findByJQuery cssSelector f
}
)
)

let hints = new System.Collections.Generic.Dictionary<string, (string -> (By -> System.Collections.ObjectModel.ReadOnlyCollection<IWebElement>) -> IWebElement list)>()
27 changes: 27 additions & 0 deletions tests/basictests/Program.fs
Original file line number Diff line number Diff line change
Expand Up @@ -485,6 +485,33 @@ context "other tests"
url "http://lefthandedgoat.github.io/canopy/testpages/iframe2"
first "body" |> elementWithin "#states" |> elementWithin "1" |> read |> is "Alabama"

context "hints tests"
"css hint" &&& fun _ ->
url testpage
let firstName = css "#firstName"
firstName == "John"
css "#lastName" == "Doe"

"xpath hint" &&& fun _ ->
url testpage
let firstName = xpath "id('firstName')"
firstName == "John"
xpath "id('lastName')" == "Doe"

"jquery hint" &&& fun _ ->
url testpage
let firstName = jquery "#firstName"
firstName == "John"
jquery "#lastName" == "Doe"

"value hint" &&& fun _ ->
url testpage
value "Click Me!!" == "Click Me!!"

"text hint" &&& fun _ ->
url testpage
text "ajax button not clicked" == "ajax button not clicked"

context "dragging"
"draging works" &&& fun _ ->
url "http://scrumy.com/silenter39delayed"
Expand Down

0 comments on commit 47641ff

Please sign in to comment.