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

Фотография

Написать цикл: пока кнопка видна - нажимать

цикл в тестах

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

#1 marinel

marinel

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

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


Отправлено 24 сентября 2015 - 14:07

Всем добрый день.

Подскажите, пожалуйста, как написать цикл для следующего теста.

 

приложение позволяет создать не более 10 полей при помощи кнопки.

Думаю о том, что бы написать цикл, где будет нажиматься кнопка до тех пор, пока она не исчезнет.

В доступных примерах дается инициализация в виде счетчика, как это можно применить к кнопке?

 

Заранее спасибо.


  • 0

#2 Vad1m198

Vad1m198

    Активный участник

  • Members
  • PipPip
  • 115 сообщений
  • ФИО:Вадим


Отправлено 24 сентября 2015 - 14:12

Ну если нажимать пока не исчезнет, то как то так

 

WebElement el = driver.findElementBy....

 

while(el.isDisplayed())

   el.click();


  • 0

#3 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 24 сентября 2015 - 14:24

Думаю о том, что бы написать цикл, где будет нажиматься кнопка до тех пор, пока она не исчезнет.

 

 

while(el.isDisplayed())

   el.click();

 

 

 

Вот только никогда нельзя делать так.

А если кнопка никогда не исчезнет и ты получишь бесконечный цикл !


  • 0

#4 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 24 сентября 2015 - 14:34

private static final int MAX_COUMT_CLICK_BUTTON = 10;



-----

    int i = 0;
        while(el.isDisplayed()) {
            if (MAX_COUMT_CLICK_BUTTON == i) {
                log.error("Click " + MAX_COUMT_CLICK_BUTTON+ " and the button is visible");
                break;
            }
            i++;
              el.click();
        }

  • 0

#5 vkazar

vkazar

    Активный участник

  • Members
  • PipPip
  • 128 сообщений
  • ФИО:Виктор
  • Город:Москва

Отправлено 24 сентября 2015 - 15:21

private static final int MAX_COUNT_CLICK_BUTTON = 10;

for (var i=1; i<=MAX_COUNT_CLICK_BUTTON ; i++)
{
    if (el.isDisplayed()) el.Click();
    Assert.IsFalse(el.isDisplayed(), "Кнопка исчезла после совершения " + i + " кликов");
}
Assert.IsTrue(el.isDisplayed(), "Кнопка не исчезла после совершения " + MAX_COUNT_CLICK_BUTTON + " кликов");

  • 0

Тестировщик должен быть умнее программиста... ну, по крайней мере, хитрее. ©


#6 marinel

marinel

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

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


Отправлено 24 сентября 2015 - 15:29

Ребята, спасибо вам огромное  :victory:


  • 0

#7 elvis

elvis

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

  • Members
  • PipPipPip
  • 189 сообщений
  • Город:Tallinn


Отправлено 24 сентября 2015 - 18:53

извините за глупый вопрос - а зачем вам это? Я так понимаю кнопка не нажимается сразу и вы жёстко жмёте её до посинения, пока не отработает onclick ?


  • 0

#8 breakmt

breakmt

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

  • Members
  • Pip
  • 22 сообщений
  • Город:Санкт-Петербург

Отправлено 24 сентября 2015 - 20:07

private static final int MAX_COUNT_CLICK_BUTTON = 10;

for (var i=1; i<=MAX_COUNT_CLICK_BUTTON ; i++)
{
    if (el.isDisplayed()) el.Click();
    Assert.IsFalse(el.isDisplayed(), "Кнопка исчезла после совершения " + i + " кликов");
}
Assert.IsTrue(el.isDisplayed(), "Кнопка не исчезла после совершения " + MAX_COUNT_CLICK_BUTTON + " кликов");

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


  • 0

#9 marinel

marinel

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

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


Отправлено 25 сентября 2015 - 06:13

Все бы хорошо. Да приложение на аяксе и дело усложняют ожидание.

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

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

 

for (int second = 0;; second++) {
if (second >= 60) fail("timeout");
try { if ("Disable administration".equals(driver.findElement(By.id("administration")).getText())) break; } catch (Exception e) {}
Thread.sleep(1000);
}
 
Заранее спасибо

  • 0

#10 vkazar

vkazar

    Активный участник

  • Members
  • PipPip
  • 128 сообщений
  • ФИО:Виктор
  • Город:Москва

Отправлено 25 сентября 2015 - 06:48

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

Вы правы, перепутал местами IsTrue и IsFalse :)

private static final int MAX_COUNT_CLICK_BUTTON = 10;

for (var i=1; i<=MAX_COUNT_CLICK_BUTTON ; i++)
{
    if (el.isDisplayed()) el.Click();
    Assert.IsTrue(el.isDisplayed(), "Кнопка исчезла после совершения " + i + " кликов");
}
Assert.IsFalse(el.isDisplayed(), "Кнопка не исчезла после совершения " + MAX_COUNT_CLICK_BUTTON + " кликов");

  • 0

Тестировщик должен быть умнее программиста... ну, по крайней мере, хитрее. ©


#11 breakmt

breakmt

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

  • Members
  • Pip
  • 22 сообщений
  • Город:Санкт-Петербург

Отправлено 25 сентября 2015 - 08:04

 

Все бы хорошо. Да приложение на аяксе и дело усложняют ожидание.

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

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

 

for (int second = 0;; second++) {
if (second >= 60) fail("timeout");
try { if ("Disable administration".equals(driver.findElement(By.id("administration")).getText())) break; } catch (Exception e) {}
Thread.sleep(1000);
}
 
Заранее спасибо

 

 

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

Еще рекомендую почитать про selenide - в нем многие проблемы и вопросы (в том числе с ожиданиями) уже решены и вам не нужно будет тратить силы и нервы на изобретение велосипеда.


  • 0

#12 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 25 сентября 2015 - 08:20

2 marinel

Я перестал понимать, как работает ваше приложение.

Думал что

 

Думаю о том, что бы написать цикл, где будет нажиматься кнопка до тех пор, пока она не исчезнет.

 

 просто кликешь на кнопку N раз и она исчезает

Теперь же

цикл не успевает дождаться появление кнопки, решает, что ее нет и заканчивается.

 

Т..е кликнули на кнопку она исчезла, когда появилась - кликнули еще раз (опять исчезла и появилась), на N-ый клик - они исчезла и не появилась ?

Или же открыли страницу, а кнопка еще не появилась, т.е. мы в ПЕРВЫЙ раз хотим нажать на кнопку, а её нет ?

По коду:

1)if (second >= 60)

60 сделайте константой

2) Не используйте пустые

catch (Exception e) {
    }


  • 0

#13 marinel

marinel

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

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


Отправлено 25 сентября 2015 - 09:32

Виктор, приложение работает так:

есть кнопка "Новое поле" при нажатии на нее, появляется новое поле.

Полей может быть всего 10, тоесть нажать можно 9 раз, т.к. одно поле по умолчанию уже есть.


  • 0

#14 Snap

Snap

    Специалист

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


Отправлено 25 сентября 2015 - 12:43

 

Думаю о том, что бы написать цикл, где будет нажиматься кнопка до тех пор, пока она не исчезнет.

 

while(el.isDisplayed())

   el.click();

 

Вот только никогда нельзя делать так.

А если кнопка никогда не исчезнет и ты получишь бесконечный цикл !

Так это же был просто шаблон, остальное автор додумает (счетчики и т.п.).


  • 0

#15 elvis

elvis

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

  • Members
  • PipPipPip
  • 189 сообщений
  • Город:Tallinn


Отправлено 25 сентября 2015 - 12:58

1. нажимаем кнопку
2. ждём пока не появится новое поле (ожидание ExpectedConditions)
3. повторяем цикл 9 раз
4. проверяем что кнопка исчезла.
 


  • 0

#16 BabyRoot

BabyRoot

    Специалист

  • Members
  • PipPipPipPipPip
  • 833 сообщений


Отправлено 25 сентября 2015 - 13:18

Предвижу следующий вопрос: а где вы взяли такой полезный и интересный метод .isDisplayed() ? )))


  • 1

#17 marinel

marinel

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

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


Отправлено 29 сентября 2015 - 10:46

Всем огромное спасибо!

Получилось решить задачу таким образом:

 

public void createNewMeasure() throws InterruptedException {
for (int x = 0; x < 9; x++){
driver.findElement(By.name("newMeasure")).click();
waitFor();
}
}
 
:victory:

  • 0

#18 vkazar

vkazar

    Активный участник

  • Members
  • PipPip
  • 128 сообщений
  • ФИО:Виктор
  • Город:Москва

Отправлено 29 сентября 2015 - 12:01

Всем огромное спасибо!
Получилось решить задачу таким образом:
 
public void createNewMeasure() throws InterruptedException {
for (int x = 0; x < 9; x++){
driver.findElement(By.name("newMeasure")).click();
waitFor();
}
}
 
:victory:


а в waitFor() что находится?) опять sleep?)
  • 0

Тестировщик должен быть умнее программиста... ну, по крайней мере, хитрее. ©



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

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