Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Перегрузка/переопределение методов в Java

webdriver
java
Теги: #<Tag:0x00007f7b65535240> #<Tag:0x00007f7b65535100>

(Vladyslav Stuparenko) #1

Есть такой кусок кода :

public void testNForm(WebElement one, WebElement two, WebElement button, WebElement acceptInf){
        setElementText(one);
        sendAndAssertNegativeTest(button, acceptInf);
        one.clear();
        setElementText(one);
        setElementText(two);
        sendAndAssertNegativeTest(button, acceptInf);
    }
       public void sendAndAssertNegativeTest(WebElement button, WebElement acceptInf) {
        wait.until(ExpectedConditions.elementToBeClickable(button));
        for(int i=1; i<5; i++) {
            clickOnElement(button);
        }
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println();
        Assert.assertTrue(!acceptInf.isDisplayed(), "\n" + "Negative test # " + countNF + " is failed - form sent");
        System.out.println("Negative test # " + countNF + " is passed");
        countNF++;
    }

    public void sendAndAssertNegativeTest(WebElement button, String acceptInf) {
        wait.until(ExpectedConditions.elementToBeClickable(button));
        for(int i=1; i<5; i++) {
            clickOnElement(button);
        }
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println();
        Assert.assertNotEquals(driver.getCurrentUrl(),acceptInf, "\n" + "Negative test # " + countNF + " is failed - form sent");
        System.out.println("Negative test # " + countNF + " is passed");
        countNF++;
    }

Нужно перегрузить метод testNForm так , чтоб он вместо последнего аргумента WebElement acceptInf принимал на себя String с таким же названием. При условии что будет стринг должен вызываться второй метод , с проверкой url .
Можно сделать простой копипастой но это не правильно я считаю


#2

А что Вас смущает и где будет копипаста? Кстати, она уже в методах sendAndAssertNegativeTest имеется. Перегрузить метод testNForm, тогда будет два метода с разными сигнатурами. Или применить generics (https://docs.oracle.com/javase/tutorial/java/generics/methods.html), только зачем?


(Vladyslav Stuparenko) #3

Хорошо , давайте допустим что мне нужно написать подобные методы , только для других форм (3,4,5… полей для ввода) . С каждым дополнительным полем метод нужно дополнять к предыдущему + дублировать в случае , если последний аргумент это String


#4

Можно page object и код теста в студию? Похоже я не осознаю всю глубину глубин :slight_smile:


(Vladyslav Stuparenko) #5

Принцип такой :
Класс negative testing расширяет базовый класс (в котором прописаны все рутинные экшены)
В классе negative testing реализованы методы для негативного тестирования форм с разным количеством полей.
После отправки сообщения может быть два варианта - либо выпадает поп-ап об успешной отправке , либо нас перебрасывает на другую страницу с сообщением.
Для этих двух случаев реализовано два метода sendAndAssertNegativeTest - в первом методе мы проверяем , не выпал ли нам поп ап (последний аргумент WebElement) , в втором методе мы проверяем , не поменялась ли ссылка после отправки (Последний аргумент String).
Дело в том , что мне нужно расписать методы testNForm, с наименьшим количеством копипасты.
Как это можно реализовать ?


#6

Нууу, пускай тогда метод всегда проверяет УРЛ. Или всегда проверяет веб-элемент (наличие или отстутсвие). Зачем делать один метод, который будет делать все подряд. Или можно переписать методы, и более крупные методы отвечающие за проверки, будут использовать функцональность более мелких. Может методы, которые будут иметь меньшую функциональность стоит сделать приватными. Что если пойти с этой стороны?


(Odynplus) #7

Можно сделать:
public void testNForm(WebElement one, WebElement two, WebElement button, Object acceptInf){
if (acceptInf instanceof WebElement){
} else if(acceptInf instanceof String){
} else{}

Но так делать плохо. Как впрочем и sleep и наследование теста от pageobject )


(Vladyslav Stuparenko) #8

Нет , только одно чтото проверять не вариант , т.к. если поп-ап - урл не меняется , если переход на новую страницу - не видно нужного сообещния в доме , следственно NoSuchElementExсeption


(Vladyslav Stuparenko) #9

Этот вариант я и хотел ! Но не знал как вопрос оформить )
В данном случае ну никак не заменить слип , а в наследовании что плохого то ?


#10

Там вроде не тест наследуется, а проверки засунуты в pageobject.


#11

Но ведь результат ожидаем заранее. Результат будет получен исходя из введенных данных. Или мы вводим данные, а результат хз какой и мы хотим проверить все возможные варианты?


(Odynplus) #12

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


(Odynplus) #13

тут похоже как раз последний вариант. И конечно это тоже плохо )


#14

Хм, разве я агитирую создавать такой вот killer-метод? ))


(Vladyslav Stuparenko) #15

Всмысле заранее ?
Мы заполняем данные (наполовину/некорректные) и пытаемся их отправить , а потом ожидаем , не пришло ли нам подтверждение


(Vladyslav Stuparenko) #16

А как тогда избежать наследования ?
Создать просто обьект ?


#17

[quote=“Vladyslav_Stuparenko, post:15, topic:8039, full:true”]
Мы заполняем данные (наполовину/некорректные) и пытаемся их отправить , а потом ожидаем , не пришло ли нам подтверждение
[/quote] проблема в том, что мы пытаемся сделать один метод, который будет проверять два варианта: успех и неудачу. Но мы можем перед выполнением теста предсказать желаемый результат. То есть если мы введем некорректные данные в поля, то мы ожидаем увидеть сообщение об ошибке (или что-то там еще).

Проблема в том, что мы хотим метод, который отвечает за слишком много вещей.


(5am) #18

можно сделать метод с не ограниченным кол-вом параметров

public void testNForm(WebElement acceptInf, WebElement… elements)

и в цикле foreach / for вызывать setElementText(element)

google:
java неограниченное количество параметров