Рубрики
Без рубрики

Как использовать Webdriver огурца и селена эффективно для автоматизации тестирования BDD (часть 2)

Повторное использование кода для автоматизации тестирования BDD при работе с Webberver и селеной

Автор оригинала: Marcus Chukwuoma.

Это в продолжении части 1, где обсуждалась базовая настройка проекта, и был создан файл функции огурца для этого руководства. Наше внимание здесь будет реализация определений поэтапных определений. Итак, структура файлов должна быть изменена для:

e2e
├── config.js
│   │
├── features
│   │
│   ├── app.feature
│   │
│   ├── step-definitions
│   │   ├── app.js
│   │
│   ├── common
│   │   ├── action.js
│   │   ├── browser.js
│   │   ├── selectors.js
│   │
│   ├── support
│   │   ├── world.js
│   │   ├── hooks.js

Обновите файлы соответственно: E2E/Особенности/Common/Browser.js

const {By, until} = require('selenium-webdriver');
const {timeout} = require('../../config');

function browser(driver){
  function waitAndLocateByCSS(selector){
    return driver.wait(until.elementLocated(By.css(selector)), timeout);
  }
  
  function waitAndLocateByXpath(selector){
    return driver.wait(until.elementLocated(By.xpath(selector)), timeout);
  }

  return {
    waitAndLocateByCSS,
    waitAndLocateByXpath
  };
}

module.exports = browser;

E2E/Особенности/Common/Selectors.js

module.exports = {
  'email input': 'input[name="identifier"]'
  'password input': 'input[name="password"]'
  'Sign in', '//a[contains(text(), "Sign in")]',
  'Create account', '//a[contains(text(), "Create")]',
  'Next': '//span[contains(text(), "Next")]'
};

E2E/Особенности/Common/Action.js

const {baseURL, email, password} = require('../config');
const helper = require('./common/browser');
const selector = require('./common/selector');

const action = {
  navigateToPage: function() {
    return this.driver.get(baseURL);
  },
  enterInput: function(text, inputField) {
    const itemSelector = selector[inputField],
    const mapText = {
    	'': email,
        '': password
    };
    const value = mapText[text] || text;
    return helper(this.driver).waitAndLocateByCSS(itemSelector).sendKeys(value);
  },
  click: async function(identifier) {
  	const itemSelector = selector[identifier],
    await helper(this.driver).waitAndLocateByXpath(itemSelector).click();
  },
  confirmUserId: async function() {
    await helper(this.driver).waitAndLocateByXpath(`//a[contains(@aria-label, "${email}")]`);
  },
  confirmTextVisibility: async function(text) {
    await helper(this.driver).waitAndLocateByXpath(`//*[contains(text(), "${text}")]`);
  },
  confirmMultipleTextVisibility: async function(dataTable) {
  // convert cucumber dataTables to array of objects
    const arrayOfObjects = dataTable.hashes();
    const locateText = [];

    arrayOfObjects.forEach((value) => {
      const textArray = Object.values(value);
      const [text] = textArray;
      locateText.push(helper(this.driver).waitAndLocateByXpath(`//*[text()="${text}"]`));
    });

    await Promise.all(locateText);
  }
};

module.exports = action;

E2E/Особенности/Определения шагов/app.js

const {Given, When, Then} = require('cucumber');
const {
  navigateToPage,
    enterInput,
    click,
    confirmTextVisibility,
    confirmMultipleTextVisibility,
    confirmUserId
} = require('../common/action');

Given('A user visits mail.google.com', navigateToPage);

Then(/^the user should see the following .*$/, confirmMultipleTextVisibility);

When(/^the user clicks on '(.*)' .*$/, click);

When ('the user enters {string} into the {string} field', enterInput);

Then(/^the user should see '(.*)' .*$/, confirmTextVisibility);

Then('the user should see the Google Account used to sign in to the email', confirmUserId);

Часть 3 (в ближайшее время) будет сосредоточиться на том, как написать устойчивые тесты BDD