Packages
wallaby
0.2.0
0.31.0
0.30.12
0.30.11
0.30.10
0.30.9
0.30.8
0.30.7
0.30.6
0.30.5
0.30.4
0.30.3
0.30.2
0.30.1
0.30.0
0.29.1
0.29.0
0.28.1
0.28.0
0.27.0
0.26.2
0.26.1
0.26.0
0.25.1
0.25.0
0.24.1
0.24.0
0.23.0
0.22.0
0.21.0
0.20.0
0.19.2
0.19.1
0.19.0
0.18.1
0.18.0
0.17.0
0.16.1
0.16.0
0.15.0
0.14.0
0.13.0
0.12.0
0.11.1
0.11.0
0.10.0
0.9.0
0.8.0
0.7.0
0.6.0
0.5.0
0.4.0
0.3.1
0.3.0
0.2.0
0.1.0
0.0.1
Concurrent feature tests for elixir
Current section
Files
Jump to
Current section
Files
lib/wallaby/session.ex
defmodule Wallaby.Session do
@moduledoc """
Common functionality for interacting with Sessions.
Sessions are used to represent a user navigating through and interacting with
different pages.
## Fields
* `id` - The session id generated from the webdriver
* `base_url` - The base url for the application under test.
* `server` - The specific webdriver server that the session is running in.
## Multiple sessions
Each session runs in its own browser so that each test runs in isolation.
Because of this isolation multiple sessions can be created for a test:
```
test "That multiple sessions work" do
{:ok, user1} = Wallaby.start_session
user1
|> visit("/page.html")
|> fill_in("Share Message", with: "Hello there!")
|> click_on("Share")
{:ok, user2} = Wallaby.start_session
user2
|> visit("/page.html")
|> fill_in("Share Message", with: "Hello yourself")
|> click_on("Share")
assert user1 |> find(".messages") |> List.last |> text == "Hello yourself"
assert user2 |> find(".messages") |> List.first |> text == "Hello there"
end
```
"""
@type t :: %__MODULE__{
id: integer(),
base_url: String.t,
server: pid()
}
alias __MODULE__
alias Wallaby.Driver
alias Wallaby.Node
alias Wallaby.XPath
defstruct [:id, :base_url, :server]
@doc """
Changes the current page to the provided route.
Routes are relative to any base url provided.
"""
@spec visit(t, String.t) :: t
def visit(session, path) do
Driver.visit(session, request_url(path))
session
end
@doc """
Clicks the matching link. Links can be found based on id, name, or link text.
"""
@spec click_link(t, String.t) :: t
def click_link(session, link) do
Node.find(session, {:xpath, XPath.link(link)})
|> Node.click
session
end
@doc """
Takes a screenshot of the current window.
Screenshots are saved to a "screenshots" directory in the same directory the
tests are run in.
"""
@spec take_screenshot(t) :: %{session: t, path: String.t}
def take_screenshot(%Node{session: session}=node) do
take_screenshot(session)
node
end
def take_screenshot(%Session{}=session) do
path = Driver.take_screenshot(session)
%{session: session, path: path}
end
@doc """
Sets the size of the sessions window.
"""
@spec set_window_size(t, pos_integer, pos_integer) :: t
def set_window_size(session, width, height) do
Driver.set_window_size(session, width, height)
session
end
@doc """
Gets the size of the session's window.
"""
@spec get_window_size(t) :: %{String.t => pos_integer, String.t => pos_integer}
def get_window_size(session) do
Driver.get_window_size(session)
end
@doc """
Executes javascript synchoronously, taking as arguments the script to execute,
and optionally a list of arguments available in the script via `arguments`
"""
@spec execute_script(t, String.t, list) :: t
def execute_script(session, script, arguments \\ []) do
Driver.execute_script(session, script, arguments)
end
@doc """
Sends a list of key strokes to active element
"""
@spec send_keys(t, list(atom)) :: t
def send_keys(session, keys) when is_list(keys) do
Driver.send_keys(session, keys)
session
end
@doc """
Sends text characters to the active element
"""
@spec send_text(t, String.t) :: t
def send_text(session, text) do
Driver.send_text(session, text)
session
end
defp request_url(url) do
(Application.get_env(:wallaby, :base_url) || "") <> url
end
end