@@ -0,0 +1,242 @@
1+module Lunapark.Affjax where
2+
3+import Prelude
4+
5+import Control.Monad.Aff (Aff)
6+import Data.Argonaut (Json)
7+import Data.Argonaut as J
8+import Data.Bifunctor (lmap)
9+import Data.Either (Either(..))
10+import Data.Maybe (Maybe(..))
11+import Network.HTTP.Affjax (AJAX)
12+import Network.HTTP.Affjax as N
13+import Network.HTTP.StatusCode (StatusCode(..))
14+import Lunapark.Error as LE
15+
16+-- | This two type synonims are used only here
17+-- | this is the lowest level of bindings this lib provides
18+type URI = String
19+type SessionId = String
20+type ElementId = String
21+
22+handleAPIError ∷ N.AffjaxResponse Json → Either LE.Error Json
23+handleAPIError r = case r.status of
24+ StatusCode 200 → lmap LE.unknownError do
25+ obj ← J.decodeJson r.response
26+ obj J..? "value"
27+ code → Left $ LE.fromJson r.response
28+
29+init ∷ ∀ e. URI → Json → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
30+init uri obj =
31+ map handleAPIError $ N.post (uri <> "/session") obj
32+
33+quit ∷ ∀ e. URI → SessionId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
34+quit uri sessId =
35+ map handleAPIError $ N.delete (uri <> "/session/" <> sessId)
36+
37+status ∷ ∀ e. URI → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
38+status uri =
39+ map handleAPIError $ N.get (uri <> "/status")
40+
41+getTimeouts ∷ ∀ e. URI → SessionId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
42+getTimeouts uri sessId =
43+ map handleAPIError $ N.get (uri <> "/session/" <> sessId <> "/timeouts")
44+
45+setTimeouts ∷ ∀ e. URI → SessionId → Json → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
46+setTimeouts uri sessId timeouts =
47+ map handleAPIError $ N.post (uri <> "/session/" <> sessId <> "/timeouts") timeouts
48+
49+go ∷ ∀ e. URI → SessionId → Json → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
50+go uri sessId obj =
51+ map handleAPIError $ N.post (uri <> "/session/" <> sessId <> "/url") obj
52+
53+getCurrentUrl ∷ ∀ e. URI → SessionId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
54+getCurrentUrl uri sessId =
55+ map handleAPIError $ N.get (uri <> "/session/" <> sessId <> "/url")
56+
57+back ∷ ∀ e. URI → SessionId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
58+back uri sessId =
59+ map handleAPIError $ N.post' (uri <> "/session/" <> sessId <> "/back") (Nothing ∷ Maybe Unit)
60+
61+forward ∷ ∀ e. URI → SessionId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
62+forward uri sessId =
63+ map handleAPIError $ N.post' (uri <> "/session/" <> sessId <> "/forward") (Nothing ∷ Maybe Unit)
64+
65+refresh ∷ ∀ e. URI → SessionId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
66+refresh uri sessId =
67+ map handleAPIError $ N.post' (uri <> "/session/" <> sessId <> "/refresh") (Nothing ∷ Maybe Unit)
68+
69+getTitle ∷ ∀ e. URI → SessionId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
70+getTitle uri sessId =
71+ map handleAPIError $ N.get (uri <> "/session/" <> sessId <> "/title")
72+
73+getWindowHandle ∷ ∀ e. URI → SessionId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
74+getWindowHandle uri sessId =
75+ map handleAPIError $ N.get (uri <> "/session/" <> sessId <> "/window")
76+
77+closeWindow ∷ ∀ e. URI → SessionId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
78+closeWindow uri sessId =
79+ map handleAPIError $ N.delete (uri <> "/session/" <> sessId)
80+
81+switchToWindow ∷ ∀ e. URI → SessionId → Json → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
82+switchToWindow uri sessId obj =
83+ map handleAPIError $ N.post (uri <> "/session/" <> sessId <> "/window") obj
84+
85+getWindowHandles ∷ ∀ e. URI → SessionId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
86+getWindowHandles uri sessId =
87+ map handleAPIError $ N.get (uri <> "/session/" <> sessId <> "/window/handles")
88+
89+switchToFrame ∷ ∀ e. URI → SessionId → Json → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
90+switchToFrame uri sessId obj =
91+ map handleAPIError $ N.post (uri <> "/session/" <> sessId <> "/frame") obj
92+
93+switchToParentFrame ∷ ∀ e. URI → SessionId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
94+switchToParentFrame uri sessId =
95+ map handleAPIError $ N.post' (uri <> "/session/" <> sessId <> "/frame/parent") (Nothing ∷ Maybe Unit)
96+
97+getWindowRect ∷ ∀ e. URI → SessionId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
98+getWindowRect uri sessId =
99+ map handleAPIError $ N.get (uri <> "/session/" <> sessId <> "/window/rect")
100+
101+setWindowRect ∷ ∀ e. URI → SessionId → Json → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
102+setWindowRect uri sessId obj =
103+ map handleAPIError $ N.post (uri <> "/session/" <> sessId <> "/window/rect") obj
104+
105+maximizeWindow ∷ ∀ e. URI → SessionId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
106+maximizeWindow uri sessId =
107+ map handleAPIError $ N.post' (uri <> "/session/" <> sessId <> "/window/maximize") (Nothing ∷ Maybe Unit)
108+
109+minimizeWindow ∷ ∀ e. URI → SessionId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
110+minimizeWindow uri sessId =
111+ map handleAPIError $ N.post' (uri <> "/session/" <> sessId <> "/window/minimize") (Nothing ∷ Maybe Unit)
112+
113+fullscreenWindow ∷ ∀ e. URI → SessionId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
114+fullscreenWindow uri sessId =
115+ map handleAPIError $ N.post' (uri <> "/session/" <> sessId <> "/window/fullscreen") (Nothing ∷ Maybe Unit)
116+
117+findElement ∷ ∀ e. URI → SessionId → Json → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
118+findElement uri sessId obj =
119+ map handleAPIError $ N.post (uri <> "/session/" <> sessId <> "/element") obj
120+
121+findElements ∷ ∀ e. URI → SessionId → Json → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
122+findElements uri sessId obj =
123+ map handleAPIError $ N.post (uri <> "/session/" <> sessId <> "/elements") obj
124+
125+findElementFromElement ∷ ∀ e. URI → SessionId → ElementId → Json → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
126+findElementFromElement uri sessId elId obj =
127+ map handleAPIError $ N.post (uri <> "/session/" <> sessId <> "/element/" <> elId <> "/element") obj
128+
129+findElementsFromElement ∷ ∀ e. URI → SessionId → ElementId → Json → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
130+findElementsFromElement uri sessId elId obj =
131+ map handleAPIError $ N.post (uri <> "/session/" <> sessId <> "/element/" <> elId <> "/elements") obj
132+
133+getActiveElement ∷ ∀ e. URI → SessionId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
134+getActiveElement uri sessId = map handleAPIError $ N.get (uri <> "/session/" <> sessId <> "/element/active")
135+
136+isElementSelected ∷ ∀ e. URI → SessionId → ElementId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
137+isElementSelected uri sessId elId =
138+ map handleAPIError $ N.get (uri <> "/session/" <> sessId <> "/element/" <> elId <> "/selected")
139+
140+getElementAttribute ∷ ∀ e. URI → SessionId → ElementId → String → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
141+getElementAttribute uri sessId elId attrName =
142+ map handleAPIError $ N.get (uri <> "/session/" <> sessId <> "/element/" <> elId <> "/attribute/" <> attrName)
143+
144+getElementProperty ∷ ∀ e. URI → SessionId → ElementId → String → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
145+getElementProperty uri sessId elId propName =
146+ map handleAPIError $ N.get (uri <> "/session/" <> sessId <> "/element/" <> elId <> "/property/" <> propName)
147+
148+getElementCSSValue ∷ ∀ e. URI → SessionId → ElementId → String → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
149+getElementCSSValue uri sessId elId cssName =
150+ map handleAPIError $ N.get (uri <> "/session/" <> sessId <> "/element/" <> elId <> "/css/" <> cssName)
151+
152+getElementText ∷ ∀ e. URI → SessionId → ElementId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
153+getElementText uri sessId elId =
154+ map handleAPIError $ N.get (uri <> "/session/" <> sessId <> "/element/" <> elId <> "/text")
155+
156+getElementTagName ∷ ∀ e. URI → SessionId → ElementId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
157+getElementTagName uri sessId elId =
158+ map handleAPIError $ N.get (uri <> "/session/" <> sessId <> "/element/" <> elId <> "/name")
159+
160+getElementRect ∷ ∀ e. URI → SessionId → ElementId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
161+getElementRect uri sessId elId =
162+ map handleAPIError $ N.get (uri <> "/session/" <> sessId <> "/element/" <> elId <> "/rect")
163+
164+isElementEnabled ∷ ∀ e. URI → SessionId → ElementId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
165+isElementEnabled uri sessId elId =
166+ map handleAPIError $ N.get (uri <> "/session/" <> sessId <> "/element/" <> elId <> "/enabled")
167+
168+elementClick ∷ ∀ e. URI → SessionId → ElementId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
169+elementClick uri sessId elId =
170+ map handleAPIError $ N.post' (uri <> "/session/" <> sessId <> "/element/" <> elId <> "/click") (Nothing ∷ Maybe Unit)
171+
172+elementClear ∷ ∀ e. URI → SessionId → ElementId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
173+elementClear uri sessId elId =
174+ map handleAPIError $ N.post' (uri <> "/session/" <> sessId <> "/element/" <> elId <> "/clear") (Nothing ∷ Maybe Unit)
175+
176+elementSendKeys ∷ ∀ e. URI → SessionId → ElementId → Json → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
177+elementSendKeys uri sessId elId obj =
178+ map handleAPIError $ N.post (uri <> "/session/" <> sessId <> "/element/" <> elId <> "/value") obj
179+
180+getPageSource ∷ ∀ e. URI → SessionId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
181+getPageSource uri sessId =
182+ map handleAPIError $ N.get (uri <> "/session/" <> sessId <> "/source")
183+
184+executeScript ∷ ∀ e. URI → SessionId → Json → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
185+executeScript uri sessId obj =
186+ map handleAPIError $ N.post (uri <> "/session/" <> sessId <> "/execute/sync") obj
187+
188+executeAsyncScript ∷ ∀ e. URI → SessionId → Json → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
189+executeAsyncScript uri sessId obj =
190+ map handleAPIError $ N.post (uri <> "/session/" <> sessId <> "/execute/async") obj
191+
192+getAllCookies ∷ ∀ e. URI → SessionId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
193+getAllCookies uri sessId =
194+ map handleAPIError $ N.get (uri <> "/session/" <> sessId <> "/cookie")
195+
196+getNamedCookie ∷ ∀ e. URI → SessionId → String → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
197+getNamedCookie uri sessId name =
198+ map handleAPIError $ N.get (uri <> "/session/" <> sessId <> "/cookie/" <> name)
199+
200+addCookie ∷ ∀ e. URI → SessionId → Json → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
201+addCookie uri sessId obj =
202+ map handleAPIError $ N.post (uri <> "/session/" <> sessId <> "/cookie") obj
203+
204+deleteCookie ∷ ∀ e. URI → SessionId → String → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
205+deleteCookie uri sessId name =
206+ map handleAPIError $ N.delete (uri <> "/session/" <> sessId <> "/cookie/" <> name)
207+
208+deleteAllCookies ∷ ∀ e. URI → SessionId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
209+deleteAllCookies uri sessId =
210+ map handleAPIError $ N.delete (uri <> "/session/" <> sessId <> "/cookie")
211+
212+performActions ∷ ∀ e. URI → SessionId → Json → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
213+performActions uri sessId obj =
214+ map handleAPIError $ N.post (uri <> "/session/" <> sessId <> "/actions") obj
215+
216+releaseActions ∷ ∀ e. URI → SessionId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
217+releaseActions uri sessId =
218+ map handleAPIError $ N.delete (uri <> "/session/" <> sessId <> "/actions")
219+
220+dismissAlert ∷ ∀ e. URI → SessionId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
221+dismissAlert uri sessId =
222+ map handleAPIError $ N.post' (uri <> "/session/" <> sessId <> "/alert/dismiss") (Nothing ∷ Maybe Unit)
223+
224+acceptAlert ∷ ∀ e. URI → SessionId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
225+acceptAlert uri sessId =
226+ map handleAPIError $ N.post' (uri <> "/session/" <> sessId <> "/alert/accept") (Nothing ∷ Maybe Unit)
227+
228+getAlertText ∷ ∀ e. URI → SessionId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
229+getAlertText uri sessId =
230+ map handleAPIError $ N.get (uri <> "/session/" <> sessId <> "/alert/text")
231+
232+sendAlertText ∷ ∀ e. URI → SessionId → Json → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
233+sendAlertText uri sessId obj =
234+ map handleAPIError $ N.post (uri <> "/session/" <> sessId <> "/alert/text") obj
235+
236+takeScreenshot ∷ ∀ e. URI → SessionId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
237+takeScreenshot uri sessId =
238+ map handleAPIError $ N.get (uri <> "/session/" <> sessId <> "/screenshot")
239+
240+takeElementScreenshot ∷ ∀ e. URI → SessionId → ElementId → Aff (ajax ∷ AJAX|e) (Either LE.Error Json)
241+takeElementScreenshot uri sessId elId =
242+ map handleAPIError $ N.get (uri <> "/session/" <> sessId <> "/element/" <> elId <> "/screenshot")