---
title: WebdriverIO reference
description: Reference documentation for Allure WebdriverIO integration | How to add sub-steps and additional metadata | Create attachments | Organise tests
---

# Allure WebdriverIO reference

These are the functions that you can use to integrate your WebdriverIO tests with Allure.

## Metadata

Assign a test's [description, links and other metadata](/docs/v2/readability/#description-links-and-other-metadata).

### Description

- `addDescription(name: string, descriptionType: string)`

Set the test's [description](/docs/v2/readability/#description).

The second argument determines how the text will be rendered. If it is equal to `TYPE.MARKDOWN`, the text will be interpreted using the Markdown syntax. Any HTML formatting, if present, will be stripped for security purposes. To keep the HTML intact, pass `TYPE.HTML` to the second argument.

Info:
Using HTML descriptions is unsafe and can potentially break the test report's layout or even create an XSS attack vector for your organization.

```ts
import { addDescription, TYPE } from "@wdio/allure-reporter";

it("Test Authentication"), async () => {
  addDescription("Attempt to log into the website.", TYPE.MARKDOWN);
  // ...
});
```

### Owner

- `addOwner(owner: string)`

Set the test's [owner](/docs/v2/readability/#owner).

```ts
import { addOwner } from "@wdio/allure-reporter";

it("Test Authentication"), async () => {
  addOwner("John Doe");
  // ...
});
```

### Tag

- `addTag(tag: string)`

Set the test's [tags](/docs/v2/readability/#tags).

```ts
import { addTag } from "@wdio/allure-reporter";

it("Test Authentication"), async () => {
  addTag("web interface");
  addTag("authentication");
  // ...
});
```

### Severity

- `addSeverity(severity: string)`

Set the test's [severity](/docs/v2/readability/#severity).

Allowed values are: “trivial”, “minor”, “normal”, “critical”, and “blocker”.

```ts
import { addSeverity } from "@wdio/allure-reporter";

it("Test Authentication"), async () => {
  addSeverity("critical");
  // ...
});
```

### Label

- `addLabel(name: string, value: string)`

Set an arbitrary [label](/docs/v2/readability/#other-labels) for the test. This is the underlying implementation for a lot of Allure's other functions.

The first argument of the function is the label name. It can be any string.

You can call `addLabel()` multiple times to create an array of values under the given name.

```ts
import { addLabel } from "@wdio/allure-reporter";

it("Test Authentication"), async () => {
  addLabel("my custom label", "value");
  // ...
});
```

### ID

- `addAllureId(allureId: string)`

Set the test's [ID](/docs/v2/readability/#id).

```ts
import { addAllureId } from "@wdio/allure-reporter";

it("Test Authentication"), async () => {
  addAllureId("123");
  // ...
});
```

### Link

- `addLink(url: string, name?: string, type?: string)`
- `addIssue(issue: string)`
- `addTestId(testId: string)`

Add a [link](/docs/v2/readability/#links) related to the test.

Based on the `type` (which can be any string), Allure will try to load a corresponding **link pattern** to process the URL, as defined by the [`issueLinkTemplate` and `tmsLinkTemplate`](/docs/webdriverio-configuration/#issuelinktemplate-tmslinktemplate) configuration options. If no pattern found for the given type, the link will not be added.

The `name` will be used as the link's text. If it is omitted, the URL will be used instead.

For convenience, Allure provides two shorthand functions with pre-selected link types: `addIssue()` and `addTestId()`.

```ts
import { addIssue, addLink, addTestId } from "@wdio/allure-reporter";

it("Test Authentication"), async () => {
  addLink("https://dev.example.com/", "Website");
  addIssue("AUTH-123");
  addTestId("TMS-456");
  // ...
});
```

If you use the Cucumber.js runner and you have the [`useCucumberStepReporter`](/docs/webdriverio-configuration/#usecucumberstepreporter) option enabled, you can also add links via the `@issue` and `@testId` Gherkin tags.

```gherkin
Feature: Labels

  @issue=AUTH-123
  @testId=TMS-456
  Scenario: Create new label for authorized user
    When I open labels page
    And I create label with title "hello"
    Then I should see label with title "hello"
```

## Behavior-based hierarchy

- `addEpic(epicName: string)`
- `addFeature(featureName: string)`
- `addStory(storyName: string)`

Assign names of **epics**, **features** or **user stories** for a test, as part of Allure's [behavior-based hierarchy](/docs/v2/navigation/#behavior-based-hierarchy).

```ts
import { addEpic, addFeature, addStory } from "@wdio/allure-reporter";

it("Test Authentication"), async () => {
  addEpic("Web interface");
  addFeature("Essential features");
  addStory("Authentication");
  // ...
});
```

Tip:
If you are using the Cucumber.js runner, Allure WebdriverIO uses the hierarchy from the Gherkin files by default. The exact behavior depends on the [`useCucumberStepReporter`](/docs/webdriverio-configuration/#usecucumberstepreporter) option.

## Suite-based hierarchy

- `addParentSuite(suiteName: string)`
- `addSuite(suiteName: string)`
- `addSubSuite(suiteName: string)`

Assign the name of suite, as part of Allure's [suite-based hierarchy](/docs/v2/navigation/#suite-based-hierarchy).

```ts
import { addParentSuite, addSubSuite, addSuite } from "@wdio/allure-reporter";

it("Test Authentication"), async () => {
  addParentSuite("Tests for web interface");
  addSuite("Tests for essential features");
  addSubSuite("Tests for authentication");
  // ...
});
```

Tip:
If you are using the Cucumber.js runner, Allure WebdriverIO uses the hierarchy from the Gherkin files by default. The exact behavior depends on the [`useCucumberStepReporter`](/docs/webdriverio-configuration/#usecucumberstepreporter) option.

## Test steps

- `step(name: string, body: StepBodyFunction): Promise<void>`
- `addStep(title: string, { content, name, type }?: any, status?: Status)`
- `startStep(title: string)`
- `endStep(status?: Status)`

Define [test steps](/docs/steps/).

There are three ways of defining a step.

- **Lambda steps**

  Write a test step in an asynchronous lambda function and pass it to `allureReporter.step()`. The lambda function must accept either no arguments or a single argument of the `AllureCommandStepExecutable` type. You can create sub-steps within the current step by calling this argument's `step()` method.

- **No-op steps**

  If you call `allureReporter.addStep()`, Allure will add to the report a no-op step. This allows for a log-style reporting within a test or within a larger step. A no-op step finishes immediately after it started and cannot have any sub-steps, or parameters.

  The optional second argument indicates the status that will be shown for the step in the report. Allowed values are: `Status.PASSED` (the default), `Status.FAILED`, `Status.BROKEN`, and `Status.SKIPPED`.

- **Low-level steps**

  Call `allureReporter.startStep()` and `allureReporter.endStep()` to manually indicate to Allure WebdriverIO when a step starts or ends. It is recommended to use `try..catch` blocks to ensure ending the steps regardless of the exceptions thrown during their execution, see the example below.

  The optional argument for `endStep()` indicates the status that will be shown for the step in the report. Allowed values are: `Status.PASSED` (the default), `Status.FAILED`, `Status.BROKEN`, and `Status.SKIPPED`.

**Lambda steps:**
```ts
import { step } from "@wdio/allure-reporter";

it("Test Authentication"), async () => {
  await step("Step 1", async (step) => {
    await step.step("Step 1.1", async () => {
      // ...
    });

    await step.step("Step 1.2", async () => {
      // ...
    });
  });

  await step("Step 2", async (step) => {
    await step.step("Step 2.1", async () => {
      // ...
    });

    await step.step("Step 2.2", async () => {
      // ...
    });
  });
});
```

**No-op steps:**
```ts
import { addStep } from "@wdio/allure-reporter";
import { Status } from "allure-js-commons";

it("Test Authentication"), async () => {
  addStep("Successful step");

  addStep("Skipped step", undefined, Status.SKIPPED);

  addStep(
    "Skipped step with attachment",
    { content: "This is attachment.", name: "file.txt", type: "text/plain" },
    Status.SKIPPED,
  );
});
```

**Low-level steps:**
```ts
import { endStep, startStep } from "@wdio/allure-reporter";
import { Status } from "allure-js-commons";

it("Test Authentication"), async () => {
  startStep("Step 1");
  try {
    // ...
    endStep();
  } catch {
    endStep(Status.FAILED);
  }

  startStep("Step 2");
  try {
    // ...
    endStep();
  } catch {
    endStep(Status.FAILED);
  }
});
```

Tip:
By default, Allure WebdriverIO automatically adds a step for each WebDriver command, with both request details and response data added as step-level [attachments](#attachments). This can be disabled, see [`disableWebdriverStepsReporting`](/docs/webdriverio-configuration/#disablewebdriverstepsreporting).

## Parametrized tests

- `allureReporter.addArgument(name: string, value: string)`

Since tests in WebdriverIO, unlike in some other frameworks, are written as anonymous functions, it is very easy to implement the [parametrized tests](/docs/v2/readability/#parametrized-tests) pattern, i.e. to run the same test logic with different test data. To do so, just write the test inside a loop and use the variable parameters in both its title and its body.

To display a parameter value in the test report, pass it to the `addArgument()` function.

```ts
import { addArgument } from "@wdio/allure-reporter";

for (const login of ["johndoe", "johndoe@example.com"]) {
  it(`Test Authentication as ${login}`, async () => {
    addArgument("login", login);
    // ...
  });
}
```

## Attachments

- `addAttachment(name: string, content: string | Buffer | object, type: string)`

Add `content` as an attachment to the test result. The content can be a text string or a base64-encoded [`Buffer`](https://nodejs.org/api/buffer.html#buffer_class_buffer). As the `type` argument, pass the media type of content.

You can use data produced by any function, not necessarily read from an actual file.

```ts
import { addAttachment } from "@wdio/allure-reporter";
import * as fs from "fs";

it("Test Authentication"), async () => {
  // ...
  addAttachment("Text", "This is the file content.", "text/plain");
  addAttachment("Screenshot", fs.readFileSync("/path/to/image.png"), "image/png");
});
```

Tip:
By default, Allure WebdriverIO automatically includes in the report all screenshots taken via the WebdriverIO's [`saveScreenshot()`](https://webdriver.io/docs/api/element/saveScreenshot/) function. This can be disabled, see the [`disableWebdriverScreenshotsReporting`](/docs/webdriverio-configuration/#disablewebdriverscreenshotsreporting) configuration option.
