wallaby v0.22.0 Wallaby.Query View Source

Provides the query DSL.

Queries are used to locate and retrieve DOM elements from a browser (see Wallaby.Browser). You create queries like so:

Query.css(".some-css")
Query.xpath(".//input")

Form elements

There are several custom finders for locating form elements. Each of these allows finding by their name, id text, or label text. This allows for more robust querying and decouples the query from presentation selectors like css classes.

Query.text_field("My Name")
Query.checkbox("Checkbox")
Query.select("A Fancy Select Box")

Query Options

All of the query operations accept the following options:

  • :count - The number of elements that should be found (default: 1).
  • :visible - Determines if the query should return only visible elements (default: true).
  • :selected - Determines if the query should return only selected elements (default: :any for selected and unselected).
  • :text - Text that should be found inside the element (default: nil).
  • :at - The position number of the element to select if multiple elements satisfy the selection criteria. (:all for all elements)

Query options can also be set via functions by the same names:

Query.css(".names")
|> Query.visible(true)
|> Query.count(3)

Re-using queries

It is often convenient to re-use queries. The easiest way is to use module attributes:

@name_field Query.text_field("User Name")
@submit_button Query.button("Save")

If the queries need to be dynamic then you should create a module that encapsulates the queries as functions:

defmodule TodoListPage do
  def todo_list do
    Query.css(".todo-list")
  end

  def todos(count) do
    Query.css(".todo", count: count)
  end
end

What does my query do?

Wanna check out what exactly your query will do? Look no further than Wallaby.Query.compile/1 - it takes a query and returns the css or xpath query that will be sent to the driver:

iex> Wallaby.Query.compile Wallaby.Query.text("my text")
{:xpath, ".//*[contains(normalize-space(text()), \"my text\")]"}

So, whenever you’re not sure whatever a specific query will do just compile it to get all the details!

Link to this section Summary

Functions

Updates a query’s at option

Checks if the provided attribute, value pair is contained anywhere

Looks for a button (literal button or input type button, submit, image or reset) where the provided selector is the id, name, value, alt or title of the button

Looks for a checkbox where the provided selector is the id, name or placeholder of the checkbox itself or alternatively the id or the text of the label

Compiles a query into css or xpath so its ready to be sent to the driver

Updates a query’s count option

Literally queries for the css selector you provide

Checks if the data attribute is contained anywhere

Looks for a file input where the selector is the id or name of the file input itself or the id or text of the label

Looks for a text input field where the provided selector is the id, name or placeholder of the text field itself or alternatively the id or the text of the label

Looks for a link where the selector is the id, link text, title of the link itself or the alt of an image child node

Looks for an option that contains the given text

Looks for a radio button where the provided selector is the id, name or placeholder of the radio button itself or alternatively the id or the text of the label

Looks for a select box where the provided selector is the id or name of the select box itself or alternatively the id or the text of the label

Updates a query’s selected option

This function can be used in one of two ways

Checks if the provided value is contained anywhere

Updates a query’s visibility (visible if true, hidden if false)

Literally queries for the xpath selector you provide

Link to this section Types

Link to this type attribute_key_value_pair() View Source
attribute_key_value_pair() :: {String.t(), String.t()}
Link to this type compiled() View Source
compiled() :: {:xpath | :css, String.t()}
Link to this type conditions() View Source
conditions() :: [count: non_neg_integer(), text: String.t(), visible: boolean() | :any, selected: boolean() | :any, minimum: non_neg_integer(), at: pos_integer()]
Link to this type html_validation() View Source
html_validation() :: :bad_label | :button_type | nil
Link to this type method() View Source
method() ::
  :css |
  :xpath |
  :link |
  :button |
  :fillable_field |
  :checkbox |
  :radio_button |
  :option |
  :select |
  :file_field
Link to this type opts() View Source
opts() :: [...]
Link to this type selector() View Source
selector() :: String.t() | :attribute_key_value_pair
Link to this type t() View Source
t() :: %Wallaby.Query{conditions: conditions(), html_validation: html_validation(), method: method(), result: result(), selector: selector()}

Link to this section Functions

Updates a query’s at option.

Example

  Query.css(".names")
  |> Query.at(3)
Link to this function attribute(name, value, opts \\ []) View Source

Checks if the provided attribute, value pair is contained anywhere.

Link to this function button(selector, opts \\ []) View Source

Looks for a button (literal button or input type button, submit, image or reset) where the provided selector is the id, name, value, alt or title of the button.

Link to this function checkbox(selector, opts \\ []) View Source

Looks for a checkbox where the provided selector is the id, name or placeholder of the checkbox itself or alternatively the id or the text of the label.

Link to this function compile(map) View Source
compile(t()) :: compiled()

Compiles a query into css or xpath so its ready to be sent to the driver

iex> Wallaby.Query.compile Wallaby.Query.text("my text")
{:xpath, ".//*[contains(normalize-space(text()), \"my text\")]"}
iex> Wallaby.Query.compile Wallaby.Query.css("#some-id")
{:css, "#some-id"}

Updates a query’s count option.

Example

  Query.css(".names > li")
  |> Query.count(2)
Link to this function css(selector, opts \\ []) View Source

Literally queries for the css selector you provide.

Link to this function data(name, selector, opts \\ []) View Source

Checks if the data attribute is contained anywhere.

Link to this function file_field(selector, opts \\ []) View Source

Looks for a file input where the selector is the id or name of the file input itself or the id or text of the label.

Link to this function fillable_field(selector, opts \\ []) View Source

Looks for a text input field where the provided selector is the id, name or placeholder of the text field itself or alternatively the id or the text of the label.

Link to this function link(selector, opts \\ []) View Source

Looks for a link where the selector is the id, link text, title of the link itself or the alt of an image child node.

Link to this function matches_count?(map, count) View Source
Link to this function option(selector, opts \\ []) View Source

Looks for an option that contains the given text.

Link to this function radio_button(selector, opts \\ []) View Source

Looks for a radio button where the provided selector is the id, name or placeholder of the radio button itself or alternatively the id or the text of the label.

Link to this function select(selector, opts \\ []) View Source

Looks for a select box where the provided selector is the id or name of the select box itself or alternatively the id or the text of the label.

Updates a query’s selected option.

Examples

  Query.css("#select-dropdown")
  |> Query.selected(true)

  Query.css("#select-dropdown")
  |> Query.selected(false)
Link to this function specific_element_requested(query) View Source
Link to this function text(query_or_selector, value_or_opts \\ []) View Source

This function can be used in one of two ways.

The first is by providing a selector and possible options. This generates a query that checks if the provided text is contained anywhere.

Example

  Query.text("Submit", count: 1)

The second is by providing an existing query and a value to set as the text option.

Example

  submit_button = Query.css("#submit-button")

  update_button = submit_button |> Query.text("Update")
  create_button = submit_button |> Query.text("Create")
Link to this function value(selector, opts \\ []) View Source

Checks if the provided value is contained anywhere.

Updates a query’s visibility (visible if true, hidden if false).

Examples

  Query.css("#modal")
  |> Query.visible(true)

  Query.css("#modal")
  |> Query.visible(false)
Link to this function xpath(selector, opts \\ []) View Source

Literally queries for the xpath selector you provide.