Перейти к содержимому

Фотография

if-циклы при выполнении теста

Selenium Selenium WebDriver Java Automation

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 15

#1 Raindrops

Raindrops

    Новый участник

  • Members
  • Pip
  • 23 сообщений

Отправлено 21 декабря 2017 - 15:46

Есть элемент, который может принимать 2 вида, в зависимости от ввода пользователя:
<li class="b-result m-wrng" id="result-panel" style="cursor: pointer;">
и
<li class="b-result m-corr" id="result-panel" style="cursor: pointer;">
 
Если class="b-result m-wrng" - нужно завершить тест
Если же class="b-result m-corr" - тест нужно продолжить.

Есть ли какая-то возможность это реализовать? 
 

 


  • 0

#2 Snap

Snap

    Специалист

  • Members
  • PipPipPipPipPip
  • 980 сообщений
  • ФИО:Роман
  • Город:Москва


Отправлено 21 декабря 2017 - 17:22

В чем собственно проблема? В составлении условия или локатора?

Это, конечно, возможно.


  • 0

#3 Raindrops

Raindrops

    Новый участник

  • Members
  • Pip
  • 23 сообщений

Отправлено 21 декабря 2017 - 17:56

В чем собственно проблема? В составлении условия или локатора?

Это, конечно, возможно.

Никак не могу сообразить как оформить локатор. 


  • 0

#4 Spock

Spock

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 772 сообщений
  • ФИО:Роман

Отправлено 21 декабря 2017 - 17:56

написать 2 теста, в одном сделать неправильный ввод и дождаться первого элемента

в другом тесте сделать правильный ввод и дождаться второго элемента


  • 0

#5 Snap

Snap

    Специалист

  • Members
  • PipPipPipPipPip
  • 980 сообщений
  • ФИО:Роман
  • Город:Москва


Отправлено 21 декабря 2017 - 18:58

Примерно так, при желании можно еще ID добавить.

 

XPath

//li[contains(@class,'m-wrng')]
//li[contains(@class,'m-corr')]

CSS

li[class*='m-wrng']
li[class*='m-corr']

  • 0

#6 Raindrops

Raindrops

    Новый участник

  • Members
  • Pip
  • 23 сообщений

Отправлено 21 декабря 2017 - 18:58

написать 2 теста, в одном сделать неправильный ввод и дождаться первого элемента

в другом тесте сделать правильный ввод и дождаться второго элемента

Вот только я спрашивал совсем не об этом.
Кроме того,  class может быть "b-result m-corr" и после десятка вводов, а может стать "b-result m-wrng" и после первого. Поэтому и нужен if цикл.


  • 0

#7 Raindrops

Raindrops

    Новый участник

  • Members
  • Pip
  • 23 сообщений

Отправлено 21 декабря 2017 - 19:26

 

Примерно так, при желании можно еще ID добавить.

 

XPath

//li[contains(@class,'m-wrng')]
//li[contains(@class,'m-corr')]

CSS

li[class*='m-wrng']
li[class*='m-corr']

Поправьте меня, пожалуйста. Никак не могу добиться работы теста.
Сейчас мой код выглядит так:
if(webDriver.findElement(By.xpath("//li[contains(@class,'m-corr')]")).isDisplayed()){

     //делай это.

}

else if(webDriver.findElement(By.xpath("//li[contains(@class,'m-wrng')]")).isDisplayed()){
     //сделай так.
}

 

В случае если отображается m-corr - выполняется все внутри if и тест завершается. Но если первым отображается m-wrong - тест падает на if и до else if даже не доходит


  • 0

#8 soleksenko2702

soleksenko2702

    Постоянный участник

  • Members
  • PipPipPip
  • 193 сообщений
  • ФИО:Олексенко Сергей

Отправлено 22 декабря 2017 - 07:34

 

 

Примерно так, при желании можно еще ID добавить.

 

XPath

//li[contains(@class,'m-wrng')]
//li[contains(@class,'m-corr')]

CSS

li[class*='m-wrng']
li[class*='m-corr']

Поправьте меня, пожалуйста. Никак не могу добиться работы теста.
Сейчас мой код выглядит так:
if(webDriver.findElement(By.xpath("//li[contains(@class,'m-corr')]")).isDisplayed()){

     //делай это.

}

else if(webDriver.findElement(By.xpath("//li[contains(@class,'m-wrng')]")).isDisplayed()){
     //сделай так.
}

 

В случае если отображается m-corr - выполняется все внутри if и тест завершается. Но если первым отображается m-wrong - тест падает на if и до else if даже не доходит

 

Все правильно, падает потому что не находит элемент.

Я бы в вашем случае получал элемент по id, насколько видно из примера он одинаковый для обоих случаев. А потом получал бы атрибут и проверял его в if.


  • 0

#9 Snap

Snap

    Специалист

  • Members
  • PipPipPipPipPip
  • 980 сообщений
  • ФИО:Роман
  • Город:Москва


Отправлено 22 декабря 2017 - 08:11

Поправьте меня, пожалуйста. Никак не могу добиться работы теста.

Сейчас мой код выглядит так:
if(webDriver.findElement(By.xpath("//li[contains(@class,'m-corr')]")).isDisplayed()){


     //делай это.

}

else if(webDriver.findElement(By.xpath("//li[contains(@class,'m-wrng')]")).isDisplayed()){
     //сделай так.
}

 

В случае если отображается m-corr - выполняется все внутри if и тест завершается. Но если первым отображается m-wrong - тест падает на if и до else if даже не доходит

 

Либо как вам подсказали выше, либо:

if(webDriver.findElements(By.xpath("//li[contains(@class,'m-corr')]")).size() > 0){
     //делай это.
}
else if(webDriver.findElements(By.xpath("//li[contains(@class,'m-wrng')]")).size() > 0){
     //сделай так.
}

  • 0

#10 Spock

Spock

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 772 сообщений
  • ФИО:Роман

Отправлено 22 декабря 2017 - 08:34

вообще тест не должен содержать таких условий

 

получается что тест прогоняет только один вариант из двух, чуть ли не рандомно?


  • 0

#11 Raindrops

Raindrops

    Новый участник

  • Members
  • Pip
  • 23 сообщений

Отправлено 22 декабря 2017 - 09:13


Все правильно, падает потому что не находит элемент.

Я бы в вашем случае получал элемент по id, насколько видно из примера он одинаковый для обоих случаев. А потом получал бы атрибут и проверял его в if.

 

То есть примерно так?

 

 

Поправьте меня, пожалуйста. Никак не могу добиться работы теста.

Сейчас мой код выглядит так:
if(webDriver.findElement(By.xpath("//li[contains(@class,'m-corr')]")).isDisplayed()){


     //делай это.

}

else if(webDriver.findElement(By.xpath("//li[contains(@class,'m-wrng')]")).isDisplayed()){
     //сделай так.
}

 

В случае если отображается m-corr - выполняется все внутри if и тест завершается. Но если первым отображается m-wrong - тест падает на if и до else if даже не доходит

 

Либо как вам подсказали выше, либо:

if(webDriver.findElements(By.xpath("//li[contains(@class,'m-corr')]")).size() > 0){
     //делай это.
}
else if(webDriver.findElements(By.xpath("//li[contains(@class,'m-wrng')]")).size() > 0){
     //сделай так.
}

 

 Все отлично работает, безмерно благодарен Вам!


  • 0

#12 Raindrops

Raindrops

    Новый участник

  • Members
  • Pip
  • 23 сообщений

Отправлено 22 декабря 2017 - 09:19

вообще тест не должен содержать таких условий

 

получается что тест прогоняет только один вариант из двух, чуть ли не рандомно?

Есть некий тест (экзамен), в котором после ответа может отображаться либо True, либо False. Вот мой @Test и вводит рандомные ответы, дожидается появления обоих состояний (True и False) и завершает работу.


  • 0

#13 Raindrops

Raindrops

    Новый участник

  • Members
  • Pip
  • 23 сообщений

Отправлено 22 декабря 2017 - 09:21

 

 

 

Примерно так, при желании можно еще ID добавить.

 

XPath

//li[contains(@class,'m-wrng')]
//li[contains(@class,'m-corr')]

CSS

li[class*='m-wrng']
li[class*='m-corr']

Поправьте меня, пожалуйста. Никак не могу добиться работы теста.
Сейчас мой код выглядит так:
if(webDriver.findElement(By.xpath("//li[contains(@class,'m-corr')]")).isDisplayed()){

     //делай это.

}

else if(webDriver.findElement(By.xpath("//li[contains(@class,'m-wrng')]")).isDisplayed()){
     //сделай так.
}

 

В случае если отображается m-corr - выполняется все внутри if и тест завершается. Но если первым отображается m-wrong - тест падает на if и до else if даже не доходит

 

Все правильно, падает потому что не находит элемент.

Я бы в вашем случае получал элемент по id, насколько видно из примера он одинаковый для обоих случаев. А потом получал бы атрибут и проверял его в if.

Подозреваю, что я понял Вас не верно, потому что снова написал что-то не рабочее

if(webDriver.findElement(By.id("result-panel")).getAttribute("//li[contains(@class,'m-corr')]"){
System.out.println("True");
}
else if(webDriver.findElement(By.id("result-panel")).findElement(By.xpath("//li[contains(@class,'m-wrng')]")).isDisplayed()){
System.out.println("False");
}

Не могли бы Вы показать что имели ввиду? 


  • 0

#14 Spock

Spock

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 772 сообщений
  • ФИО:Роман

Отправлено 22 декабря 2017 - 09:41

 

 

Есть некий тест (экзамен), в котором после ответа может отображаться либо True, либо False. Вот мой @Test и вводит рандомные ответы, дожидается появления обоих состояний (True и False) и завершает работу.

допустим такая ситуация:

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


  • 0

#15 Lzk

Lzk

    Специалист

  • Members
  • PipPipPipPipPip
  • 504 сообщений
  • ФИО:Олег
  • Город:Мск

Отправлено 22 декабря 2017 - 09:49

 

 

 

 

Примерно так, при желании можно еще ID добавить.

 

XPath

//li[contains(@class,'m-wrng')]
//li[contains(@class,'m-corr')]

CSS

li[class*='m-wrng']
li[class*='m-corr']

Поправьте меня, пожалуйста. Никак не могу добиться работы теста.
Сейчас мой код выглядит так:
if(webDriver.findElement(By.xpath("//li[contains(@class,'m-corr')]")).isDisplayed()){

     //делай это.

}

else if(webDriver.findElement(By.xpath("//li[contains(@class,'m-wrng')]")).isDisplayed()){
     //сделай так.
}

 

В случае если отображается m-corr - выполняется все внутри if и тест завершается. Но если первым отображается m-wrong - тест падает на if и до else if даже не доходит

 

Все правильно, падает потому что не находит элемент.

Я бы в вашем случае получал элемент по id, насколько видно из примера он одинаковый для обоих случаев. А потом получал бы атрибут и проверял его в if.

Подозреваю, что я понял Вас не верно, потому что снова написал что-то не рабочее

if(webDriver.findElement(By.id("result-panel")).getAttribute("//li[contains(@class,'m-corr')]"){
System.out.println("True");
}
else if(webDriver.findElement(By.id("result-panel")).findElement(By.xpath("//li[contains(@class,'m-wrng')]")).isDisplayed()){
System.out.println("False");
}

Не могли бы Вы показать что имели ввиду? 

if(webDriver.findElements(By.xpath("//li[contains(@class,'m-corr')]").size() != 0){
...

  • 0

#16 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 26 декабря 2017 - 08:31

"Цикл — разновидность управляющей конструкции в высокоуровневых языках программирования, предназначенная для организации многократного исполнения набора инструкций. "
 
If - это не цикл, он не предназначен для "многократного исполнения набора инструкций". Циклы - это for или while, к примеру.

if(webDriver.findElement(By.id("result-panel")).getAttribute("//li[contains(@class,'m-corr')]"){
System.out.println("True");
}

 

Некорректно, т.к. у элемента li нет атрибута с названием "//li[contains(@class,'m-corr')]".

Кроме того, getAttribute - просто вернут значение указанного атрибута, а if работает с true/false - т.е. в if'е полученное значение атрибута нужно ещё и сравнить с чем-нибудь.

Например, if ( driver.findElement(By.cssLocator(locator)).getAttribute("value").contains("smth") ) { ... }

 

 
Если нужно выводить просто true/false - можно вариант Lzk ещё слегка сократить:
System.out.println(webDriver.findElements(By.xpath("//li[contains(@class,'m-corr')]").size() > 0)

  • 0



Темы с аналогичным тегами Selenium, Selenium WebDriver, Java, Automation

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных