Изменения в Selenide 2.16 и 2.17

Изменения в Selenide 2.16 и 2.17

Профайлер, Soft asserts и немного улучшалок
05.05.15

Здрасьте!

Мы долго не писали в блог. За это время вышло аж три версии Selenide. Сегодня расскажу про изменениях в версиях 2.16 и 2.17

Soft asserts

Мы наконец-то добавили SoftAsserts в Selenide. Я до сих пор не уверен, что это хорошая идея, но уж очень много просили. :)

По сути, режим SoftAssert означает, что все проверки типа $.shouldHave(text("xxx")) будут валиться не сразу, а только в конце теста. Это позволяет разом накопить все фейлы, разом их исправить и один раз перезапустить тест. Наверное, это удобно, если каждый запуск тестов обходится вам слишком дорого.

Чтобы включить Soft asserts в JUnit (см. документацию):

public class SoftAssertJUnitTest {
  @Rule public SoftAsserts softAsserts = new SoftAsserts();

Чтобы включить Soft asserts в TestNG (см. документацию):

@Listeners(SoftAsserts.class)
public class SoftAssertTestNGTest {

И как выглядит результат.

После запуска всего теста в конце выплёвываются разом все накопившиеся ошибки:

java.lang.AssertionError: Test userCanUseSoftAssertWithJUnit(integration.SoftAssertJUnitTest) failed.
3 checks failed

FAIL #1: Element should have attribute value=777 {#radioButtons input}
Element: '<input name="me" type="radio" value="master"></input>'
Screenshot: file:/Users/andrei/projects/selenide/build/reports/tests/integration/SoftAssertJUnitTest/userCanUseSoftAssertWithJUnit/1425503251321.0.png
Timeout: 0 ms.

FAIL #2: Element not found {#radioButtons select}
Expected: visible
Screenshot: file:/Users/andrei/projects/selenide/build/reports/tests/integration/SoftAssertJUnitTest/userCanUseSoftAssertWithJUnit/1425503252361.1.png
Timeout: 0 ms.
Caused by: NoSuchElementException: Unable to locate element: {"method":"css selector","selector":"#radioButtons select"}

FAIL #3: Element not found {#xxx}
Expected: visible
Screenshot: file:/Users/andrei/projects/selenide/build/reports/tests/integration/SoftAssertJUnitTest/userCanUseSoftAssertWithJUnit/1425503252697.2.png
Timeout: 0 ms.
Caused by: NoSuchElementException: Unable to locate element: {"method":"css selector","selector":"#xxx"}

    at org.junit.Assert.fail(Assert.java:88)
    at com.codeborne.selenide.junit.SoftAsserts.after(SoftAsserts.java:54)
    at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:50)
        ....
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

Профайлер

Теперь Selenide умеет составлять отчёт обо всех действиях, совершённых в ходе теста. В том числе логируется время выполнения каждой команды. Это позволит вам точнее понять, что происходит в тестах, на что уходит время и не делает ли тест чего лишнего.

Пример отчёта:

+--------------------+--------------------------------------------+----------+----------+
|Element             |Subject                                     |Status    |ms.       |
+--------------------+--------------------------------------------+----------+----------+
|open                |http://0.0.0.0:23762/page_jquery.html       |PASSED    |131       |
|#multirowTable      |find elements(by text: Chack)               |PASSED    |100       |
|#multirowTable tr   |find elements(by text: Chack)               |PASSED    |100       |
|#multirowTable tr   |find(by text: Chack)                        |PASSED    |0         |
|by text: Chack      |get attribute(class)                        |PASSED    |139       |
+--------------------+--------------------------------------------+----------+----------+

Чтобы включить этот отчёт, нужно добавить такое правило в ваши тесты:

@Rule
public TestRule prettyReportCreator = new PrettyReportCreator();

Эта функциональность экспериментальная, пока поддерживается только JUnit.

Попробуете - расскажите, как получилось.

Спасибо kumarunster за этот pull request!


Исправлена функция $.closest()

Теперь поиск родительского элемента по классу работает корректно:

  $(By.name("firstName")).closest(".active");


Метод $.toString() теперь логирует все атрибуты

Раньше метод логировал только несколько конкретных атрибутов: id, class, type и т.д. Проблема в том, что Selenium webdriver не предоставляет метода для получения всех атрибутов.

Но мы нашли способ! Теперь метод $.toString(), используя хитрый JavaScript, достаёт все атрибуты:

      assertEquals("<div class=\"invisible-with-multiple-attributes\" " +
          "data-animal-id=\"111\" id=\"gopher\" ng-class=\"widget\" ng-click=\"none\" " +
          "onchange=\"console.log(this);\" onclick=\"void(0);\" placeholder=\"Животное\" " +
          "displayed:false></div>", $("#gopher").toString());

Обновились до Selenium 2.45.0.

Внимание, с этим релизом отключились нативные события в Firefox.

Только не спрашивайте: “И чо?” Я и сам хотел бы знать - и чо?


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


05.05.15