11import os, options, unittest, strutils
2- import halonium
2+ import webdriver
33import macros
44
5- export waitForElement
6- export waitForElements
5+ const actionDelayMs {. intdefine .} = 0
6+ # # Inserts a delay in milliseconds between automated actions. Useful for debugging tests
77
88macro with * (obj: typed , code: untyped ): untyped =
99 # # Execute a set of statements with an object
@@ -24,6 +24,14 @@ macro with*(obj: typed, code: untyped): untyped =
2424
2525 result = getAst (checkCompiles (result , code))
2626
27+ proc elementIsSome (element: Option [Element ]): bool =
28+ return element.isSome
29+
30+ proc elementIsNone (element: Option [Element ]): bool =
31+ return element.isNone
32+
33+ proc waitForElement * (session: Session , selector: string , strategy= CssSelector , timeout= 20000 , pollTime= 50 , waitCondition= elementIsSome): Option [Element ]
34+
2735proc click * (session: Session , element: string , strategy= CssSelector ) =
2836 let el = session.waitForElement (element, strategy)
2937 el.get ().click ()
@@ -36,33 +44,78 @@ proc clear*(session: Session, element: string) =
3644 let el = session.waitForElement (element)
3745 el.get ().clear ()
3846
39- proc sendKeys * (session: Session , element: string , keys: varargs [string , convertKeyRuneString ]) =
47+ proc sendKeys * (session: Session , element: string , keys: varargs [Key ]) =
4048 let el = session.waitForElement (element)
4149
42- el.get ().sendKeys (keys)
50+ # focus
51+ el.get ().click ()
52+ for key in keys:
53+ session.press (key)
4354
4455proc ensureExists * (session: Session , element: string , strategy= CssSelector ) =
4556 discard session.waitForElement (element, strategy)
4657
4758template check * (session: Session , element: string , function: untyped ) =
4859 let el = session.waitForElement (element)
49- doAssert function (el)
60+ check function (el)
5061
5162template check * (session: Session , element: string ,
5263 strategy: LocationStrategy , function: untyped ) =
5364 let el = session.waitForElement (element, strategy)
54- doAssert function (el)
65+ check function (el)
5566
5667proc setColor * (session: Session , element, color: string , strategy= CssSelector ) =
5768 let el = session.waitForElement (element, strategy)
58- discard session.executeScript (" arguments[0].setAttribute('value', '" & color & " ')" , el.get ())
69+ discard session.execute (" arguments[0].setAttribute('value', '" & color & " ')" , el.get ())
5970
6071proc checkIsNone * (session: Session , element: string , strategy= CssSelector ) =
6172 discard session.waitForElement (element, strategy, waitCondition= elementIsNone)
6273
6374proc checkText * (session: Session , element, expectedValue: string ) =
6475 let el = session.waitForElement (element)
65- doAssert el.get ().text.strip () == expectedValue
76+ check el.get ().getText () == expectedValue
77+
78+ proc waitForElement * (
79+ session: Session , selector: string , strategy= CssSelector ,
80+ timeout= 20000 , pollTime= 50 ,
81+ waitCondition= elementIsSome
82+ ): Option [Element ] =
83+ var waitTime = 0
84+
85+ when actionDelayMs > 0 :
86+ sleep (actionDelayMs)
87+
88+ while true :
89+ try :
90+ let loading = session.findElement (selector, strategy)
91+ if waitCondition (loading):
92+ return loading
93+ finally :
94+ discard
95+ sleep (pollTime)
96+ waitTime += pollTime
97+
98+ if waitTime > timeout:
99+ doAssert false , " Wait for load time exceeded"
100+
101+ proc waitForElements * (
102+ session: Session , selector: string , strategy= CssSelector ,
103+ timeout= 20000 , pollTime= 50
104+ ): seq [Element ] =
105+ var waitTime = 0
106+
107+ when actionDelayMs > 0 :
108+ sleep (actionDelayMs)
109+
110+ while true :
111+ let loading = session.findElements (selector, strategy)
112+ if loading.len > 0 :
113+ return loading
114+ sleep (pollTime)
115+ waitTime += pollTime
116+
117+ if waitTime > timeout:
118+ doAssert false , " Wait for load time exceeded"
66119
67120proc setUserRank * (session: Session , baseUrl, user, rank: string ) =
68121 with session:
0 commit comments