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

Фотография

Не всегда срабатывает click по элементу

java testNG PageObject Selenium PageFactory

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

#1 Prettser

Prettser

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

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


Отправлено 06 сентября 2016 - 09:33

Selenium + TestNG + PageFactory

 

Строю фреймворк для написания тестов и загвоздка в методе с кликом по кнопке.

Суть в том, что клик какбЭ не всегда срабатывает, и положенный POST запрос от формы не уходит. Вроде ожидаю как положено элемента, вроде кликаю по нему, но почти в половине случаев фактически в браузере клика не происходит.

 

Привожу части кода

wait = new WebDriverWait(driver, 10);

****

@FindBy(how = How.XPATH, using = "//form[@id=\"logoutForm\"]/button")
private WebElement logoutButton;

****

public void clickLogoutButton() {
    wait.until(ExpectedConditions.elementToBeClickable(logoutButton));
    logoutButton.click();
}
//  А это часть кода HTML, с кнопкой, которую нажимаю
<form action="/loginForm?logout" method="post" id="logoutForm">
      <button type="submit" class="btn btn-danger btn-xs marginLeft20">Выйти</button>
</form>

  • 0

#2 elvis

elvis

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

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


Отправлено 06 сентября 2016 - 09:47

не отработали какие-то вещи на странице, нужно ждать, так как ExpectedConditions.elementToBeClickable - не панацея, увы


  • 1

#3 Prettser

Prettser

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

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


Отправлено 06 сентября 2016 - 09:56

Забыл написать, что submit самой формы вместо click по button - выручает, но это не честно по отношению к действиям настоящего пользователя.

Исходя из этого, есть подозрение, что просто браузер еще не знает о функции

<script>
    function formSubmit() {
        document.getElementById("logoutForm").submit();
    }
</script>

которая прописана сразу же после блока с формой. Может ли быть это причиной?


  • 0

#4 elvis

elvis

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

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


Отправлено 06 сентября 2016 - 10:39

попробуй проверять document.readyState (гугл в помощь) или то, что функция определена


  • 1

#5 serjb9

serjb9

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

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

Отправлено 06 сентября 2016 - 12:10

Вместо клика что происходит?

Элемент в зоне видимости? 

Переинциализировать элемент перед кликом пробовал?


  • 1

#6 Prettser

Prettser

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

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


Отправлено 07 сентября 2016 - 03:52

Вместо клика что происходит?

Элемент в зоне видимости? 

Переинциализировать элемент перед кликом пробовал?

Ничего не происходит. По крайней мере не происходит логаут. Строчка кода выполняется, но результат клика не виден, ни каких ошибок тоже. В этом вся суть вопроса

Элемент в зоне видимости, доступен и кликабелен.

Это на самом деле не элемент, а проксиэлемент (этож PageFactory) и поиск по сути происходит при каждом обращении.

 

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

- Кнопка подгрузилась

- Селениум жмет кнопку

- После этого прогружается функция, которая не вызвалась на момент нажатия кнопки.

 

Попросил разработчиков функцию прописать выше. А пока делаю submit формы вместо функции.


  • 0

#7 serjb9

serjb9

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

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

Отправлено 07 сентября 2016 - 05:13

 

 

Это на самом деле не элемент, а проксиэлемент (этож PageFactory) и поиск по сути происходит при каждом обращении.

 

Я тоже раньше так считал, и не поверил своим глазам, когда повесил переинициализацию на элементы. 

Где собака зарыта и на какой глубине, я пока не знаю (возможно плацебо + время инициализации делают свое дело :) ).

 

 

 

- После этого прогружается функция, которая не вызвалась на момент нажатия кнопки.

Можно было проще обыграть:

- Жмем кнопку

- Т.к. это логаут смотрим, разлогинило нас или нет

Если не вышли: -  Чекаем контент на script (есть ли, загрузился ли)            

                           -  Жмем кнопку еще раз

 

и в loop если необходимо


  • 0

#8 elvis

elvis

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

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


Отправлено 07 сентября 2016 - 08:28

 

 

 

Это на самом деле не элемент, а проксиэлемент (этож PageFactory) и поиск по сути происходит при каждом обращении.

 

Я тоже раньше так считал, и не поверил своим глазам, когда повесил переинициализацию на элементы. 

Где собака зарыта и на какой глубине, я пока не знаю (возможно плацебо + время инициализации делают свое дело :) ).

 

 

 

- После этого прогружается функция, которая не вызвалась на момент нажатия кнопки.

Можно было проще обыграть:

- Жмем кнопку

- Т.к. это логаут смотрим, разлогинило нас или нет

Если не вышли: -  Чекаем контент на script (есть ли, загрузился ли)            

                           -  Жмем кнопку еще раз

 

и в loop если необходимо

 

А если у юзеров кнопка будет срабатывать всегда со 2й попытки? Тест ваш будет зелёный?


  • 1

#9 serjb9

serjb9

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

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

Отправлено 07 сентября 2016 - 11:18

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

Можно было бы вычеркнуть 1+2 шаги нажатия на кнопку, согласен. 

А что делать, если затрекать события не получается ни в какую?


  • 0

#10 Prettser

Prettser

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

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


Отправлено 07 сентября 2016 - 11:39

Перед кликом на кнопку временно сделал вытаскивание в строку driver.getPageSource(); И там вся страница целиком (вместе со скриптом).

И, наверное, это логично. Ведь если элемент отрисован и кликабелен (что проверяется перед кликом), значит это уже идет этап отрисовки и код страницы загружен вместе с нужной функцией.

 

Простой слип в 1000мс перед кликом избавляет от проблемы. Значит чего-то не хватает секундой раньше, но так и не пойму чего. :)

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

Но я же теперь спать нормально не смогу, буду думать о вопросе "Почему? И как можно сделать красиво?"


  • 0

#11 elvis

elvis

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

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


Отправлено 07 сентября 2016 - 13:11

Перед кликом на кнопку временно сделал вытаскивание в строку driver.getPageSource(); И там вся страница целиком (вместе со скриптом).

И, наверное, это логично. Ведь если элемент отрисован и кликабелен (что проверяется перед кликом), значит это уже идет этап отрисовки и код страницы загружен вместе с нужной функцией.

 

Простой слип в 1000мс перед кликом избавляет от проблемы. Значит чего-то не хватает секундой раньше, но так и не пойму чего. :)

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

Но я же теперь спать нормально не смогу, буду думать о вопросе "Почему? И как можно сделать красиво?"

Если это один тест, то можно сформулировать требование так - кнопка logout активна через N ms после того, как стала видимой. И требования к задержке согласовать с продакт оунером. Далее дрючить девов :D


  • 0



Темы с аналогичным тегами java, testNG, PageObject, Selenium, PageFactory

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

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