Stability | experimental |
---|---|
Maintainer | Charles Strahan <charles.c.strahan@gmail.com> |
Safe Haskell | None |
- newtype HappybaraT sess m a = HappybaraT {
- unHappybaraT :: StateT (HappybaraState sess) m a
- type Happybara sess a = HappybaraT sess IO a
- runHappybaraT :: (Driver sess, MonadIO m, MonadBase IO m, MonadBaseControl IO m) => sess -> HappybaraT sess m a -> m a
- runHappybara :: Driver sess => sess -> Happybara sess a -> IO a
- data Exactness
- = Exact
- | PreferExact
- | Inexact
- data SingleMatchStrategy
- = MatchFirst
- | MatchOne
- setWait :: Monad m => Double -> HappybaraT sess m ()
- getWait :: (Functor m, Monad m) => HappybaraT sess m Double
- setExactness :: Monad m => Exactness -> HappybaraT sess m ()
- getExactness :: (Functor m, Monad m) => HappybaraT sess m Exactness
- setSingleMatchStrategy :: Monad m => SingleMatchStrategy -> HappybaraT sess m ()
- getSingleMatchStrategy :: (Functor m, Monad m) => HappybaraT sess m SingleMatchStrategy
- getDriver :: (Functor m, Monad m) => HappybaraT sess m sess
- withDriver :: (Driver sess, Functor m, Monad m) => sess -> HappybaraT sess m a -> HappybaraT sess m a
- getCurrentNode :: (Driver sess, Functor m, Monad m) => HappybaraT sess m (Maybe (Node sess))
- data HappybaraState sess = HappybaraState {
- hsDriver :: sess
- hsWait :: Double
- hsExactness :: Exactness
- hsIsSynced :: Bool
- hsSingleMatchStrategy :: SingleMatchStrategy
- hsCurrentNode :: Maybe (Node sess)
- visit :: (Driver sess, Monad m, MonadBase IO m) => Text -> HappybaraT sess m ()
- currentUrl :: (Driver sess, Monad m, MonadBase IO m) => HappybaraT sess m Text
- responseHeaders :: (Driver sess, Monad m, MonadBase IO m) => HappybaraT sess m ResponseHeaders
- statusCode :: (Driver sess, Monad m, MonadBase IO m) => HappybaraT sess m Status
- html :: (Driver sess, Monad m, MonadBase IO m) => HappybaraT sess m Text
- goBack :: (Driver sess, Monad m, MonadBase IO m) => HappybaraT sess m ()
- goForward :: (Driver sess, Monad m, MonadBase IO m) => HappybaraT sess m ()
- reset :: (Driver sess, Monad m, MonadBase IO m) => HappybaraT sess m ()
- saveScreenshot :: (Driver sess, Monad m, MonadBase IO m) => Text -> Int -> Int -> HappybaraT sess m ()
- withinNode :: (Driver sess, Functor m, Monad m) => Node sess -> HappybaraT sess m a -> HappybaraT sess m a
- withinPage :: (Driver sess, Functor m, Monad m) => HappybaraT sess m a -> HappybaraT sess m a
- withinFrame :: (Driver sess, Monad m, MonadBase IO m, MonadBaseControl IO m) => FrameSelector -> HappybaraT sess m Status -> HappybaraT sess m Status
- withinWindow :: (Driver sess, Monad m, MonadBase IO m, MonadBaseControl IO m) => FrameSelector -> HappybaraT sess m Status -> HappybaraT sess m Status
- executeScript :: (Driver sess, Monad m, MonadBase IO m) => Text -> HappybaraT sess m ()
- evaluateScript :: (Driver sess, Monad m, MonadBase IO m) => Text -> HappybaraT sess m Value
- findXPath :: (Driver sess, Monad m, MonadBase IO m) => Text -> HappybaraT sess m [Node sess]
- findCSS :: (Driver sess, Monad m, MonadBase IO m) => Text -> HappybaraT sess m [Node sess]
- allText :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m Text
- visibleText :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m Text
- attr :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> Text -> HappybaraT sess m (Maybe Text)
- getValue :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m NodeValue
- setValue :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> NodeValue -> HappybaraT sess m ()
- selectOption :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m ()
- unselectOption :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m ()
- click :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m ()
- rightClick :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m ()
- doubleClick :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m ()
- hover :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m ()
- dragTo :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> Node sess -> HappybaraT sess m ()
- tagName :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m Text
- isVisible :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m Bool
- isChecked :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m Bool
- isSelected :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m Bool
- isDisabled :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m Bool
- path :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m Text
- trigger :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> Text -> HappybaraT sess m ()
- nodeEq :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> Node sess -> HappybaraT sess m Bool
- synchronize :: (Functor m, Monad m, MonadIO m, MonadBase IO m, MonadBaseControl IO m) => HappybaraT sess m a -> HappybaraT sess m a
Happybara Monad
newtype HappybaraT sess m a Source
The Happybara monad transformer.
Requirements:
HappybaraT | |
|
MonadBase b m => MonadBase b (HappybaraT sess m) | |
MonadBaseControl b m => MonadBaseControl b (HappybaraT sess m) | |
MonadTrans (HappybaraT sess) | |
MonadTransControl (HappybaraT sess) | |
Monad m => Monad (HappybaraT sess m) | |
Functor m => Functor (HappybaraT sess m) | |
(Monad m, Functor m) => Applicative (HappybaraT sess m) | |
MonadIO m => MonadIO (HappybaraT sess m) |
type Happybara sess a = HappybaraT sess IO aSource
If you don't want to transform an existing monad, this type synonym
conveniently sets the inner monad to IO
.
runHappybaraT :: (Driver sess, MonadIO m, MonadBase IO m, MonadBaseControl IO m) => sess -> HappybaraT sess m a -> m aSource
Evaluate the happybara computation.
runHappybara :: Driver sess => sess -> Happybara sess a -> IO aSource
Evaluate the happybara computation.
Monad Settings & State
The exactness requirement when using the Query
DSL.
Exact | Find elements that match exactly. |
PreferExact | First try to find exact matches; if that fails, fall back to inexact matches. |
Inexact | Find all elements that partially match - e.g. the given string is infix of (but not necessarily equal to) whatever property (id, attribute, etc) is being queried over. |
data SingleMatchStrategy Source
This controls the Query
behavior of findOrFail
in
the presence of multiple matches.
MatchFirst | If no elements matched, throw |
MatchOne | If no elements matched, throw |
setWait :: Monad m => Double -> HappybaraT sess m ()Source
Set the number of seconds to wait between retrying an action. See
synchronize
.
getWait :: (Functor m, Monad m) => HappybaraT sess m DoubleSource
Get the number of seconds to wait between retrying an action. See
synchronize
.
setExactness :: Monad m => Exactness -> HappybaraT sess m ()Source
Set the required level of exactness for queries. See Exactness
.
getExactness :: (Functor m, Monad m) => HappybaraT sess m ExactnessSource
Get the required level of exactness for queries. See Exactness
.
setSingleMatchStrategy :: Monad m => SingleMatchStrategy -> HappybaraT sess m ()Source
Set the query matching strategy. See SingleMatchStrategy
.
getSingleMatchStrategy :: (Functor m, Monad m) => HappybaraT sess m SingleMatchStrategySource
Get the query matching strategy. See SingleMatchStrategy
.
getDriver :: (Functor m, Monad m) => HappybaraT sess m sessSource
withDriver :: (Driver sess, Functor m, Monad m) => sess -> HappybaraT sess m a -> HappybaraT sess m aSource
Use a different driver for the given action.
Note: This sets the current scope via withinPage
before invoking the
action, because the current node was acquired from a different driver
instance. Similarly, it's a bad idea to return a Node
from this new driver,
as you might try to use it with the wrong driver instance.
getCurrentNode :: (Driver sess, Functor m, Monad m) => HappybaraT sess m (Maybe (Node sess))Source
Get the node that all queries are currently relative to.
data HappybaraState sess Source
HappybaraState | |
|
Browser State
currentUrl :: (Driver sess, Monad m, MonadBase IO m) => HappybaraT sess m TextSource
responseHeaders :: (Driver sess, Monad m, MonadBase IO m) => HappybaraT sess m ResponseHeadersSource
statusCode :: (Driver sess, Monad m, MonadBase IO m) => HappybaraT sess m StatusSource
saveScreenshot :: (Driver sess, Monad m, MonadBase IO m) => Text -> Int -> Int -> HappybaraT sess m ()Source
Scoping
withinNode :: (Driver sess, Functor m, Monad m) => Node sess -> HappybaraT sess m a -> HappybaraT sess m aSource
Make all queries relative to the supplied node within the given action.
withinPage :: (Driver sess, Functor m, Monad m) => HappybaraT sess m a -> HappybaraT sess m aSource
Make all queries relative to the document in the given action.
withinFrame :: (Driver sess, Monad m, MonadBase IO m, MonadBaseControl IO m) => FrameSelector -> HappybaraT sess m Status -> HappybaraT sess m StatusSource
withinWindow :: (Driver sess, Monad m, MonadBase IO m, MonadBaseControl IO m) => FrameSelector -> HappybaraT sess m Status -> HappybaraT sess m StatusSource
JavaScript Execution
executeScript :: (Driver sess, Monad m, MonadBase IO m) => Text -> HappybaraT sess m ()Source
evaluateScript :: (Driver sess, Monad m, MonadBase IO m) => Text -> HappybaraT sess m ValueSource
Primitive Queries
Node Manipulation
visibleText :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m TextSource
attr :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> Text -> HappybaraT sess m (Maybe Text)Source
getValue :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m NodeValueSource
setValue :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> NodeValue -> HappybaraT sess m ()Source
selectOption :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m ()Source
unselectOption :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m ()Source
rightClick :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m ()Source
doubleClick :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m ()Source
dragTo :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> Node sess -> HappybaraT sess m ()Source
isSelected :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m BoolSource
isDisabled :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m BoolSource
trigger :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> Text -> HappybaraT sess m ()Source
nodeEq :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> Node sess -> HappybaraT sess m BoolSource
Async Support
synchronize :: (Functor m, Monad m, MonadIO m, MonadBase IO m, MonadBaseControl IO m) => HappybaraT sess m a -> HappybaraT sess m aSource
Invoke the given action until:
- The action no longer throws
InvalidElementException
, or - The total duration of the attempts excedes the number of seconds specified by
getWait
, in which case the exception is rethrown.
A couple notes:
- The action is retried every 0.05 seconds.
- To prevent exponential retrying, any inner calls to
synchronize
are ignored. - Unless you're doing something advanced,
like implementing custom
Query
instances, you probably don't need to invoke this directly.