{- |
Module      : Web.Api.WebDriver.Endpoints
Description : Type-safe bindings for the WebDriver HTTP API.
Copyright   : 2018, Automattic, Inc.
License     : GPL-3
Maintainer  : Nathan Bloomfield (nbloomf@gmail.com)
Stability   : experimental
Portability : POSIX

These bindings try to stick as closely to the spec as possible. We use the following conventions.

* The @Stealth@ suffix on a function indicates that it does not log request or response data (but it does log that a request/response occurred).
* A prime (@'@) on a POST function name indicates that it takes an additional function parameter that mutates the payload after it is converted to JSON, but before sending the request. This is a cheap way to future-proof the bindings and accommodate nonstandard request parameters.

The most recent version of the spec is available at <https://w3c.github.io/webdriver/webdriver-spec.html>.
-}

{-# LANGUAGE OverloadedStrings, BangPatterns #-}
module Web.Api.WebDriver.Endpoints (
    runIsolated
  , runIsolated_

  -- * Sessions
  -- ** New Session
  , newSession
  , newSession'
  -- ** Delete Session
  , deleteSession
  -- ** Status
  , sessionStatus
  -- ** Get Timeouts
  , getTimeouts
  -- ** Set Timeouts
  , setTimeouts

  -- * Navigation
  -- ** Navigate To
  , navigateTo
  , navigateToStealth
  -- ** Get Current URL
  , getCurrentUrl
  -- ** Go Back
  , goBack
  -- ** Go Forward
  , goForward
  -- ** Page Refresh
  , pageRefresh
  -- ** Get Title
  , getTitle

  -- * Command Contexts
  -- ** Get Window Handle
  , getWindowHandle
  -- ** Close Window
  , closeWindow
  -- ** Switch To Window
  , switchToWindow
  -- ** Get Window Handles
  , getWindowHandles
  -- ** New Window
  , newWindow
  -- ** Switch To Frame
  , switchToFrame
  -- ** Switch To Parent Frame
  , switchToParentFrame
  -- ** Get Window Rect
  , getWindowRect
  -- ** Set Window Rect
  , setWindowRect
  -- ** Maximize Window
  , maximizeWindow
  -- ** Minimize Window
  , minimizeWindow
  -- ** Fullscreen Window
  , fullscreenWindow

  -- * Element Retrieval
  -- ** Find Element
  , findElement
  -- ** Find Elements
  , findElements
  -- ** Find Element From Element
  , findElementFromElement
  -- ** Find Elements From Element
  , findElementsFromElement
  -- ** Get Active Element
  , getActiveElement

  -- * Element State
  -- ** Is Element Selected
  , isElementSelected
  -- ** Get Element Attribute
  , getElementAttribute
  -- ** Get Element Property
  , getElementProperty
  -- ** Get Element CSS Value
  , getElementCssValue
  -- ** Get Element Text
  , getElementText
  -- ** Get Element Tag Name
  , getElementTagName
  -- ** Get Element Rect
  , getElementRect
  -- ** Is Element Enabled
  , isElementEnabled
  -- ** Get Computed Role
  , getComputedRole
  -- ** Get Computed Label
  , getComputedLabel

  -- * Element Interaction
  -- ** Element Click
  , elementClick
  -- ** Element Clear
  , elementClear
  -- ** Element Send Keys
  , elementSendKeys

  -- * Document Handling
  -- ** Get Page Source
  , getPageSource
  , getPageSourceStealth
  -- ** Execute Script
  , executeScript
  -- ** Execute Async Script
  , executeAsyncScript

  -- * Cookies
  -- ** Get All Cookies
  , getAllCookies
  -- ** Get Named Cookie
  , getNamedCookie
  -- ** Add Cookie
  , addCookie
  -- ** Delete Cookie
  , deleteCookie
  -- ** Delete All Cookies
  , deleteAllCookies

  -- * Actions
  -- ** Perform Actions
  , performActions
  , performActionsStealth
  -- ** Release Actions
  , releaseActions

  -- * User Prompts
  -- ** Dismiss Alert
  , dismissAlert
  -- ** Accept Alert
  , acceptAlert
  -- ** Get Alert Text
  , getAlertText
  -- ** Send Alert Text
  , sendAlertText

  -- * Screen Capture
  -- ** Take Screenshot
  , takeScreenshot
  -- ** Take Element Screenshot
  , takeElementScreenshot

  -- * Print
  -- ** Print Page
  , printPage

  -- Spec Constants
  , _WEB_ELEMENT_ID
  , _WEB_WINDOW_ID
  , _WEB_FRAME_ID
  ) where

import Control.Monad.Trans.Class
  ( MonadTrans(..) )
import Data.Aeson
  ( Value(..), encode, object, (.=), toJSON )
import Data.Text
  ( Text, unpack )
import Data.Text.Encoding
  ( encodeUtf8 )
import qualified Data.ByteString as SB
import qualified Data.ByteString.Base64 as B64
import Data.String (IsString)
import Data.Text (Text)
import qualified Data.Text as T
import qualified Network.URI.Encode as E

import Web.Api.WebDriver.Types
import Web.Api.WebDriver.Classes
import Web.Api.WebDriver.Monad



-- | Spec-defined "web element identifier" string constant. See <https://w3c.github.io/webdriver/webdriver-spec.html#elements>.
_WEB_ELEMENT_ID :: (IsString t) => t
_WEB_ELEMENT_ID :: t
_WEB_ELEMENT_ID = t
"element-6066-11e4-a52e-4f735466cecf"

-- | Spec-defined "web window identifier" string constant. See <https://w3c.github.io/webdriver/webdriver-spec.html#command-contexts>.
_WEB_WINDOW_ID :: (IsString t) => t
_WEB_WINDOW_ID :: t
_WEB_WINDOW_ID =  t
"window-fcc6-11e5-b4f8-330a88ab9d7f"

-- | Spec-defined "web frame identifier" string constant. See <https://w3c.github.io/webdriver/webdriver-spec.html#command-contexts>.
_WEB_FRAME_ID :: (IsString t) => t
_WEB_FRAME_ID :: t
_WEB_FRAME_ID = t
"frame-075b-4da1-b6ba-e579c2d3230a"





-- | Url of the remote WebDriver server.
theRemoteUrl
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff Url
theRemoteUrl :: WebDriverTT t eff Url
theRemoteUrl = do
  Url
host <- (R WDError WDLog WDEnv -> Url) -> WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t) =>
(R WDError WDLog WDEnv -> a) -> WebDriverTT t eff a
fromEnv (WDEnv -> Url
_remoteHostname (WDEnv -> Url)
-> (R WDError WDLog WDEnv -> WDEnv) -> R WDError WDLog WDEnv -> Url
forall b c a. (b -> c) -> (a -> b) -> a -> c
. R WDError WDLog WDEnv -> WDEnv
forall e w r. R e w r -> r
_env)
  Int
port <- (R WDError WDLog WDEnv -> Int) -> WebDriverTT t eff Int
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t) =>
(R WDError WDLog WDEnv -> a) -> WebDriverTT t eff a
fromEnv (WDEnv -> Int
_remotePort (WDEnv -> Int)
-> (R WDError WDLog WDEnv -> WDEnv) -> R WDError WDLog WDEnv -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. R WDError WDLog WDEnv -> WDEnv
forall e w r. R e w r -> r
_env)
  Url
path <- (R WDError WDLog WDEnv -> Url) -> WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t) =>
(R WDError WDLog WDEnv -> a) -> WebDriverTT t eff a
fromEnv (WDEnv -> Url
_remotePath (WDEnv -> Url)
-> (R WDError WDLog WDEnv -> WDEnv) -> R WDError WDLog WDEnv -> Url
forall b c a. (b -> c) -> (a -> b) -> a -> c
. R WDError WDLog WDEnv -> WDEnv
forall e w r. R e w r -> r
_env)
  Url -> WebDriverTT t eff Url
forall (m :: * -> *) a. Monad m => a -> m a
return (Url -> WebDriverTT t eff Url) -> Url -> WebDriverTT t eff Url
forall a b. (a -> b) -> a -> b
$ [Url] -> Url
T.concat [ Url
"http://", Url
host, Url
":", String -> Url
T.pack (String -> Url) -> String -> Url
forall a b. (a -> b) -> a -> b
$ Int -> String
forall a. Show a => a -> String
show Int
port, Url
path]

-- | Url of the remote WebDriver server, with session ID.
theRemoteUrlWithSession :: (Monad eff, Monad (t eff), MonadTrans t) => WebDriverTT t eff Url
theRemoteUrlWithSession :: WebDriverTT t eff Url
theRemoteUrlWithSession = do
  Maybe Url
st <- (S WDState -> Maybe Url) -> WebDriverTT t eff (Maybe Url)
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t) =>
(S WDState -> a) -> WebDriverTT t eff a
fromState (WDState -> Maybe Url
_sessionId (WDState -> Maybe Url)
-> (S WDState -> WDState) -> S WDState -> Maybe Url
forall b c a. (b -> c) -> (a -> b) -> a -> c
. S WDState -> WDState
forall s. S s -> s
_userState)
  case Maybe Url
st of
    Maybe Url
Nothing -> WDError -> WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t) =>
WDError -> WebDriverTT t eff a
throwError WDError
NoSession
    Just Url
session_id -> do
      Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrl
      Url -> WebDriverTT t eff Url
forall (m :: * -> *) a. Monad m => a -> m a
return (Url -> WebDriverTT t eff Url) -> Url -> WebDriverTT t eff Url
forall a b. (a -> b) -> a -> b
$ [Url] -> Url
T.concat [ Url
baseUrl, Url
"/session/", Url
session_id ]

-- | Set the session id of a `WDState`.
setSessionId
  :: Maybe Text
  -> S WDState
  -> S WDState
setSessionId :: Maybe Url -> S WDState -> S WDState
setSessionId Maybe Url
x S WDState
st = S WDState
st { _userState :: WDState
_userState = (S WDState -> WDState
forall s. S s -> s
_userState S WDState
st) { _sessionId :: Maybe Url
_sessionId = Maybe Url
x } }

-- | If a WebDriver session ends without issuing a delete session command, then the server keeps its session state alive. `cleanupOnError` catches errors and ensures that a `deleteSession` request is sent.
cleanupOnError
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff a -- ^ `WebDriver` session that may throw errors
  -> WebDriverTT t eff a
cleanupOnError :: WebDriverTT t eff a -> WebDriverTT t eff a
cleanupOnError WebDriverTT t eff a
x = WebDriverTT t eff a
-> (WDError -> WebDriverTT t eff a)
-> (HttpException -> WebDriverTT t eff a)
-> (IOException -> WebDriverTT t eff a)
-> (JsonError -> WebDriverTT t eff a)
-> WebDriverTT t eff a
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff a
-> (WDError -> WebDriverTT t eff a)
-> (HttpException -> WebDriverTT t eff a)
-> (IOException -> WebDriverTT t eff a)
-> (JsonError -> WebDriverTT t eff a)
-> WebDriverTT t eff a
catchAnyError WebDriverTT t eff a
x
  (\WDError
e -> WebDriverTT t eff ()
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff ()
deleteSession WebDriverTT t eff () -> WebDriverTT t eff a -> WebDriverTT t eff a
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> WDError -> WebDriverTT t eff a
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t) =>
WDError -> WebDriverTT t eff a
throwError WDError
e)
  (\HttpException
e -> WebDriverTT t eff ()
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff ()
deleteSession WebDriverTT t eff () -> WebDriverTT t eff a -> WebDriverTT t eff a
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> HttpException -> WebDriverTT t eff a
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t) =>
HttpException -> WebDriverTT t eff a
throwHttpException HttpException
e)
  (\IOException
e -> WebDriverTT t eff ()
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff ()
deleteSession WebDriverTT t eff () -> WebDriverTT t eff a -> WebDriverTT t eff a
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> IOException -> WebDriverTT t eff a
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t) =>
IOException -> WebDriverTT t eff a
throwIOException IOException
e)
  (\JsonError
e -> WebDriverTT t eff ()
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff ()
deleteSession WebDriverTT t eff () -> WebDriverTT t eff a -> WebDriverTT t eff a
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> JsonError -> WebDriverTT t eff a
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t) =>
JsonError -> WebDriverTT t eff a
throwJsonError JsonError
e)

-- | Run a WebDriver computation in an isolated browser session. Ensures that the session is closed on the remote end.
runIsolated
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => Capabilities
  -> WebDriverTT t eff a
  -> WebDriverTT t eff a
runIsolated :: Capabilities -> WebDriverTT t eff a -> WebDriverTT t eff a
runIsolated Capabilities
caps WebDriverTT t eff a
theSession = WebDriverTT t eff a -> WebDriverTT t eff a
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff a -> WebDriverTT t eff a
cleanupOnError (WebDriverTT t eff a -> WebDriverTT t eff a)
-> WebDriverTT t eff a -> WebDriverTT t eff a
forall a b. (a -> b) -> a -> b
$ do
  Url
session_id <- Capabilities -> WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Capabilities -> WebDriverTT t eff Url
newSession Capabilities
caps
  (S WDState -> S WDState) -> WebDriverTT t eff ()
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
(S WDState -> S WDState) -> WebDriverTT t eff ()
modifyState ((S WDState -> S WDState) -> WebDriverTT t eff ())
-> (S WDState -> S WDState) -> WebDriverTT t eff ()
forall a b. (a -> b) -> a -> b
$ Maybe Url -> S WDState -> S WDState
setSessionId (Url -> Maybe Url
forall a. a -> Maybe a
Just Url
session_id)
  a
a <- WebDriverTT t eff a
theSession
  WebDriverTT t eff ()
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff ()
deleteSession
  (S WDState -> S WDState) -> WebDriverTT t eff ()
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
(S WDState -> S WDState) -> WebDriverTT t eff ()
modifyState ((S WDState -> S WDState) -> WebDriverTT t eff ())
-> (S WDState -> S WDState) -> WebDriverTT t eff ()
forall a b. (a -> b) -> a -> b
$ Maybe Url -> S WDState -> S WDState
setSessionId Maybe Url
forall a. Maybe a
Nothing
  a -> WebDriverTT t eff a
forall (m :: * -> *) a. Monad m => a -> m a
return a
a

runIsolated_
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => Capabilities
  -> WebDriverTT t eff a
  -> WebDriverTT t eff ()
runIsolated_ :: Capabilities -> WebDriverTT t eff a -> WebDriverTT t eff ()
runIsolated_ Capabilities
caps WebDriverTT t eff a
theSession =
  Capabilities -> WebDriverTT t eff a -> WebDriverTT t eff a
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t) =>
Capabilities -> WebDriverTT t eff a -> WebDriverTT t eff a
runIsolated Capabilities
caps WebDriverTT t eff a
theSession WebDriverTT t eff a -> WebDriverTT t eff () -> WebDriverTT t eff ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> () -> WebDriverTT t eff ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()





-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#new-session>. For an extensible version allowing arbitrary changes to the JSON value representing the `Capabilities` parameter, see `newSession'`.
newSession
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => Capabilities
  -> WebDriverTT t eff SessionId
newSession :: Capabilities -> WebDriverTT t eff Url
newSession = (Value -> Value) -> Capabilities -> WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
(Value -> Value) -> Capabilities -> WebDriverTT t eff Url
newSession' Value -> Value
forall a. a -> a
id


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#new-session>. This generalizes `newSession'` by taking an additional function @Value -> Value@ that is applied to the `Capabilities` parameter after it is converted to JSON, but before it is passed to the HTTP call.
newSession'
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => (Value -> Value)
  -> Capabilities
  -> WebDriverTT t eff SessionId
newSession' :: (Value -> Value) -> Capabilities -> WebDriverTT t eff Url
newSession' Value -> Value
f Capabilities
caps = do
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrl
  ResponseFormat
format <- (R WDError WDLog WDEnv -> ResponseFormat)
-> WebDriverTT t eff ResponseFormat
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t) =>
(R WDError WDLog WDEnv -> a) -> WebDriverTT t eff a
fromEnv (WDEnv -> ResponseFormat
_responseFormat (WDEnv -> ResponseFormat)
-> (R WDError WDLog WDEnv -> WDEnv)
-> R WDError WDLog WDEnv
-> ResponseFormat
forall b c a. (b -> c) -> (a -> b) -> a -> c
. R WDError WDLog WDEnv -> WDEnv
forall e w r. R e w r -> r
_env)
  let
    !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ Value -> Value
f (Value -> Value) -> Value -> Value
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object
      [ Key
"capabilities" Key -> Value -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= [Pair] -> Value
object
        [ Key
"alwaysMatch" Key -> Value -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Capabilities -> Value
forall a. ToJSON a => a -> Value
toJSON Capabilities
caps ]
      , Key
"desiredCapabilities" Key -> Value -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Capabilities -> Value
forall a. ToJSON a => a -> Value
toJSON Capabilities
caps
      ]
  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/session") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= case ResponseFormat
format of
          ResponseFormat
SpecFormat -> Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
          ResponseFormat
ChromeFormat -> Value -> WebDriverTT t eff Value
forall (m :: * -> *) a. Monad m => a -> m a
return
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"sessionId"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Url) -> WebDriverTT t eff Url
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#delete-session>.
deleteSession
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff ()
deleteSession :: WebDriverTT t eff ()
deleteSession = do
  (Url
baseUrl, ResponseFormat
format) <- WebDriverTT t eff (Url, ResponseFormat)
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff (Url, ResponseFormat)
theRequestContext
  Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpDelete Url
baseUrl
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ResponseFormat -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ResponseFormat -> Value -> WebDriverTT t eff Value
expectEmptyObject ResponseFormat
format
  () -> WebDriverTT t eff ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#status>.
sessionStatus
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff (Bool, Text)
sessionStatus :: WebDriverTT t eff (Bool, Url)
sessionStatus = do
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrl
  ResponseFormat
format <- (R WDError WDLog WDEnv -> ResponseFormat)
-> WebDriverTT t eff ResponseFormat
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t) =>
(R WDError WDLog WDEnv -> a) -> WebDriverTT t eff a
fromEnv (WDEnv -> ResponseFormat
_responseFormat (WDEnv -> ResponseFormat)
-> (R WDError WDLog WDEnv -> WDEnv)
-> R WDError WDLog WDEnv
-> ResponseFormat
forall b c a. (b -> c) -> (a -> b) -> a -> c
. R WDError WDLog WDEnv -> WDEnv
forall e w r. R e w r -> r
_env)
  Value
r <- Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpGet (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/status")
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
  Bool
ready <- case ResponseFormat
format of
    ResponseFormat
SpecFormat ->
      Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value" Value
r
        WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"ready"
        WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Bool) -> WebDriverTT t eff Bool
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Bool
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson
    ResponseFormat
ChromeFormat -> Bool -> WebDriverTT t eff Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
  Url
msg <- case ResponseFormat
format of
    ResponseFormat
SpecFormat ->
      Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value" Value
r
        WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"message"
        WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Url) -> WebDriverTT t eff Url
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson
    ResponseFormat
ChromeFormat -> Url -> WebDriverTT t eff Url
forall (m :: * -> *) a. Monad m => a -> m a
return Url
"chromedriver is not spec compliant :)"
  (Bool, Url) -> WebDriverTT t eff (Bool, Url)
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool
ready, Url
msg)


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#get-timeouts>.
getTimeouts
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff TimeoutConfig
getTimeouts :: WebDriverTT t eff TimeoutConfig
getTimeouts = do
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpGet (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/timeouts")
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff TimeoutConfig)
-> WebDriverTT t eff TimeoutConfig
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff TimeoutConfig
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#set-timeouts>.
setTimeouts
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => TimeoutConfig
  -> WebDriverTT t eff ()
setTimeouts :: TimeoutConfig -> WebDriverTT t eff ()
setTimeouts TimeoutConfig
timeouts = do
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  let !payload :: ByteString
payload = TimeoutConfig -> ByteString
forall a. ToJSON a => a -> ByteString
encode TimeoutConfig
timeouts
  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/timeouts") ByteString
payload
  () -> WebDriverTT t eff ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#navigate-to>. To access this enpoint without logging the request or the result, use `navigateToStealth`.
navigateTo
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => Url
  -> WebDriverTT t eff ()
navigateTo :: Url -> WebDriverTT t eff ()
navigateTo Url
url = do
  (Url
baseUrl, ResponseFormat
format) <- WebDriverTT t eff (Url, ResponseFormat)
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff (Url, ResponseFormat)
theRequestContext
  let !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object [ Key
"url" Key -> Url -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Url
url ]
  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/url") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ResponseFormat -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ResponseFormat -> Value -> WebDriverTT t eff Value
expectEmptyObject ResponseFormat
format
  () -> WebDriverTT t eff ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#navigate-to>. This function does not log the request or response; if you do want the interaction logged, use `navigateTo`.
navigateToStealth
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => Url
  -> WebDriverTT t eff ()
navigateToStealth :: Url -> WebDriverTT t eff ()
navigateToStealth Url
url = do
  (Url
baseUrl, ResponseFormat
format) <- WebDriverTT t eff (Url, ResponseFormat)
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff (Url, ResponseFormat)
theRequestContext
  let !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object [ Key
"url" Key -> Url -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Url
url ]
  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpSilentPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/url") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ResponseFormat -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ResponseFormat -> Value -> WebDriverTT t eff Value
expectEmptyObject ResponseFormat
format
  () -> WebDriverTT t eff ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#get-current-url>.
getCurrentUrl
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff Url
getCurrentUrl :: WebDriverTT t eff Url
getCurrentUrl = do
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpGet (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/url")
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Url) -> WebDriverTT t eff Url
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#back>.
goBack
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff ()
goBack :: WebDriverTT t eff ()
goBack = do
  (Url
baseUrl, ResponseFormat
format) <- WebDriverTT t eff (Url, ResponseFormat)
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff (Url, ResponseFormat)
theRequestContext
  let !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object []
  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/back") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ResponseFormat -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ResponseFormat -> Value -> WebDriverTT t eff Value
expectEmptyObject ResponseFormat
format
  () -> WebDriverTT t eff ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#forward>.
goForward
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff ()
goForward :: WebDriverTT t eff ()
goForward = do
  (Url
baseUrl, ResponseFormat
format) <- WebDriverTT t eff (Url, ResponseFormat)
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff (Url, ResponseFormat)
theRequestContext
  let !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object []
  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/forward") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ResponseFormat -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ResponseFormat -> Value -> WebDriverTT t eff Value
expectEmptyObject ResponseFormat
format
  () -> WebDriverTT t eff ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#refresh>.
pageRefresh
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff ()
pageRefresh :: WebDriverTT t eff ()
pageRefresh = do
  (Url
baseUrl, ResponseFormat
format) <- WebDriverTT t eff (Url, ResponseFormat)
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff (Url, ResponseFormat)
theRequestContext
  let !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object []
  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/refresh") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ResponseFormat -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ResponseFormat -> Value -> WebDriverTT t eff Value
expectEmptyObject ResponseFormat
format
  () -> WebDriverTT t eff ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#get-title>.
getTitle
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff Text
getTitle :: WebDriverTT t eff Url
getTitle = do
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpGet (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/title")
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Url) -> WebDriverTT t eff Url
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#get-window-handle>.
getWindowHandle
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff ContextId
getWindowHandle :: WebDriverTT t eff ContextId
getWindowHandle = do
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpGet (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/window")
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Url) -> WebDriverTT t eff Url
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson
    WebDriverTT t eff Url
-> (Url -> WebDriverTT t eff ContextId)
-> WebDriverTT t eff ContextId
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ContextId -> WebDriverTT t eff ContextId
forall (m :: * -> *) a. Monad m => a -> m a
return (ContextId -> WebDriverTT t eff ContextId)
-> (Url -> ContextId) -> Url -> WebDriverTT t eff ContextId
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Url -> ContextId
ContextId)


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#close-window>.
closeWindow
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff [ContextId]
closeWindow :: WebDriverTT t eff [ContextId]
closeWindow = do
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpDelete (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/window")
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff [Value])
-> WebDriverTT t eff [Value]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff [Value]
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson
    WebDriverTT t eff [Value]
-> ([Value] -> WebDriverTT t eff [Url]) -> WebDriverTT t eff [Url]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ([WebDriverTT t eff Url] -> WebDriverTT t eff [Url]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence ([WebDriverTT t eff Url] -> WebDriverTT t eff [Url])
-> ([Value] -> [WebDriverTT t eff Url])
-> [Value]
-> WebDriverTT t eff [Url]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Value -> WebDriverTT t eff Url)
-> [Value] -> [WebDriverTT t eff Url]
forall a b. (a -> b) -> [a] -> [b]
map Value -> WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson)
    WebDriverTT t eff [Url]
-> ([Url] -> WebDriverTT t eff [ContextId])
-> WebDriverTT t eff [ContextId]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ([ContextId] -> WebDriverTT t eff [ContextId]
forall (m :: * -> *) a. Monad m => a -> m a
return ([ContextId] -> WebDriverTT t eff [ContextId])
-> ([Url] -> [ContextId]) -> [Url] -> WebDriverTT t eff [ContextId]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Url -> ContextId) -> [Url] -> [ContextId]
forall a b. (a -> b) -> [a] -> [b]
map Url -> ContextId
ContextId)


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#switch-to-window>.
switchToWindow
  :: (Monad eff, Monad (t eff), MonadTrans t, HasContextId a)
  => a
  -> WebDriverTT t eff ()
switchToWindow :: a -> WebDriverTT t eff ()
switchToWindow a
t = do
  let contextId :: ContextId
contextId = a -> ContextId
forall t. HasContextId t => t -> ContextId
contextIdOf a
t
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  let !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object [ Key
"handle" Key -> String -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= ContextId -> String
forall a. Show a => a -> String
show ContextId
contextId ]
  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/window") ByteString
payload
  () -> WebDriverTT t eff ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#get-window-handles>.
getWindowHandles
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff [ContextId]
getWindowHandles :: WebDriverTT t eff [ContextId]
getWindowHandles = do
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpGet (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/window/handles")
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff [Value])
-> WebDriverTT t eff [Value]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff [Value]
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson
    WebDriverTT t eff [Value]
-> ([Value] -> WebDriverTT t eff [Url]) -> WebDriverTT t eff [Url]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ([WebDriverTT t eff Url] -> WebDriverTT t eff [Url]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence ([WebDriverTT t eff Url] -> WebDriverTT t eff [Url])
-> ([Value] -> [WebDriverTT t eff Url])
-> [Value]
-> WebDriverTT t eff [Url]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Value -> WebDriverTT t eff Url)
-> [Value] -> [WebDriverTT t eff Url]
forall a b. (a -> b) -> [a] -> [b]
map Value -> WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson)
    WebDriverTT t eff [Url]
-> ([Url] -> WebDriverTT t eff [ContextId])
-> WebDriverTT t eff [ContextId]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ([ContextId] -> WebDriverTT t eff [ContextId]
forall (m :: * -> *) a. Monad m => a -> m a
return ([ContextId] -> WebDriverTT t eff [ContextId])
-> ([Url] -> [ContextId]) -> [Url] -> WebDriverTT t eff [ContextId]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Url -> ContextId) -> [Url] -> [ContextId]
forall a b. (a -> b) -> [a] -> [b]
map Url -> ContextId
ContextId)


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#new-window>
newWindow
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => ContextType -> WebDriverTT t eff (ContextId, ContextType)
newWindow :: ContextType -> WebDriverTT t eff (ContextId, ContextType)
newWindow ContextType
ctxTypeReq = do
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  let !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object [ Key
"type" Key -> ContextType -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= ContextType
ctxTypeReq ]
  Value
response <- Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/window/new") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
  ContextId
ctxId <- Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"handle" Value
response
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff ContextId)
-> WebDriverTT t eff ContextId
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff ContextId
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson
  ContextType
ctxType <- Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"type" Value
response
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff ContextType)
-> WebDriverTT t eff ContextType
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff ContextType
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson
  (ContextId, ContextType)
-> WebDriverTT t eff (ContextId, ContextType)
forall (m :: * -> *) a. Monad m => a -> m a
return (ContextId
ctxId, ContextType
ctxType)


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#switch-to-frame>.
switchToFrame
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => FrameReference
  -> WebDriverTT t eff ()
switchToFrame :: FrameReference -> WebDriverTT t eff ()
switchToFrame FrameReference
ref = do
  (Url
baseUrl, ResponseFormat
format) <- WebDriverTT t eff (Url, ResponseFormat)
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff (Url, ResponseFormat)
theRequestContext
  let
    !frame :: Value
frame = case FrameReference
ref of
      FrameReference
TopLevelFrame -> Value
Null
      FrameNumber Int
k -> Scientific -> Value
Number (Scientific -> Value) -> Scientific -> Value
forall a b. (a -> b) -> a -> b
$ Int -> Scientific
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
k
      FrameContainingElement ElementRef
element_id -> [Pair] -> Value
object [ Key
forall t. IsString t => t
_WEB_ELEMENT_ID Key -> String -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= ElementRef -> String
forall a. Show a => a -> String
show ElementRef
element_id ]

    !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object
      [ Key
"id" Key -> Value -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value -> Value
forall a. ToJSON a => a -> Value
toJSON Value
frame ]

  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/frame") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ResponseFormat -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ResponseFormat -> Value -> WebDriverTT t eff Value
expectEmptyObject ResponseFormat
format
  () -> WebDriverTT t eff ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#switch-to-parent-frame>.
switchToParentFrame
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff ()
switchToParentFrame :: WebDriverTT t eff ()
switchToParentFrame = do
  (Url
baseUrl, ResponseFormat
format) <- WebDriverTT t eff (Url, ResponseFormat)
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff (Url, ResponseFormat)
theRequestContext
  let !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object []
  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/frame/parent") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ResponseFormat -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ResponseFormat -> Value -> WebDriverTT t eff Value
expectEmptyObject ResponseFormat
format
  () -> WebDriverTT t eff ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#get-window-rect>.
getWindowRect
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff Rect
getWindowRect :: WebDriverTT t eff Rect
getWindowRect = do
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpGet (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/window/rect")
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Rect) -> WebDriverTT t eff Rect
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Rect
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#set-window-rect>.
setWindowRect
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => Rect
  -> WebDriverTT t eff Rect
setWindowRect :: Rect -> WebDriverTT t eff Rect
setWindowRect Rect
rect = do
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  let !payload :: ByteString
payload = Rect -> ByteString
forall a. ToJSON a => a -> ByteString
encode Rect
rect
  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/window/rect") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Rect) -> WebDriverTT t eff Rect
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Rect
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#maximize-window>.
maximizeWindow
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff Rect
maximizeWindow :: WebDriverTT t eff Rect
maximizeWindow = do
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  let !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object []
  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/window/maximize") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Rect) -> WebDriverTT t eff Rect
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Rect
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#minimize-window>.
minimizeWindow
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff Rect
minimizeWindow :: WebDriverTT t eff Rect
minimizeWindow = do
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  let !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object []
  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/window/minimize") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Rect) -> WebDriverTT t eff Rect
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Rect
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#fullscreen-window>.
fullscreenWindow
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff Rect
fullscreenWindow :: WebDriverTT t eff Rect
fullscreenWindow = do
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  let !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object []
  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/window/fullscreen") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Rect) -> WebDriverTT t eff Rect
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Rect
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#find-element>.
findElement
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => LocationStrategy
  -> Selector
  -> WebDriverTT t eff ElementRef
findElement :: LocationStrategy -> Url -> WebDriverTT t eff ElementRef
findElement LocationStrategy
strategy Url
selector = do
  (Url
baseUrl, ResponseFormat
format) <- WebDriverTT t eff (Url, ResponseFormat)
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff (Url, ResponseFormat)
theRequestContext
  let !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object [ Key
"value" Key -> Url -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Url
selector, Key
"using" Key -> Value -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= LocationStrategy -> Value
forall a. ToJSON a => a -> Value
toJSON LocationStrategy
strategy ]
  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/element") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= case ResponseFormat
format of
          ResponseFormat
SpecFormat -> Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
forall t. IsString t => t
_WEB_ELEMENT_ID
          ResponseFormat
ChromeFormat -> Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"ELEMENT"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Url) -> WebDriverTT t eff Url
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson
    WebDriverTT t eff Url
-> (Url -> WebDriverTT t eff ElementRef)
-> WebDriverTT t eff ElementRef
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ElementRef -> WebDriverTT t eff ElementRef
forall (m :: * -> *) a. Monad m => a -> m a
return (ElementRef -> WebDriverTT t eff ElementRef)
-> (Url -> ElementRef) -> Url -> WebDriverTT t eff ElementRef
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Url -> ElementRef
ElementRef)


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#find-elements>.
findElements
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => LocationStrategy
  -> Selector
  -> WebDriverTT t eff [ElementRef]
findElements :: LocationStrategy -> Url -> WebDriverTT t eff [ElementRef]
findElements LocationStrategy
strategy Url
selector = do
  (Url
baseUrl, ResponseFormat
format) <- WebDriverTT t eff (Url, ResponseFormat)
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff (Url, ResponseFormat)
theRequestContext
  let !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object [ Key
"value" Key -> Url -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Url
selector, Key
"using" Key -> Value -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= LocationStrategy -> Value
forall a. ToJSON a => a -> Value
toJSON LocationStrategy
strategy ]
  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/elements") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff [Value])
-> WebDriverTT t eff [Value]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff [Value]
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson
    WebDriverTT t eff [Value]
-> ([Value] -> WebDriverTT t eff [Value])
-> WebDriverTT t eff [Value]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= case ResponseFormat
format of
          ResponseFormat
SpecFormat -> (Value -> WebDriverTT t eff Value)
-> [Value] -> WebDriverTT t eff [Value]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
forall t. IsString t => t
_WEB_ELEMENT_ID)
          ResponseFormat
ChromeFormat -> (Value -> WebDriverTT t eff Value)
-> [Value] -> WebDriverTT t eff [Value]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"ELEMENT")
    WebDriverTT t eff [Value]
-> ([Value] -> WebDriverTT t eff [Url]) -> WebDriverTT t eff [Url]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Value -> WebDriverTT t eff Url)
-> [Value] -> WebDriverTT t eff [Url]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Value -> WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson
    WebDriverTT t eff [Url]
-> ([Url] -> WebDriverTT t eff [ElementRef])
-> WebDriverTT t eff [ElementRef]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ([ElementRef] -> WebDriverTT t eff [ElementRef]
forall (m :: * -> *) a. Monad m => a -> m a
return ([ElementRef] -> WebDriverTT t eff [ElementRef])
-> ([Url] -> [ElementRef])
-> [Url]
-> WebDriverTT t eff [ElementRef]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Url -> ElementRef) -> [Url] -> [ElementRef]
forall a b. (a -> b) -> [a] -> [b]
map Url -> ElementRef
ElementRef)


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#find-element-from-element>.
findElementFromElement
  :: (Monad eff, Monad (t eff), MonadTrans t, HasElementRef a)
  => LocationStrategy
  -> Selector
  -> a
  -> WebDriverTT t eff ElementRef
findElementFromElement :: LocationStrategy -> Url -> a -> WebDriverTT t eff ElementRef
findElementFromElement LocationStrategy
strategy Url
selector a
root = do
  (Url
baseUrl, ResponseFormat
format) <- WebDriverTT t eff (Url, ResponseFormat)
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff (Url, ResponseFormat)
theRequestContext
  let root_id :: Url
root_id = ElementRef -> Url
theElementRef (ElementRef -> Url) -> ElementRef -> Url
forall a b. (a -> b) -> a -> b
$ a -> ElementRef
forall t. HasElementRef t => t -> ElementRef
elementRefOf a
root
  let !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object [ Key
"value" Key -> Url -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Url
selector, Key
"using" Key -> Value -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= LocationStrategy -> Value
forall a. ToJSON a => a -> Value
toJSON LocationStrategy
strategy ]
  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/element/" Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
root_id Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/element") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= case ResponseFormat
format of
          ResponseFormat
SpecFormat -> Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
forall t. IsString t => t
_WEB_ELEMENT_ID
          ResponseFormat
ChromeFormat -> Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"ELEMENT"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Url) -> WebDriverTT t eff Url
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson
    WebDriverTT t eff Url
-> (Url -> WebDriverTT t eff ElementRef)
-> WebDriverTT t eff ElementRef
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ElementRef -> WebDriverTT t eff ElementRef
forall (m :: * -> *) a. Monad m => a -> m a
return (ElementRef -> WebDriverTT t eff ElementRef)
-> (Url -> ElementRef) -> Url -> WebDriverTT t eff ElementRef
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Url -> ElementRef
ElementRef)


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#find-elements-from-element>.
findElementsFromElement
  :: (Monad eff, Monad (t eff), MonadTrans t, HasElementRef a)
  => LocationStrategy
  -> Selector
  -> a
  -> WebDriverTT t eff [ElementRef]
findElementsFromElement :: LocationStrategy -> Url -> a -> WebDriverTT t eff [ElementRef]
findElementsFromElement LocationStrategy
strategy Url
selector a
root = do
  (Url
baseUrl, ResponseFormat
format) <- WebDriverTT t eff (Url, ResponseFormat)
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff (Url, ResponseFormat)
theRequestContext
  let root_id :: Url
root_id = ElementRef -> Url
theElementRef (ElementRef -> Url) -> ElementRef -> Url
forall a b. (a -> b) -> a -> b
$ a -> ElementRef
forall t. HasElementRef t => t -> ElementRef
elementRefOf a
root
  let !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object [ Key
"value" Key -> Url -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Url
selector, Key
"using" Key -> Value -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= LocationStrategy -> Value
forall a. ToJSON a => a -> Value
toJSON LocationStrategy
strategy ]
  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/element/" Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
root_id Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/elements") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff [Value])
-> WebDriverTT t eff [Value]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff [Value]
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson
    WebDriverTT t eff [Value]
-> ([Value] -> WebDriverTT t eff [Value])
-> WebDriverTT t eff [Value]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= case ResponseFormat
format of
          ResponseFormat
SpecFormat -> (Value -> WebDriverTT t eff Value)
-> [Value] -> WebDriverTT t eff [Value]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
forall t. IsString t => t
_WEB_ELEMENT_ID)
          ResponseFormat
ChromeFormat -> (Value -> WebDriverTT t eff Value)
-> [Value] -> WebDriverTT t eff [Value]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"ELEMENT")
    WebDriverTT t eff [Value]
-> ([Value] -> WebDriverTT t eff [Url]) -> WebDriverTT t eff [Url]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Value -> WebDriverTT t eff Url)
-> [Value] -> WebDriverTT t eff [Url]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Value -> WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson
    WebDriverTT t eff [Url]
-> ([Url] -> WebDriverTT t eff [ElementRef])
-> WebDriverTT t eff [ElementRef]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ([ElementRef] -> WebDriverTT t eff [ElementRef]
forall (m :: * -> *) a. Monad m => a -> m a
return ([ElementRef] -> WebDriverTT t eff [ElementRef])
-> ([Url] -> [ElementRef])
-> [Url]
-> WebDriverTT t eff [ElementRef]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Url -> ElementRef) -> [Url] -> [ElementRef]
forall a b. (a -> b) -> [a] -> [b]
map Url -> ElementRef
ElementRef)


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#get-active-element>.
getActiveElement
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff ElementRef
getActiveElement :: WebDriverTT t eff ElementRef
getActiveElement = do
  (Url
baseUrl, ResponseFormat
format) <- WebDriverTT t eff (Url, ResponseFormat)
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff (Url, ResponseFormat)
theRequestContext
  Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpGet (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/element/active")
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= case ResponseFormat
format of
          ResponseFormat
SpecFormat -> Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
forall t. IsString t => t
_WEB_ELEMENT_ID
          ResponseFormat
ChromeFormat -> Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"ELEMENT"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Url) -> WebDriverTT t eff Url
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson
    WebDriverTT t eff Url
-> (Url -> WebDriverTT t eff ElementRef)
-> WebDriverTT t eff ElementRef
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ElementRef -> WebDriverTT t eff ElementRef
forall (m :: * -> *) a. Monad m => a -> m a
return (ElementRef -> WebDriverTT t eff ElementRef)
-> (Url -> ElementRef) -> Url -> WebDriverTT t eff ElementRef
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Url -> ElementRef
ElementRef)


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#is-element-selected>.
isElementSelected
  :: (Monad eff, Monad (t eff), MonadTrans t, HasElementRef a)
  => a
  -> WebDriverTT t eff Bool
isElementSelected :: a -> WebDriverTT t eff Bool
isElementSelected a
element = do
  let elementRef :: Url
elementRef = ElementRef -> Url
theElementRef (ElementRef -> Url) -> ElementRef -> Url
forall a b. (a -> b) -> a -> b
$ a -> ElementRef
forall t. HasElementRef t => t -> ElementRef
elementRefOf a
element
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpGet (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/element/" Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
elementRef Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/selected")
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Bool) -> WebDriverTT t eff Bool
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Bool
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#get-element-attribute>.
getElementAttribute
  :: (Monad eff, Monad (t eff), MonadTrans t, HasElementRef a)
  => AttributeName
  -> a
  -> WebDriverTT t eff (Either Bool Text)
getElementAttribute :: Url -> a -> WebDriverTT t eff (Either Bool Url)
getElementAttribute Url
name a
element = do
  let elementRef :: Url
elementRef = ElementRef -> Url
theElementRef (ElementRef -> Url) -> ElementRef -> Url
forall a b. (a -> b) -> a -> b
$ a -> ElementRef
forall t. HasElementRef t => t -> ElementRef
elementRefOf a
element
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  Value
x <- Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpGet (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/element/" Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
elementRef Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/attribute/" Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url -> Url
E.encodeText Url
name)
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
  case Value
x of
    Value
Null -> Either Bool Url -> WebDriverTT t eff (Either Bool Url)
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool -> Either Bool Url
forall a b. a -> Either a b
Left Bool
False)
    String Url
"true" -> Either Bool Url -> WebDriverTT t eff (Either Bool Url)
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool -> Either Bool Url
forall a b. a -> Either a b
Left Bool
True)
    String Url
attr -> Either Bool Url -> WebDriverTT t eff (Either Bool Url)
forall (m :: * -> *) a. Monad m => a -> m a
return (Url -> Either Bool Url
forall a b. b -> Either a b
Right Url
attr)
    Value
_ -> JsonError -> WebDriverTT t eff (Either Bool Url)
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t) =>
JsonError -> WebDriverTT t eff a
throwJsonError (JsonError -> WebDriverTT t eff (Either Bool Url))
-> JsonError -> WebDriverTT t eff (Either Bool Url)
forall a b. (a -> b) -> a -> b
$ Url -> JsonError
JsonError Url
"Invalid element attribute response"


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#get-element-property>.
getElementProperty
  :: (Monad eff, Monad (t eff), MonadTrans t, HasElementRef a)
  => PropertyName
  -> a
  -> WebDriverTT t eff Value
getElementProperty :: Url -> a -> WebDriverTT t eff Value
getElementProperty Url
name a
element = do
  let elementRef :: Url
elementRef = ElementRef -> Url
theElementRef (ElementRef -> Url) -> ElementRef -> Url
forall a b. (a -> b) -> a -> b
$ a -> ElementRef
forall t. HasElementRef t => t -> ElementRef
elementRefOf a
element
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpGet (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/element/" Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
elementRef Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/property/" Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url -> Url
E.encodeText Url
name)
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#get-element-css-value>.
getElementCssValue
  :: (Monad eff, Monad (t eff), MonadTrans t, HasElementRef a)
  => CssPropertyName
  -> a
  -> WebDriverTT t eff Text
getElementCssValue :: Url -> a -> WebDriverTT t eff Url
getElementCssValue Url
name a
element = do
  let elementRef :: Url
elementRef = ElementRef -> Url
theElementRef (ElementRef -> Url) -> ElementRef -> Url
forall a b. (a -> b) -> a -> b
$ a -> ElementRef
forall t. HasElementRef t => t -> ElementRef
elementRefOf a
element
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpGet (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/element/" Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
elementRef Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/css/" Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
name)
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Url) -> WebDriverTT t eff Url
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#get-element-text>.
getElementText
  :: (Monad eff, Monad (t eff), MonadTrans t, HasElementRef a)
  => a
  -> WebDriverTT t eff Text
getElementText :: a -> WebDriverTT t eff Url
getElementText a
element = do
  let elementRef :: Url
elementRef = ElementRef -> Url
theElementRef (ElementRef -> Url) -> ElementRef -> Url
forall a b. (a -> b) -> a -> b
$ a -> ElementRef
forall t. HasElementRef t => t -> ElementRef
elementRefOf a
element
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpGet (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/element/" Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
elementRef Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/text")
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Url) -> WebDriverTT t eff Url
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#get-element-tag-name>.
getElementTagName
  :: (Monad eff, Monad (t eff), MonadTrans t, HasElementRef a)
  => a
  -> WebDriverTT t eff Text
getElementTagName :: a -> WebDriverTT t eff Url
getElementTagName a
element = do
  let elementRef :: Url
elementRef = ElementRef -> Url
theElementRef (ElementRef -> Url) -> ElementRef -> Url
forall a b. (a -> b) -> a -> b
$ a -> ElementRef
forall t. HasElementRef t => t -> ElementRef
elementRefOf a
element
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpGet (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/element/" Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
elementRef Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/name")
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Url) -> WebDriverTT t eff Url
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#get-element-rect>.
getElementRect
  :: (Monad eff, Monad (t eff), MonadTrans t, HasElementRef a)
  => a
  -> WebDriverTT t eff Rect
getElementRect :: a -> WebDriverTT t eff Rect
getElementRect a
element = do
  let elementRef :: Url
elementRef = ElementRef -> Url
theElementRef (ElementRef -> Url) -> ElementRef -> Url
forall a b. (a -> b) -> a -> b
$ a -> ElementRef
forall t. HasElementRef t => t -> ElementRef
elementRefOf a
element
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpGet (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/element/" Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
elementRef Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/rect")
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Rect) -> WebDriverTT t eff Rect
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Rect
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#is-element-enabled>.
isElementEnabled
  :: (Monad eff, Monad (t eff), MonadTrans t, HasElementRef a)
  => a
  -> WebDriverTT t eff Bool
isElementEnabled :: a -> WebDriverTT t eff Bool
isElementEnabled a
element = do
  let elementRef :: Url
elementRef = ElementRef -> Url
theElementRef (ElementRef -> Url) -> ElementRef -> Url
forall a b. (a -> b) -> a -> b
$ a -> ElementRef
forall t. HasElementRef t => t -> ElementRef
elementRefOf a
element
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpGet (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/element/" Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
elementRef Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/enabled")
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Bool) -> WebDriverTT t eff Bool
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Bool
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#get-computed-role>
getComputedRole
  :: (Monad eff, Monad (t eff), MonadTrans t, HasElementRef a)
  => a
  -> WebDriverTT t eff AriaRole
getComputedRole :: a -> WebDriverTT t eff Url
getComputedRole a
element = do
  let elementRef :: Url
elementRef = ElementRef -> Url
theElementRef (ElementRef -> Url) -> ElementRef -> Url
forall a b. (a -> b) -> a -> b
$ a -> ElementRef
forall t. HasElementRef t => t -> ElementRef
elementRefOf a
element
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpGet (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/element/" Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
elementRef Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/computedrole")
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Url) -> WebDriverTT t eff Url
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#get-computed-label>
getComputedLabel
  :: (Monad eff, Monad (t eff), MonadTrans t, HasElementRef a)
  => a
  -> WebDriverTT t eff AriaLabel
getComputedLabel :: a -> WebDriverTT t eff Url
getComputedLabel a
element = do
  let elementRef :: Url
elementRef = ElementRef -> Url
theElementRef (ElementRef -> Url) -> ElementRef -> Url
forall a b. (a -> b) -> a -> b
$ a -> ElementRef
forall t. HasElementRef t => t -> ElementRef
elementRefOf a
element
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpGet (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/element/" Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
elementRef Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/computedlabel")
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Url) -> WebDriverTT t eff Url
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#element-click>.
elementClick
  :: (Monad eff, Monad (t eff), MonadTrans t, HasElementRef a)
  => a
  -> WebDriverTT t eff ()
elementClick :: a -> WebDriverTT t eff ()
elementClick a
element = do
  (Url
baseUrl, ResponseFormat
format) <- WebDriverTT t eff (Url, ResponseFormat)
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff (Url, ResponseFormat)
theRequestContext
  let elementRef :: Url
elementRef = ElementRef -> Url
theElementRef (ElementRef -> Url) -> ElementRef -> Url
forall a b. (a -> b) -> a -> b
$ a -> ElementRef
forall t. HasElementRef t => t -> ElementRef
elementRefOf a
element
  let !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object []
  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/element/" Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
elementRef Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/click") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ResponseFormat -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ResponseFormat -> Value -> WebDriverTT t eff Value
expectEmptyObject ResponseFormat
format
  () -> WebDriverTT t eff ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#element-clear>.
elementClear
  :: (Monad eff, Monad (t eff), MonadTrans t, HasElementRef a)
  => a
  -> WebDriverTT t eff ()
elementClear :: a -> WebDriverTT t eff ()
elementClear a
element = do
  (Url
baseUrl, ResponseFormat
format) <- WebDriverTT t eff (Url, ResponseFormat)
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff (Url, ResponseFormat)
theRequestContext
  let elementRef :: Url
elementRef = ElementRef -> Url
theElementRef (ElementRef -> Url) -> ElementRef -> Url
forall a b. (a -> b) -> a -> b
$ a -> ElementRef
forall t. HasElementRef t => t -> ElementRef
elementRefOf a
element
  let !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object []
  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/element/" Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
elementRef Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/clear") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ResponseFormat -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ResponseFormat -> Value -> WebDriverTT t eff Value
expectEmptyObject ResponseFormat
format
  () -> WebDriverTT t eff ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#element-send-keys>.
elementSendKeys
  :: (Monad eff, Monad (t eff), MonadTrans t, HasElementRef a)
  => Text
  -> a
  -> WebDriverTT t eff ()
elementSendKeys :: Url -> a -> WebDriverTT t eff ()
elementSendKeys Url
text a
element = do
  let elementRef :: Url
elementRef = ElementRef -> Url
theElementRef (ElementRef -> Url) -> ElementRef -> Url
forall a b. (a -> b) -> a -> b
$ a -> ElementRef
forall t. HasElementRef t => t -> ElementRef
elementRefOf a
element
  (Url
baseUrl, ResponseFormat
format) <- WebDriverTT t eff (Url, ResponseFormat)
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff (Url, ResponseFormat)
theRequestContext
  let !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object [ Key
"text" Key -> Url -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Url
text ]
  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/element/" Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
elementRef Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/value") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ResponseFormat -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ResponseFormat -> Value -> WebDriverTT t eff Value
expectEmptyObject ResponseFormat
format
  () -> WebDriverTT t eff ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#get-page-source>.
getPageSource
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff Text
getPageSource :: WebDriverTT t eff Url
getPageSource = do
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpGet (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/source")
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Url) -> WebDriverTT t eff Url
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#get-page-source>. Does not dump the page source into the logs. :)
getPageSourceStealth
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff Text
getPageSourceStealth :: WebDriverTT t eff Url
getPageSourceStealth = do
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpSilentGet (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/source")
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Url) -> WebDriverTT t eff Url
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#execute-script>.
executeScript
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => Script
  -> [Value]
  -> WebDriverTT t eff Value
executeScript :: Url -> [Value] -> WebDriverTT t eff Value
executeScript Url
script [Value]
args = do
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  let !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object [ Key
"script" Key -> Url -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Url
script, Key
"args" Key -> Value -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= [Value] -> Value
forall a. ToJSON a => a -> Value
toJSON [Value]
args ]
  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/execute/sync") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#execute-async-script>.
executeAsyncScript
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => Script
  -> [Value]
  -> WebDriverTT t eff Value
executeAsyncScript :: Url -> [Value] -> WebDriverTT t eff Value
executeAsyncScript Url
script [Value]
args = do
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  let !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object [ Key
"script" Key -> Url -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Url
script, Key
"args" Key -> Value -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= [Value] -> Value
forall a. ToJSON a => a -> Value
toJSON [Value]
args ]
  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/execute/async") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#get-all-cookies>.
getAllCookies
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff [Cookie]
getAllCookies :: WebDriverTT t eff [Cookie]
getAllCookies = do
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpGet (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/cookie")
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff [Value])
-> WebDriverTT t eff [Value]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff [Value]
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson
    WebDriverTT t eff [Value]
-> ([Value] -> WebDriverTT t eff [Cookie])
-> WebDriverTT t eff [Cookie]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Value -> WebDriverTT t eff Cookie)
-> [Value] -> WebDriverTT t eff [Cookie]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Value -> WebDriverTT t eff Cookie
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#get-named-cookie>.
getNamedCookie
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => CookieName
  -> WebDriverTT t eff Cookie
getNamedCookie :: Url -> WebDriverTT t eff Cookie
getNamedCookie Url
name = do
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpGet (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/cookie/" Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> String -> Url
T.pack (String -> String
E.encode (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ Url -> String
unpack Url
name))
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Cookie) -> WebDriverTT t eff Cookie
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Cookie
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#add-cookie>.
addCookie
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => Cookie
  -> WebDriverTT t eff ()
addCookie :: Cookie -> WebDriverTT t eff ()
addCookie Cookie
c = do
  (Url
baseUrl, ResponseFormat
format) <- WebDriverTT t eff (Url, ResponseFormat)
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff (Url, ResponseFormat)
theRequestContext
  let !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object [ Key
"cookie" Key -> Cookie -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Cookie
c ]
  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpSilentPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/cookie") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ResponseFormat -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ResponseFormat -> Value -> WebDriverTT t eff Value
expectEmptyObject ResponseFormat
format
  () -> WebDriverTT t eff ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#delete-cookie>.
deleteCookie
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => CookieName
  -> WebDriverTT t eff ()
deleteCookie :: Url -> WebDriverTT t eff ()
deleteCookie Url
name = do
  (Url
baseUrl, ResponseFormat
format) <- WebDriverTT t eff (Url, ResponseFormat)
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff (Url, ResponseFormat)
theRequestContext
  Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpDelete (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/cookie/" Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> String -> Url
T.pack (String -> String
E.encode (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ Url -> String
unpack Url
name))
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ResponseFormat -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ResponseFormat -> Value -> WebDriverTT t eff Value
expectEmptyObject ResponseFormat
format
  () -> WebDriverTT t eff ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#delete-all-cookies>.
deleteAllCookies
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff ()
deleteAllCookies :: WebDriverTT t eff ()
deleteAllCookies = do
  (Url
baseUrl, ResponseFormat
format) <- WebDriverTT t eff (Url, ResponseFormat)
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff (Url, ResponseFormat)
theRequestContext
  Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpDelete (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/cookie")
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ResponseFormat -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ResponseFormat -> Value -> WebDriverTT t eff Value
expectEmptyObject ResponseFormat
format
  () -> WebDriverTT t eff ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#perform-actions>. For a variant on this endpoint that does not log the request and response, see `performActionsStealth`.
performActions
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => [Action]
  -> WebDriverTT t eff ()
performActions :: [Action] -> WebDriverTT t eff ()
performActions = Bool -> [Action] -> WebDriverTT t eff ()
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Bool -> [Action] -> WebDriverTT t eff ()
_performActions Bool
False


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#perform-actions>. This function is identical to `performActions` except that it does not log the request or response. Handy if the action includes secret info.
performActionsStealth
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => [Action]
  -> WebDriverTT t eff ()
performActionsStealth :: [Action] -> WebDriverTT t eff ()
performActionsStealth = Bool -> [Action] -> WebDriverTT t eff ()
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Bool -> [Action] -> WebDriverTT t eff ()
_performActions Bool
True


_performActions
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => Bool
  -> [Action]
  -> WebDriverTT t eff ()
_performActions :: Bool -> [Action] -> WebDriverTT t eff ()
_performActions Bool
stealth [Action]
action = do
  (Url
baseUrl, ResponseFormat
format) <- WebDriverTT t eff (Url, ResponseFormat)
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff (Url, ResponseFormat)
theRequestContext
  let !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object [ Key
"actions" Key -> Value -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= [Action] -> Value
forall a. ToJSON a => a -> Value
toJSON [Action]
action ]
  let httpMethod :: Url -> ByteString -> WebDriverTT t eff HttpResponse
httpMethod = if Bool
stealth then Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpSilentPost else Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost
  Url -> ByteString -> WebDriverTT t eff HttpResponse
httpMethod (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/actions") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ResponseFormat -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ResponseFormat -> Value -> WebDriverTT t eff Value
expectEmptyObject ResponseFormat
format
  () -> WebDriverTT t eff ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#release-actions>.
releaseActions
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff ()
releaseActions :: WebDriverTT t eff ()
releaseActions = do
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpDelete (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/actions")
  () -> WebDriverTT t eff ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#dismiss-alert>.
dismissAlert
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff ()
dismissAlert :: WebDriverTT t eff ()
dismissAlert = do
  (Url
baseUrl, ResponseFormat
format) <- WebDriverTT t eff (Url, ResponseFormat)
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff (Url, ResponseFormat)
theRequestContext
  let !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object []
  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/alert/dismiss") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ResponseFormat -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ResponseFormat -> Value -> WebDriverTT t eff Value
expectEmptyObject ResponseFormat
format
  () -> WebDriverTT t eff ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#accept-alert>.
acceptAlert
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff ()
acceptAlert :: WebDriverTT t eff ()
acceptAlert = do
  (Url
baseUrl, ResponseFormat
format) <- WebDriverTT t eff (Url, ResponseFormat)
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff (Url, ResponseFormat)
theRequestContext
  let !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object []
  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/alert/accept") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ResponseFormat -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ResponseFormat -> Value -> WebDriverTT t eff Value
expectEmptyObject ResponseFormat
format
  () -> WebDriverTT t eff ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#get-alert-text>.
getAlertText
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff (Maybe Text)
getAlertText :: WebDriverTT t eff (Maybe Url)
getAlertText = do
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  Value
msg <- Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpGet (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/alert/text")
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
  case Value
msg of
    Value
Null -> Maybe Url -> WebDriverTT t eff (Maybe Url)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe Url
forall a. Maybe a
Nothing
    String Url
text -> Maybe Url -> WebDriverTT t eff (Maybe Url)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe Url -> WebDriverTT t eff (Maybe Url))
-> Maybe Url -> WebDriverTT t eff (Maybe Url)
forall a b. (a -> b) -> a -> b
$ Url -> Maybe Url
forall a. a -> Maybe a
Just Url
text
    Value
_ -> JsonError -> WebDriverTT t eff (Maybe Url)
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t) =>
JsonError -> WebDriverTT t eff a
throwJsonError (JsonError -> WebDriverTT t eff (Maybe Url))
-> JsonError -> WebDriverTT t eff (Maybe Url)
forall a b. (a -> b) -> a -> b
$ Url -> JsonError
JsonError Url
"Invalid alert text response"


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#send-alert-text>.
sendAlertText
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => Text
  -> WebDriverTT t eff ()
sendAlertText :: Url -> WebDriverTT t eff ()
sendAlertText Url
msg = do
  (Url
baseUrl, ResponseFormat
format) <- WebDriverTT t eff (Url, ResponseFormat)
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff (Url, ResponseFormat)
theRequestContext
  let !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object [ Key
"text" Key -> Url -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Url
msg ]
  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/alert/text") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ResponseFormat -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ResponseFormat -> Value -> WebDriverTT t eff Value
expectEmptyObject ResponseFormat
format
  () -> WebDriverTT t eff ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#take-screenshot>.
takeScreenshot
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff SB.ByteString
takeScreenshot :: WebDriverTT t eff ByteString
takeScreenshot = do
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  Either String ByteString
result <- Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpGet (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/screenshot")
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Url) -> WebDriverTT t eff Url
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson
    WebDriverTT t eff Url
-> (Url -> WebDriverTT t eff (Either String ByteString))
-> WebDriverTT t eff (Either String ByteString)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Either String ByteString
-> WebDriverTT t eff (Either String ByteString)
forall (m :: * -> *) a. Monad m => a -> m a
return (Either String ByteString
 -> WebDriverTT t eff (Either String ByteString))
-> (Url -> Either String ByteString)
-> Url
-> WebDriverTT t eff (Either String ByteString)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Either String ByteString
B64.decode (ByteString -> Either String ByteString)
-> (Url -> ByteString) -> Url -> Either String ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Url -> ByteString
encodeUtf8)
  case Either String ByteString
result of
    Right ByteString
img -> ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return ByteString
img
    Left String
str -> WDError -> WebDriverTT t eff ByteString
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t) =>
WDError -> WebDriverTT t eff a
throwError (WDError -> WebDriverTT t eff ByteString)
-> WDError -> WebDriverTT t eff ByteString
forall a b. (a -> b) -> a -> b
$ Url -> WDError
ImageDecodeError (Url -> WDError) -> Url -> WDError
forall a b. (a -> b) -> a -> b
$ String -> Url
T.pack String
str


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#take-element-screenshot>.
takeElementScreenshot
  :: (Monad eff, Monad (t eff), MonadTrans t, HasElementRef a)
  => a
  -> WebDriverTT t eff SB.ByteString
takeElementScreenshot :: a -> WebDriverTT t eff ByteString
takeElementScreenshot a
element = do
  let elementRef :: Url
elementRef = ElementRef -> Url
theElementRef (ElementRef -> Url) -> ElementRef -> Url
forall a b. (a -> b) -> a -> b
$ a -> ElementRef
forall t. HasElementRef t => t -> ElementRef
elementRefOf a
element
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  Either String ByteString
result <- Url -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> WebDriverTT t eff HttpResponse
httpGet (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/element/" Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
elementRef Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/screenshot")
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Url) -> WebDriverTT t eff Url
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson
    WebDriverTT t eff Url
-> (Url -> WebDriverTT t eff (Either String ByteString))
-> WebDriverTT t eff (Either String ByteString)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Either String ByteString
-> WebDriverTT t eff (Either String ByteString)
forall (m :: * -> *) a. Monad m => a -> m a
return (Either String ByteString
 -> WebDriverTT t eff (Either String ByteString))
-> (Url -> Either String ByteString)
-> Url
-> WebDriverTT t eff (Either String ByteString)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Either String ByteString
B64.decode (ByteString -> Either String ByteString)
-> (Url -> ByteString) -> Url -> Either String ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Url -> ByteString
encodeUtf8)
  case Either String ByteString
result of
    Right ByteString
img -> ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return ByteString
img
    Left String
str -> WDError -> WebDriverTT t eff ByteString
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t) =>
WDError -> WebDriverTT t eff a
throwError (WDError -> WebDriverTT t eff ByteString)
-> WDError -> WebDriverTT t eff ByteString
forall a b. (a -> b) -> a -> b
$ Url -> WDError
ImageDecodeError (Url -> WDError) -> Url -> WDError
forall a b. (a -> b) -> a -> b
$ String -> Url
T.pack String
str


-- | See <https://w3c.github.io/webdriver/webdriver-spec.html#print-page>. You may also be interested in `decodeBase64EncodedPdf` and `writeBase64EncodedPdf`.
printPage
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => PrintOptions -> WebDriverTT t eff Base64EncodedPdf
printPage :: PrintOptions -> WebDriverTT t eff Base64EncodedPdf
printPage PrintOptions
opts = do
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  let !payload :: ByteString
payload = Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Value -> ByteString) -> Value -> ByteString
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object [ Key
"parameters" Key -> PrintOptions -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= PrintOptions
opts ]
  Url -> ByteString -> WebDriverTT t eff HttpResponse
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> ByteString -> WebDriverTT t eff HttpResponse
httpPost (Url
baseUrl Url -> Url -> Url
forall a. Semigroup a => a -> a -> a
<> Url
"/print") ByteString
payload
    WebDriverTT t eff HttpResponse
-> (HttpResponse -> WebDriverTT t eff ByteString)
-> WebDriverTT t eff ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ByteString -> WebDriverTT t eff ByteString
forall (m :: * -> *) a. Monad m => a -> m a
return (ByteString -> WebDriverTT t eff ByteString)
-> (HttpResponse -> ByteString)
-> HttpResponse
-> WebDriverTT t eff ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HttpResponse -> ByteString
_responseBody)
    WebDriverTT t eff ByteString
-> (ByteString -> WebDriverTT t eff Value)
-> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ByteString -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
ByteString -> WebDriverTT t eff Value
parseJson
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Value) -> WebDriverTT t eff Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
Url -> Value -> WebDriverTT t eff Value
lookupKeyJson Url
"value"
    WebDriverTT t eff Value
-> (Value -> WebDriverTT t eff Base64EncodedPdf)
-> WebDriverTT t eff Base64EncodedPdf
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> WebDriverTT t eff Base64EncodedPdf
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, FromJSON a) =>
Value -> WebDriverTT t eff a
constructFromJson


-- | Detect empty responses by response format. Necessary because chromedriver is not strictly spec compliant.
expectEmptyObject
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => ResponseFormat
  -> Value
  -> WebDriverTT t eff Value
expectEmptyObject :: ResponseFormat -> Value -> WebDriverTT t eff Value
expectEmptyObject ResponseFormat
format Value
value = case ResponseFormat
format of
  ResponseFormat
SpecFormat -> (Value -> Bool) -> Url -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, Show a) =>
(a -> Bool) -> Url -> a -> WebDriverTT t eff a
expectIs (\Value
x -> Value -> [Value] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Value
x [Value
Null, [Pair] -> Value
object []]) Url
"empty object or null" Value
value
  ResponseFormat
ChromeFormat -> Value -> Value -> WebDriverTT t eff Value
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t, Eq a, Show a) =>
a -> a -> WebDriverTT t eff a
expect Value
Null Value
value


theRequestContext
  :: (Monad eff, Monad (t eff), MonadTrans t)
  => WebDriverTT t eff (Url, ResponseFormat)
theRequestContext :: WebDriverTT t eff (Url, ResponseFormat)
theRequestContext = do
  Url
baseUrl <- WebDriverTT t eff Url
forall (eff :: * -> *) (t :: (* -> *) -> * -> *).
(Monad eff, Monad (t eff), MonadTrans t) =>
WebDriverTT t eff Url
theRemoteUrlWithSession
  ResponseFormat
format <- (R WDError WDLog WDEnv -> ResponseFormat)
-> WebDriverTT t eff ResponseFormat
forall (eff :: * -> *) (t :: (* -> *) -> * -> *) a.
(Monad eff, Monad (t eff), MonadTrans t) =>
(R WDError WDLog WDEnv -> a) -> WebDriverTT t eff a
fromEnv (WDEnv -> ResponseFormat
_responseFormat (WDEnv -> ResponseFormat)
-> (R WDError WDLog WDEnv -> WDEnv)
-> R WDError WDLog WDEnv
-> ResponseFormat
forall b c a. (b -> c) -> (a -> b) -> a -> c
. R WDError WDLog WDEnv -> WDEnv
forall e w r. R e w r -> r
_env)
  (Url, ResponseFormat) -> WebDriverTT t eff (Url, ResponseFormat)
forall (m :: * -> *) a. Monad m => a -> m a
return (Url
baseUrl, ResponseFormat
format)