webdriver-0: Test/WebDriver.hs
{-|
This module serves as the top-level interface to the Haskell WebDriver bindings,
providing most of the functionality you're likely to want.
-}
module Test.WebDriver
( -- * WebDriver sessions
WD(..), WDSession(..), defaultSession, SessionId(..)
-- * Running WebDriver tests
, module Test.WebDriver
-- * Capabilities and configuration
, Capabilities(..), defaultCaps, allCaps
, Platform(..), ProxyType(..)
-- ** Browser-specific configuration
, Browser(..), firefox, chrome, ie, opera, iPhone, iPad, android
-- * WebDriver commands
, module Test.WebDriver.Commands
-- * Exceptions
, InvalidURL(..), NoSessionId(..), BadJSON(..)
, HTTPStatusUnknown(..), HTTPConnError(..)
, UnknownCommand(..), ServerError(..)
, FailedCommand(..), FailedCommandType(..)
, FailedCommandInfo(..), StackFrame(..)
, mkFailedCommandInfo, failedCommand
) where
import Test.WebDriver.Types
import Test.WebDriver.Commands
import Control.Applicative
import Control.Monad.State.Strict
import Control.Exception.Lifted
import Prelude hiding (catch)
-- |Executes a 'WD' computation within the 'IO' monad, using the given
-- 'WDSession'.
runWD :: WDSession -> WD a -> IO a
runWD sess (WD wd) = evalStateT wd sess
-- |Like 'runWD', but automatically creates a session beforehand and closes it
-- afterwards. This is a very common use case.
runSession :: WDSession -> Capabilities -> WD a -> IO a
runSession s caps wd = runWD s $ createSession caps >> wd <* closeSession
-- |Locally sets a 'WDSession' for use within the given 'WD' action.
-- The state of the outer action is unaffected by this function.
-- This function is useful if you need to work with multiple sessions at once.
withSession :: WDSession -> WD a -> WD a
withSession s' (WD wd) = WD . lift $ evalStateT wd s'
-- |A finalizer ensuring that the session is always closed at the end of
-- the given 'WD' action, regardless of any exceptions.
finallyClose:: WD a -> WD a
finallyClose wd = closeOnException wd <* closeSession
-- |A variant of 'finallyClose' that only closes the session when an
-- asynchronous exception is thrown, but otherwise leaves the session open
-- if the action was successful.
closeOnException :: WD a -> WD a
closeOnException wd = wd `onException` closeSession