Selenide

Андрей Солнцев Вадим Герасимов Codeborne

О нас


Вадим Герасимов

Андрей Солнцев
Программеры, чо

О нас

TDD
Pair programming
Codeborne
Clean code
KISS
Сами кодим, сами тестируем

Повестка дня

  • Что такое Selenide?
  • Глобальные проблемы UI тестов
  • Wоrкшїп: интернет-банк

Что это?

Selenide
=
выразительные тесты
на Selenium WebDriver

Selenide

  • Выразительные тесты
  • Читаемые
  • Без мусора
Сосредоточься на бизнес-логике!

Codeborne

WatirSplash = API ( )
github.com/jarmo/WatirSplash

Selenide = API ( )
selenide.org

Selenium + API = SELENIDE

selenide.org

@Test
public void userCanLogin() {
  open("/login");
  $(By.name("user.name")).setValue("john");
  $("#submit").click();
  $(".menu").shouldHave(text("Hello, John!"));
}

Проблемы UI-тестов

  • Чёртов Ajax
  • Тамагочи
  • Deployment

Selenide
поможет!

Решения: Ajax

Все should-методы ЖДУТ наступления события.

$(".loading_progress").shouldBe(visible);

$("#menu").shouldHave(text("Hello, John!"));

$(By.name("sex")).shouldNotBe(selected);

Забудь
про AJAX!

Решения: Тамагочи

Искать элементы по тексту

import static com.codeborne.selenide.Selectors.*;

$(byText("Привет, чертяка!"))
   .shouldBe(visible);

$(withText("ертяк"))
   .shouldHave(text("Привет, чертяка"));

Думай
как юзер!

Решения: Deployment



Сами кодим

-

сами тестим!

Особенности Selenide

  • Библиотека (не фреймворк)
  • Быстрый старт
  • Совместим с: JUnit, TestNG, ... - всё что угодно!
  • Совместим с: Java, Scala, Groovy, ... - любые JVM
  • Dog Food
  • Максимум пользы при минимуме кода
  • Используется в реальных проектах
  • Решает основные проблемы UI тестов

История Selenide

  • Попробовали Selenium WebDriver
  • Нафигачили вспомогательных методов
  • Вынесли в open-source
  • 1.5 года шлифовали в реальных проектах
  • И вот мы на Selenium Camp!

Selenide

vs

Selenium WebDriver

WebDriver


DesiredCapabilities cap = htmlUnit();
cap.setCapability(INVALIDSELECTIONERROR, true);
cap.setCapability(INVALIDXPATHERROR, false);
cap.setJavascriptEnabled(true);
WebDriver driver = new HtmlUnitDriver(cap);
  • firefox
  • chrome
  • htmlunit
  • phantomjs
  • ie
  • opera

Find element


WebElement customer =
  driver.findElement(By.id("customerContainer"));

Text check


assertEquals("Customer profile",
  driver.findElement(
    By.id("customerContainer")).getText());

Ajax support


FluentWait<By> fluentWait = new FluentWait<By>(By.tagName("TEXTAREA"));
fluentWait.pollingEvery(100, TimeUnit.MILLISECONDS);
fluentWait.withTimeout(1000, TimeUnit.MILLISECONDS);
fluentWait.until(new Predicate<By>() {
  public boolean apply(By by) {
    try {
      return browser.findElement(by).isDisplayed();
    } catch (NoSuchElementException ex) {
      return false;
    }
  }
});
assertEquals("John", browser.findElement(By.tagName("TEXTAREA")).getAttribute("value"));

Ajax support

Page Objects extension


public class SignupPage {
  @FindBy(name = "email")
  public SelenideElement email;
  @FindBy(name = "password")
  public SelenideElement password;
  @FindBy(id = "signup")
  private SelenideElement signup;

  public DashboardPage loginValid() {
    signup.click();
    return page(DashboardPage.class);
  }
}

Page Objects extension


@Test
public void afterSignupUserLandsOnDashboard() {
open("/signup");

SignupPage signupPage = page(SignupPage.class);
signupPage.email.shouldHave(value(""))
  .val("existing@email.com");
signupPage.password.shouldHave(value(""))
  .val("validPassword");

DashboardPage dashboardPage =
  signupPage.signupValid();
// do some dashboard page assertions
}

Демо

Листинг карт

  • Пользователь видит список добавленных карт сторонних банков (номер, имя держателя, состояние)

Удаление карты

  • Пользователь может удалить карту стороннего банка

Активация карты

  • Чтобы иметь возможность оплатить услуги пользователь должен активировать карту, введя зарезервированную сумму
  • В целях безопасности в случае неверного ввода зарезервированной суммы карта удаляется

Наш подход к написанию UI тестов

  • Стремимся UI тесты делать быстрыми, для этого
    • используем in-memory базу данных
    • заглушаем реальные сервисы, если их не можем контроллировать
    • используем упрощённый логин
    • используем сессию повторно
  • Но не забываем о стабильности тестов
    • тесты не зависят друг от друга
  • UI тесты являются частью билда

Спасибо!

Вопросы
Ответы
Комментарии

selenide.org