Изменения в Selenide 2.13 и 2.14

Изменения в Selenide 2.13 и 2.14

Быстрый setValue, проверка картинок, кастомные сообщения об ошибке, обновление до Selenium 2.43.1
28.09.14

Всем привет!

В сентябре мы успели зарелизить сразу две версии: Selenide 2.13 и 2.14. Функций там немного, но есть одна принципиально важная, с неё и начнём.

Быстрый метод $.setValue

Мы в Codeborne анализировали производительность тестов на реальных проектах и заметили, что самая медленная операция - это не поиск по XPath, как многие думают, а заполнение текстовых полей. То есть функция $.setValue (она же WebElement.sendKeys). Дело в том, что по умолчанию Selenium при заполнении поля эмулирует нажатия каждой отдельной клавиши со всеми сопутствующими событиями: keyDown, keyUp и пр. - что делает метод sendKeys относительно медленным.

Можно отключить генерацию событий, но тогда перестанет работать та функциональность, которая на них рассчитывает: автозаполнение, автопоиск и т.д.

Мы придумали следующее решение проблемы. Пусть в Selenide будет два разных метода: $.sendKeys и $.setValue. Первый будет работать как Selenium по умолчанию, то есть медленно и с генерацией событий. Второй будет работать быстро, устанавливая значение поля через JavaScript. Тогда автор теста сам сможет решить, какой из методов нужен в каждом отдельном случае. В большинстве случаев можно использовать метод $.setValue, ибо автопоисков не так-то много в сравнении с массой “обычных” полей.

На наших проектах использование быстрого метода $.setValue дало заметную экономию примерно в 10%.

NB! Эта фича пока экспериментальная и включается флагом -Dselenide.fastSetValue=true. По умолчанию она выключена, и $.setValue работает так же, как и $.sendKeys.

Добавлен метод для проверки картинок $("img").isImage()

Метод $("img").isImage() возвращает true, если картинка корректно загрузилась. Вызывать метод можно только для элементов <img>.

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

NB! Функция почему-то не работает в HtmlUnit.

Добавилась возможность писать поясняющее сообщение к проверкам (как в ассертах JUnit и TestNG)

Теперь ко всем should-методам можно приписать сообщение:

$("#kpp").shouldBe("У частных лиц КПП всегда пустой", empty);

В случае падения теста этот комментарий будет добавлен в сообщение об ошибке:

Element should be empty {By.id: kpp} because У частных лиц КПП всегда пустой
Element: '<input id="kpp">012973891263</input>'
Screenshot: file:/Users/andrei/projects/selenide/build/reports/tests/integration/SelenideMethodsTest/waitUntilMethodMayContainOptionalMessageThatIsPartOfErrorMessage/1411898416054.0.png
Timeout: 4 s.

Я не уверен, что эта фича сделана самым удобным образом. Поэтому жду ваших идей. Как, по-вашему, это можно было бы сделать лучше?

Может быть, например, такой вариант был бы удобнее?

$("#kpp").shouldBe(empty.because("У частных лиц КПП всегда пустой"));

Но тогда комментарий придётся дублировать, если хочется проверить разом несколько условий.

Есть ещё такой вариант:

$("#kpp").because("У частных лиц КПП всегда пустой").shouldBe(empty);

Ну, и меня смущает ещё слово “because” - ведь в разных ситуациях было бы удобнее вместо “because” использовать другие слова.

А что вы думаете?

Добавились врапперы be и have.

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

$("#username").should(have(text("Ivan")));
$("br").should(be(empty));

Это может быть полезно при использовании Selenide с фреймворками типа EasyB, которые тоже используют слова shouldBe или shouldHave для своих целей.


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

Этого релиза Selenium WebDriver все очень ждали. Во-первых, из-за поддержки FireFox 32, а во-вторых, из-за нового драйвера для InternetExplorer.

Проблем с новым Selenium 2.43.1 замечено не было.


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


28.09.14