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

Использование if-else в работе теста java+selenium+testNG

page-object
selenium
testng
java
Теги: #<Tag:0x00007f7b70aae680> #<Tag:0x00007f7b70aae540> #<Tag:0x00007f7b70aae3d8> #<Tag:0x00007f7b70aae298>

(Andrey90) #1

Добрый день. Я новичек в автоматизации, нуждаюсь в подсказке)
Написал фрейворк для тестирования сайта, использую java, testNG, selenium, PageObject

Возникла проблема следующая:

TicketPage.makeRate(driver).click();

if (TicketPage.errorMessageStopMarket(driver).isDisplayed()){
HomePage.exitButton(driver).click();
}
else if (TicketPage.errorMessageNotMoney(driver).isDisplayed()){
HomePage.exitButton(driver).click();
}
else{
Assert.assertTrue(TicketPage.rateOkMessage(driver).isDisplayed());
HomePage.exitButton(driver).click();
}

Если
первых два ифа не срабатывают то не срабатывает метод
HomePage.exitButton(driver).click(), выдает сообщение “Unable to locate
element: {“method”:“xpath”,“selector”:”//li[@class = “err_1031”]/i"}"
(по даному xpath находится елемент из первого ифа.). Ума не приложу
почему если елемента нет, программа не переходит к следующему ифу.

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

Готов на здравую критику, буду даже благодарен!


(Keiga) #2

Если у Вас PageObject тогда почему в тесте везде driver?
У вас каждый элемент как отдельный метод в который надо передавать driver?
Код для errorMessageStopMarket(driver) можно посмотреть?


(Andrey90) #3
  1. Если у Вас PageObject тогда почему в тесте везде driver? - значит еще плохо вьехал в эту тему…учусь только. Буду благодарен если подскажете как его убрать) Но пока не это основная проблема.
  2. У вас каждый элемент как отдельный метод в который надо передавать driver? - пока да, так
  3. public static WebElement errorMessageStopMarket(WebDriver driver) throws ElementNotFoundException{
     element = driver.findElement(By.xpath("//li[@class = \"err_1031\"]/i"));
     return element;
    
    }

(Keiga) #4

На сколько я понял данный элемент у вас во всех трёх if. При это ругается на локатор этого элемента. Он точно рабочий? Если да, то добавьте ожидание перед кликом.


(Andrey90) #5

нет, для каждого элемента написан похожий метод, который возвращает нужное значение xpath. Все xpath точно рабочие, перепроверял уже 100 раз


(Keiga) #6

Что значит похожий метод, если у Вас в коде из первого сообщения строка: HomePage.exitButton(driver).click(); повторяется три раза в каждом if


(Andrey90) #7

в этом методе да, лдин xpath. Во всех остальных разные. Но дело в том что до метода HomePage.exitButton(driver).click(); дело даже не доходит


(Keiga) #8

Потому что у вас каждый элемент вот так ищется:

public static WebElement errorMessageStopMarket(WebDriver driver) throws ElementNotFoundException{
element = driver.findElement(By.xpath("//li[@class = \"err_1031\"]/i"));
return element;
}

Если элемента на странице нет, то у вас будет эксепшен, потому что он его не может найти. Либо добавляйте условие что при НотФаунд возвращаться false или не изобретайте велосипед, а используйте готовые решения где это всё уже есть.


(5am) #9

if’ы в тестах это моветон и бездна.
тест должен быть повторяем / линеен - в нем не должно быть логики, иначе придется писать автотесты на автотесты

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

разбить на N кол-во тестов. 1 тест - 1 сценарий

Готов на здравую критику, буду даже благодарен!

Ваш PageObject какой то совсем не правильный.
Драйвера в тестах быть не должно
Вызовов методов IWebElement’а в тестах быть не должно - вся работа с элементами находится в классе - странице
и т.п.

вот отличные видео, хоть им уже 6 лет, но актуальность в целом, они свою не потеряли.
для начала must see

part1

part2