Заметки об использовании Selenide: IE, TestNG, Bootstrap dropdown

Заметки об использовании Selenide: IE, TestNG, Bootstrap dropdown

IE, один простой способ добавить скриншот Selenide в TestNG HTML репорт, один способ работать с кастомизированным Bootstrap HTML элементом
25.08.14

Привет!

Меня зовут Сергей Шимкив, и я хочу поделиться с вами своими заметками об использовании Selenide/Selenium.

Заметки об IE

IE 11 x32/x64. В некоторых случаях после действий с HTML элементами (например, click()) вы можете получить ошибку.
Проблема в использовании синтетических событиях. Решение - использовать нативные события для IE:

   capabilities.setCapability("nativeEvents", "true");

См. https://code.google.com/p/selenium/wiki/InternetExplorerDriver


Один способ добавить скриншоты Selenide в TestNG HTML репорт

Иногда было бы неплохо добавить скриншоты Selenide от упавших тестов в ваш TestNG HTML отчёт.

К примеру: Вы написали два теста (Test1 и Test2), которые должны быть связаны (Test2 зависит от результатов Test1). Но вы знаете, что Test1 точно упадёт из-за ошибки приложения.


Поэтому вы пишете нечто подобное:

   @Test(...)
   public void Test1() {
    ...
    try {
      // Кусок теста с известным багом
    } catch(...) {
      // Некоторые действия
    } finally {
      // Действия, чтобы обеспечить корректные условия для запуска Test2
    }
   }

Допустим, вы используете свой тест листенер, который наследует TestListenerAdapter. И вы переопределили метод onTestFailure(ITestResult result), чтобы собирать дополнительную информацию в HTML отчёт - например, ваши собственные скриншоты. В этом случае может статься, что ваш код будет собирать неправильную информацию о скриншотах, т.к. блок finally может быть выполнен ДО того, как Selenide сделает скриншот.


Какой же выход?

Просто помните, что имя файла скриншота, который делает Selenide (после любой ошибки), доступно из result.getThrowable().getMessage();

Один способ работать с кастомизированными Bootstrap HTML элементами

Тесты резко усложняются, когда приходится иметь дело с нетривиальными контролами.

К примеру, бутстраповский выпадающий список (dropdown) реализован как набор HTML элементов. Обычно это выглядит как-то так:

  <div class="dropdown">
    <button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown">
      Dropdown
      <span class="caret"></span>
    </button>
    <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
      <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Действие</a></li>
      <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Другое действие</a></li>
      <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Что-то ещё</a></li>
      <li role="presentation" class="divider"></li>
      <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Отдельная ссылка</a></li>
    </ul>
  </div>

Проблема в том, что элемент <ul> изначально невидимый. Selenium (а значит, и Selenide) его не видит и поэтому не может кликнуть. Чтобы выбрать элемент выпадающего списка, вам нужно:

   SelenideElement parentDiv = $(".dropdown");
   
   // Найти элемент `<button>` и `click()` его
   parentDiv.find("button").scrollTo().click();
   
   // Теперь можете найти нужный элемент выпадающего списка по тексту
   parentDiv.find(".dropdown-menu").find(withText("Действие")).parent().click();


В следующем посте я поделюсь опытом автоматической инсталляции а тестовую среду (основанной на Grid2).

Спасибо авторам Selenide за отличный тул ;)

Сергей Шимкив


25.08.14