happybara-0.0.1: Acceptance test framework for web applications

Stabilityexperimental
MaintainerCharles Strahan <charles.c.strahan@gmail.com>
Safe HaskellNone

Happybara.Monad

Contents

Description

 

Synopsis

Happybara Monad

newtype HappybaraT sess m a Source

The Happybara monad transformer.

Requirements:

Constructors

HappybaraT 

Fields

unHappybaraT :: StateT (HappybaraState sess) m a
 

Instances

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

data Exactness Source

The exactness requirement when using the Query DSL.

Constructors

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.

Constructors

MatchFirst

If no elements matched, throw ElementNotFoundException; otherwise, return the first matching element.

MatchOne

If no elements matched, throw ElementNotFoundException; if more than element matches, throw AmbiguousElementException.

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.

Browser State

visit :: (Driver sess, Monad m, MonadBase IO m) => Text -> HappybaraT sess m ()Source

html :: (Driver sess, Monad m, MonadBase IO m) => HappybaraT sess m TextSource

goBack :: (Driver sess, Monad m, MonadBase IO m) => HappybaraT sess m ()Source

goForward :: (Driver sess, Monad m, MonadBase IO m) => HappybaraT sess m ()Source

reset :: (Driver sess, Monad m, MonadBase IO m) => HappybaraT sess m ()Source

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.

JavaScript Execution

executeScript :: (Driver sess, Monad m, MonadBase IO m) => Text -> HappybaraT sess m ()Source

Primitive Queries

findXPath :: (Driver sess, Monad m, MonadBase IO m) => Text -> HappybaraT sess m [Node sess]Source

findCSS :: (Driver sess, Monad m, MonadBase IO m) => Text -> HappybaraT sess m [Node sess]Source

Node Manipulation

allText :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m TextSource

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

click :: (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

hover :: (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

tagName :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m TextSource

isVisible :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m BoolSource

isChecked :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m BoolSource

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

path :: (Driver sess, Monad m, MonadBase IO m) => Node sess -> HappybaraT sess m TextSource

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.