Algunas veces necesitamos compartir data entre distintos pasos en WebdriverIO cuando estamos trabajando con Gherkin, para no hacer el mismo request varias veces en el mismo test.

Por supuesto, nuestro test debería ser atómico. No es recomendable compartir información entre distintos test ni escenarios. En este ejemplo, es un solo test.

 

Feature file

Tenemos el feature file worldtimeapi.feature en que especificamos un timezone y queremos obtener la hora actual de ese timezone:


Feature: Timezones in Worldtime API

  Scenario Outline: API handles properly the time in existing timezones

    Given I have a list of timezones
    When I select the timezone in <timezone_position>th position
    Then I should get the time for the selected timezone

    Examples:
      | timezone_position |
      | 45                |

 

Guardando el valor

En el step 2  When I select the timezone in <timezone_position>th position enviamos la posición del timezone (en un array con todos los timezones) y guardamos selectedTimezone con la función setValue setValue(“selectedTimezone”, selectedTimezone);

When(/^I select the timezone in (.*)th position$/, async (position) => {
  const selectedTimezone = await worldTimePage.getTimezoneByIndex(position);
  await setValue("selectedTimezone", selectedTimezone);
});

 

Recuperando el valor

En el step 3 usamos el selectTimezone previamente guardado en el step 2 para obtener la hora actual de ese timezone con la function getValue getValue(“selectedTimezone”);

Then(/^I should get the time for the selected timezone$/, async () => {
  const selectedTimezone = await getValue("selectedTimezone");
  const currentHourInTimezone = await worldTimePage.getCurrentHourInTimezone(
    selectedTimezone
  );
  await expect(currentHourInTimezone).toMatch(
    /^(?:\\d{4})-(?:\\d{2})-(?:\\d{2})T(?:\\d{2}):(?:\\d{2}):(?:\\d{2}(?:\\.\\d*)?)(?:(?:-(?:\\d{2}):(?:\\d{2})|Z)?)$/
  );
});

Para usar las funciones setValue y getValue, instalamos el paquete @wdio/shared-store-service y agregamos setValue y getValue al archivo de configuración wdio.conf.js

import { setValue, getValue } from "@wdio/shared-store-service";

 

En onPrepare (también en wdio.conf.js) agregamos (inicializamos) las variables que vamos a compartir entre steps (nombres y tipos de datos) con la funcion setValue

onPrepare: [
    async function (config, capabilities) {
      await setValue("selectedTimezone", []);
      await setValue("timezoneExists", []);
    },
  ],

 

En services (también en wdio.conf.js) agregamos shared-store

services: ["chromedriver", "shared-store"],

Y ya estamos listos para correr nuestro test.

Puedes ver el código completo en github