Изменения в Selenide 2.10

Вышла Selenide 4.4.3

Блог

Изменения в Selenide 2.10

Работа с окнами, DragAndDrop, JavaScript ошибки, поиск предков и обновление до Selenium 2.41.0

Всем привет!

Недавно вышла версия Selenide 2.10. Что новенького нас ждёт?

Новые функции

Работа с вкладками и окнами

В Selenium WebDriver неудобно работать с окнами. Selenium предлагает только метод getWindowHandles(), который возвращает множество (Set) строк - идентификаторов открытых окон. Найти среди них нужное - нетривиальная задача.

Поскольку задача Selenide - освободить голову программиста от технических вопросов, мы хотим сделать работу с окнами/вкладками максимально простой и интуитивной. Начали мы с простого: добавили метод

Selenide.switchToWindow(String title)

Пример использования можно подсмотреть здесь:

@Test
  public void canSwitchToWindowByTitle() {
    $(byText("Page2: alerts")).click();
    $(byText("Page1: uploads")).click();

    switchToWindow("Test::alerts");
    $("h1").shouldHave(text("Page with alerts"));

    switchToWindow("Test::uploads");
    $("h1").shouldHave(text("File uploads"));
  }

У нас в планах продолжать работу в этом направлении. Возможно, с использованием новых фич из Java 8.

А как вам было бы удобнее с окнами и фреймами? Делитесь своими идеями!

Новые методы для динамики $.hover() и $.dragAndDropTo(target)


Метод $.hover() эмулирует наведение мышкой на элемент (без клика). Примеры здесь.

А метод $.dragAndDropTo(target) позволяет перетащить элемент в другое место. Пример:

  $("#from").dragAndDropTo("#to")


Новые методы для поиска родительских элементов $.parent() и $.closest()

Часто в тестах бывает удобно найти родительский элемент. Или даже не просто родительский, а ближайший потомок, соответствующий какому-то критерию. Например, я часто ищу по тексту DIV, находящийся внутри таблицы, и затем хочу получить ряд таблицы, в котором этот DIV находится. Раньше это иначе как через XPath сделать было невозможно.

Теперь можно писать так:

  $(byText("Row 1")).parent();
  $(byText("Row 2")).closest("tr");
  $(By.name("firstName")).closest(".form");

Пример здесь

Ловля JavaScript ошибок

Теперь Selenide пытается автоматически отлавливать JavaScript ошибки, случающиеся на странице.

Что мы с ними делаем?

Прежде всего, когда ваш тест падает, Selenide автоматически добавляет в сообщение об ошибке список JS ошибок (если они были). В принципе этого уже достаточно. Но если вы хотите большего контроля, есть два специальных метода:

  • Selenide.getJavascriptErrors() - возвращает список всех ошибок на текущей странице.
  • Selenide.assertNoJavascriptErrors() - валит тест, если были какие-то ошибки.


P.S. Пока что это делается довольно просто (через функцию window.onerror). Она вроде как не во всех браузерах работает, и не все ошибки отлавливает, так что если у вас есть соображения, как это можно делать лучше - смело делитесь.


Багфиксы и улучшения

Закрытие вебдрайверов

Механизм автоматического закрытия вебдрайверов был улучшен для случаев, когда вебдрайверов несколько, и один из них завис. Спасибо Александру Гавриленко за это - совсем нетривиальное - исправление!

Selenide больше не ждёт появления <body>

Метод open(url) больше не ждёт, пока в теле страницы появится тэг <body>. Этот атавизм остался с тех давних пор, когда Selenide ещё умел ожидать наступления событий.

Метод savePageSourceToFile пытается закрыть все alert.

Когда в ходе выполнения теста на странице выскакивает неожиданный alert, грохается не только сам тест, но и попытка сделать скриншот, и даже попытка сохранить исходный код страницы.

Теперь Selenide после падения теста пытается закрыть все алерты, чтобы хоть как-то сохранить код страницы и скриншот. Ну чтобы хоть какая-то информация осталась.

Обновились до Selenium 2.41.0

Как обычно, мы обновились до последнией версии Selenium.

Каких-то проблем с новым селениумом пока не замечено. Всё работает как часы.

Другие новости

Мартовская статистика скачиваний Selenide из центрального репозитория несказанно нас порадовала.

Нас резко стало почти вдвое больше!


А что у вас новенького?


blog comments powered by Disqus

The project is maintained by