Tests

A test is composed of a series of steps. Steps may be defined directly within a test or may be defined independently and imported into a test. A test may import steps, may import page models and may import data providers.

Syntax

A test is a YAML object. The most basic test specifies a browsers collection and starting url and defines steps directly.

config:
    browsers:
        - {browser-1}
        ...
        - {browser-N}
    url: {url}

{step-name-1}:
    {step}
...
{step-name-N}
    {step}

----------------------

browser-*:
    <string>

url:
    <url>

step-name-*:
    <string>

step:
    actions:
      - {action-1}
      ...
      - {action-N}

    assertions:
      - {assertion-1}
      ...
      - {assertion-N}

action-*:
    <action>

assertion-*:
    <assertion>

A step may be defined independently of the test and imported into any number of tests. Import names are user-defined. Import paths are relative to the test.

config:
    browsers:
        - {browser-1}
        ...
        - {browser-N}
    url: {url}

imports:
    steps:
        {step-import-name}: "{import-path}"

{step-name}:
    use: {step-import-name}

-------------------------------------------

step-import-name:
    <string>

import-path:
    <string>, a path to the file to import, relative to the location of the test

browser-*:
    <string>

url:
    <url>

step-name:
    <string>

A test may both define and import steps.

config:
    browsers:
        - {browser-1}
        ...
        - {browser-N}
    url: {url}

imports:
    steps:
        {step-import-name}: "{import-path}"

{step-name-1}:
    use: {step-import-name}
...
{step-name-N}
    {step}

-------------------------------------------

step-import-name:
    <string>

import-path:
    <string>, a path to the file to import, relative to the location of the test

browser-*:
    <string>

url:
    <url>

step-name-*:
    <string>

step:
    actions:
      - {action-1}
      ...
      - {action-N}

    assertions:
      - {assertion-1}
      ...
      - {assertion-N}

action-*:
    <action>

assertion-*:
    <assertion>

Imported steps that require parameters must have the parameter values passed at usage time.

Data can be supplied via the data property of the step. The data property can define one or more data sets. Each data set provides values for the parameters as required by a step.

config:
    browsers:
        - {browser-1}
        ...
        - {browser-N}
    url: {url}

imports:
    steps:
        {step-import-name}: "{import-path}"

{step-name}:
    use: {step-import-name}
    data:
        {data-set-name-1}:
            {parameter-name-1}: {parameter-value-1}
            ...
            {parameter-name-N}: {parameter-value-N}
        ...
        {data-set-name-N}:
            {parameter-name-1}: {parameter-value-1}
            ...
            {parameter-name-N}: {parameter-value-N}

---------------------------------------------------

step-import-name:
    <string>

import-path:
    <string>, a path to the file to import, relative to the location of the test

browser-*:
    <string>

url:
    <url>

step-name:
    <string>

data-set-name-*:
    <string>

parameter-name-*:
    <string>, must match the name of a parameter as required by a step

parameter-value-*:
    <string>

Data can be supplied through the import of a data provider. A data provider is a collection of data sets defined externally to the test.

config:
    browsers:
        - {browser-1}
        ...
        - {browser-N}
    url: {url}

imports:
    steps:
        {step-import-name}: "{import-path}"
    data_providers:
        {data-provider-import-name}: "{import-path}"

{step-name}:
    use: {step-import-name}
    data: {data-provider-import-name}

----------------------------------------------------

step-import-name:
    <string>

import-path:
    <string>, a path to the file to import, relative to the location of the test

browser-*:
    <string>

url:
    <url>

data-provider-import-name:
    <string>

step-name:
    <string>

Page models can be imported and their defined page properties referenced within the test.

config:
    browsers:
        - {browser-1}
        ...
        - {browser-N}
    url: {url}

imports:
    pages:
        {page-import-name}: "{import-path}"

{step-name}:
  actions:
    - open {import_name}

  assertions:
    - {page-import-name}.elements.{element-name} {operator} [{value}]

-----------------------------------------------------------------------

page-import-name:
    <string>

import-path:
    <string>, a path to the file to import, relative to the location of the test

browser-*:
    <string>

url:
    <url>

step-name:
    <string>

element-name:
    <string>, defined within the imported page model

operator:
    <string>, operator for assertion

value:
    <string>, value for assertion

Examples

Steps With Literal Values

# examples/test/google-search-query-literal.yml
config:
  browsers:
    - chrome
  url: https://www.google.com

"verify Google is open":
  assertions:
    - $page.url is "https://www.google.com"
    - $page.title is "Google"

"query 'example'":
  actions:
    - set $".gLFyf.gsfi" to "example"
    - click $".FPdoLc.VlcLAe input[name=btnK]"

  assertions:
    - $page.title is "example - Google Search"

Parameterised Steps With Inline Data

# examples/step/assert-page-open-parameterised.yml
assertions:
  - $page.url is $data.expected_url
  - $page.title is $data.expected_title
# examples/test/google-open-parameterised.yml
config:
  browsers:
    - chrome
  url: https://www.google.com

imports:
  steps:
    assert_opened_page_step: "../step/assert-page-open-parameterised.yml"

"verify Google is open":
  use: assert_opened_page_step
  data:
    # Just a single data set needed here
    0:
      expected_url: $config.url
      expected_title: "Google"

Parameterised Steps With Provided Data

# examples/step/google-search-query-parameterised.yml
actions:
  - set $".gLFyf.gsfi" to $data.search_term
  - click $".FPdoLc.VlcLAe input[name=btnK]"

assertions:
  - $page.title is $data.expected_title
# examples/data-provider/google-search-query.yml
foo:
  search_term: "foo"
  expected_title: "foo - Google Search"

bar:
  search_term: "bar"
  expected_title: "bar - Google Search"
# examples/test/google-search-query-parameterised.yml
config:
  browsers:
    - chrome
  url: https://www.google.com

imports:
  steps:
    query_step: "../step/google-search-query-parameterised.yml"
  data_providers:
    google_search_query_data: "../data-provider/google-search-query-parameterised.yml"

"verify Google is open":
  assertions:
    - $page.title is "Google"

"query":
  use: query_step
  data: google_search_query_data

Steps Imported Into the Test With Additional Assertions

# examples/step/google-assert-open-literal.yml
assertions:
  - $page.url is "https://www.google.com"
  - $page.title is "Google"
# examples/step/google-query-example-literal.yml
actions:
  - set $".gLFyf.gsfi" to "example"
  - click $".FPdoLc.VlcLAe input[name=btnK]"

assertions:
  - $page.title is "example - Google Search"
# examples/test/google-import-assert-open-import-query-additional-assertions.yml
config:
  browsers:
    - chrome
  url: https://www.google.com

imports:
  steps:
    google_assert_open: "../step/google-assert-open-literal.yml"
    google_query_example: "../step/google-query-example-literal.yml"

"verify Google is open":
  use: google_assert_open

  assertions:
    - $page.title excludes "error"

"query 'example'":
  use: google_query_example

Imported Page Model Used Directly Within Test

# examples/page/google.com.yml
url: "https://www.google.com"
elements:
  search_input: $".gLFyf.gsfi"
  search_button: $".FPdoLc.VlcLAe input[name=btnK]"
# examples/test/google-inline-tests-with-page-model.rst
config:
  browsers:
    - chrome
  url: google_com.url

imports:
  pages:
    google_com: "../page/google.com.yml"

"verify Google is open":
  assertions:
    - $page.title is "Google"

"query 'example'":
  actions:
    - set $google_com.elements.search_input to "example"
    - click $google_com.elements.search_button

  assertions:
    - $page.title is "example - Google Search"

Imported Page Model Elements Passed To Imported Step

# examples/page/google.com.yml
url: "https://www.google.com"
elements:
  search_input: $".gLFyf.gsfi"
  search_button: $".FPdoLc.VlcLAe input[name=btnK]"
# examples/step/google-query-parameterised.yml
actions:
  - set $elements.search_input to $data.query_term
  - click $elements.search_button

assertions:
  - $page.title is $data.expected_title
# examples/test/google-imported-steps-with-page-model.yml
config:
  browsers:
    - chrome
  url: google_com.url

imports:
  pages:
    google_com: "../page/google.com.yml"
  steps:
    google_query: "../step/google-query-parameterised.yml"

"verify Google is open":
  assertions:
    - $page.title is "Google"

"query 'example'":
  use: google_query
  data:
    0:
      query_term: "foo"
      expected_title: "foo - Google Search"

  elements:
    search_input: $google_com.elements.search_input
    search_button: $google_com.elements.search_button