Шаблон повторного использования функции WebdriverIO

#webdriver-io #reusability #ui-testing

#webdriver-io #возможность повторного использования #тестирование пользовательского интерфейса

Вопрос:

Я перехожу с Selenium на WebdriverIO и сталкиваюсь с некоторыми трудностями, связанными с возможностью повторного использования функции. Позвольте мне продемонстрировать на примере:

 <nav>
  <div><a>Clients</a></div>
  <div><a>Accounts</a></div>
  <div><a>Packages</a></div>
</nav>
  

допустим, у меня есть панель навигации с 3 ссылками выше. Когда я попадаю на эту страницу, я хочу проверить, существует ли каждая ссылка. Моя функция может выглядеть примерно так:

 class LoginPage extends Page {

  get clientsLink() { return $('//a[contains(., "Clients")]'); }


  isTabDisplayed() {
    if (this.clientsLink.isDisplayed()) {
      return true;
    } else {
      false
    }
  }
}
  

это нормально, за исключением того, что мне пришлось бы написать еще 2 метода получения для Accounts и Packages , и поэтому мой класс выглядел бы следующим образом:

 class LoginPage extends Page {

  get clientsLink() { return $('//a[contains(., "Clients")]'); }
  get accountsLink() { return $('//a[contains(., "Accounts")]'); }
  get packagesLink() { return $('//a[contains(., "Packages")]'); }

  isClientTabDisplayed(tab) {
    if (this.clientsLink.isDisplayed()) {
      return true;
    } else {
      false
    }
  }

  isAccountsTabDisplayed(tab) {
    if (this.accountsLink.isDisplayed()) {
      return true;
    } else {
      false
    }
  }

  isPackagesTabDisplayed(tab) {
    if (this.packagesLink.isDisplayed()) {
      return true;
    } else {
      false
    }
  }
}
  

на этом этапе меня охватывает беспокойство, и я начинаю думать о способах повторного использования isTabDisplayed функции, где я могу передать получателю строку с моим именем вкладки или что-то в этом роде.

К сожалению, средства получения не принимают параметры, и пока я не нашел в Google никаких ресурсов, которые могли бы помочь мне решить эту проблему (наиболее распространенной является объектная модель страницы, которая, похоже, не решает эту проблему)

Мой мыслительный процесс выходит за рамки того, что я стремлюсь к многократному использованию кода в тестировании пользовательского интерфейса, или я не гуглю правильные шаблоны?

Ответ №1:

Объекты страницы в WebdriverIO — это просто классы ES6. Просмотрите документацию по классам ES6, чтобы понять, как можно создавать функции, в которые можно передавать аргументы.

С учетом сказанного, в том, что вы здесь делаете, нет необходимости. Вместо создания функции, которая ссылается на средство получения, почему бы просто не ссылаться на это средство получения непосредственно в вашем тесте?

 const login = new LoginPage();
const isAccountsTabDisplayed = login.accountsLink.isDisplayed();
  

На самом деле нет причин создавать функцию-оболочку вокруг этого.