Здрасьте!
Мы долго не писали в блог. За это время вышло аж три версии 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