Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Кто как делает Data-driven для формочек - Java/Python

java
webdriver
selenium
Теги: #<Tag:0x00007fedb992a3c0> #<Tag:0x00007fedb992a280> #<Tag:0x00007fedb992a140>

(Vatslau) #1

Есть например форма на 100 полей разных

 public Somae formt fillForm(SomeEntity entity) {
        isActiveCheck.setSelected(entity.isActive);
        startDateField.setValue(entity.startDate);
        endDateField.setValue(entity.endDate);
       +100500 fields

Закидываем туда обект из дата-провайдера и раскидываем поля по филдам - всё ок
но если нужно скипать не обязательные поля - передавать Null
можно например сделать проверки “некошерные”

if (entity.isActive != null) {
            isActiveCheck.setSelected(entity.isActive);
        }

или обернуть сам вызов создав медод для setSelected который будет проверять на Null

 public static void fillText(SelenideElement element, String text) {
        if (null != text) {
            element.setValue(text);
        }
    }

Может есть более красивые варианты?

@asolntsev поправьте если ошибаюсь - экшены кидают нульпойнтер/ на насчёт опции ingnoreIfNull ?


(asolntsev) #2

Честно говоря, я сильно сомневаюсь, что этот ваш “Data Driven” вообще полезен. Кто вам мешает просто вызвать методы в тесты?

public void fillFormForActive() {
  isActiveCheck.setSelected(true);
  startDateField.setValue("01.01.2001");
  endDateField.setValue("31.12.2001");
  +100500 fields
}

public void fillFormForInactive() {
  isActiveCheck.setSelected(false);
  startDateField.setValue("01.01.2011");
  endDateField.setValue("31.12.2011");
  +100500 fields
}

Чем это хуже? Я упорно не понимаю, зачем вы так упарываетесь.


(Vatslau) #3

одни метод на все случаи
1 объект зашёл в него
2 раскидал значения по полям
2 если значение Null нет - экшена для этого елемента нет.

вместо перегрузок или копи-пасты как тут:
запонить только 1 поле

public void fillFormForActive() {
  isActiveCheck.setSelected(true);
}

заполнить все поля к примеру:

public void fillFormForActive() {
  isActiveCheck.setSelected(true);
  startDateField.setValue("01.01.2001");
  endDateField.setValue("31.12.2001");
  +100500 fields
}

(Alexandr D ) #4

Сделайте метод, принимающий Enum, и будет у вас один метод для заполнения/селекта всех полей/чекбоксов/чего угодно и как угодно

public void FillField(Fields field, object value)
        {
            // ...
        }

А его уже оборачивайте, если нужно…


(asolntsev) #5

Вы не один такой, если что. Это очень популярное мнение.
Но оно основано на неверных предположениях.

  1. Кто сказал, что перегрузка - это плохо? Нифига не плохо.
  2. Кто сказал, что несколько разных методов (пусть и внешне похожих) - это копипаста? Нифига не копипаста. Это разные методы. У них разные задачи и разная логика. Вот и нефиг создавать ложное впечатление, будто это один метод.
  3. Кто сказал, что объём кода в этих ваших эксельках (или откуда вы читаете данные) будет меньше, чем в моём варианте? Нифига не меньше. Но зато в моём варианте всё гораздо проще и надёжнее. Автоматически решены все эти вопросы типа “а как мне проверить на null” и т.п.

Что такое вообще “объект зашёл в него”? Объект никуда не заходит. Объект выполняет методы, которые вы вызываете. Никакой магии нет. Есть только код, который вы сами написали. И чем он проще, тем надёжнее.