thematthopkins / elm-test-journey / TestJourney.Page

Create Page Objects for elm-test-journey.

Building the Page Model

root : List Test.Html.Selector.Selector -> (Finder -> Element children) -> Element children

Sets up the context for the rest of the page object. An empty selector will match the root of the view (usually the body tag).

page =
    root []
        (\rootElement ->
            { self = rootElement
            , myChildElement = singleTestAttr rootElement "myChildElement"
            }
        )

multiple : Finder -> TestJourney.Internal.FriendlyName -> List Test.Html.Selector.Selector -> Basics.Int -> Element {}

Represents a list of nodes.

page =
    root []
        (\rootElement ->
            { self = rootElement
            , myListItem =
                multiple rootElement
                    "myListItem"
                    [ Selector.attribute (Attributes.attribute "data-test" "myListItem")
                    ]
            }
        )

element =
    page.myListItem 1

multipleRecord : Finder -> TestJourney.Internal.FriendlyName -> List Test.Html.Selector.Selector -> (Finder -> Element children) -> Basics.Int -> Element children

Represents a list of nodes w/ custom children.

page =
    root []
        (\rootElement ->
            { self = rootElement
            , myListItem =
                multipleRecord rootElement
                    "myListItem"
                    [ Selector.attribute
                        (Attributes.attribute "data-test" "myListItem")
                    ]
                    (\myListItem ->
                        { self = myListItem
                        , label = singleTestAttr myListItem "itemLabel"
                        }
                    )
            }
        )

element =
    page.myListItem 0 |> .label

single : Finder -> TestJourney.Internal.FriendlyName -> List Test.Html.Selector.Selector -> Element {}

Creates an 'Element' referencing a single node.

page =
    root
        []
        (\rootElement ->
            { self = rootElement
            , myChildElement = single rootElement "myChildElement" [ Selector.attribute (Attributes.attribute "data-test" "myChildElement") ]
            }
        )

element =
    page.myChildElement

singleRecord : Finder -> TestJourney.Internal.FriendlyName -> List Test.Html.Selector.Selector -> (Finder -> Element children) -> Element children

Creates an 'Element' referencing a single node, w/ custom children.

page =
    root []
        (\rootElement ->
            { self = rootElement
            , myElementWithChildren =
                singleRecord rootElement
                    "myChildElement"
                    [ Selector.attribute (Attributes.attribute "data-test" "myChildElement") ]
                    (\myElementWithChildren ->
                        { self = myElementWithChildren
                        , childOfChild = singleTestAttr myElementWithChildren "childOfChild"
                        }
                    )
            }
        )

element =
    page.myElementWithChildren.childOfChild

Types


type alias Element children =
{ children | self : Finder }

An element represents a series of selectors and functions that result in finding a single specific node in your application under test. When defining a record element, via singleRecord, or multipleRecord, ensure that you always have a field named self. self allows elements with and without other fields defined to be treated uniformly.


type alias Finder =
TestJourney.Internal.Finder



Used by [`TestJourney` ](../../TestJourney.elm) to help locate [`Elements`](#Element) defined in your page.

Helpers

In practice, a convention like "all elements are identified by an "data-test"="myTestIdentifier"" makes page objects more resiliant, and makes it clear when a node in the application under test has test dependencies. These helpers make creating Page Objects targeting that convention simpler. If your project has it's own conventions, create your own set of helpers.

multipleTestAttr : Finder -> String -> Basics.Int -> Element {}

Represents a list of nodes, following the "data-test" attribute convention.

page =
    root []
        (\rootElement ->
            { self = rootElement
            , myListItem =
                multipleTestAttr rootElement "myListItem"
            }
        )

element =
    page.myListItem 1

multipleRecordTestAttr : Finder -> String -> (Finder -> Element children) -> Basics.Int -> Element children

Represents a list of nodes w/ custom children, following the "data-test" attribute convention.

page =
    root []
        (\rootElement ->
            { self = rootElement
            , myListItem =
                multipleRecord rootElement
                    "myListItem"
                    (\myListItem ->
                        { self = myListItem
                        , label = singleTestAttr myListItem "itemLabel"
                        }
                    )
            }
        )

element =
    page.myListItem 0 |> .label

singleTestAttr : Finder -> String -> Element {}

Creates an 'Element' referencing a single node, following the "data-test" attribute convention.

page =
    root
        []
        (\rootElement ->
            { self = rootElement
            , myChildElement = singleTestAttr rootElement "myChildElement"
            }
        )

element =
    page.myChildElement

singleRecordTestAttr : Finder -> String -> (Finder -> Element children) -> Element children

Creates an 'Element' referencing a single node, w/ custom children, following the "data-test" attribute convention.

page =
    root []
        (\rootElement ->
            { self = rootElement
            , myElementWithChildren =
                singleRecord rootElement
                    "myChildElement"
                    (\myElementWithChildren ->
                        { self = myElementWithChildren
                        , childOfChild = singleTestAttr myElementWithChildren "childOfChild"
                        }
                    )
            }
        )

element =
    page.myElementWithChildren.childOfChild