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

Первый Онлайн ИНститут Тестировщиков
онлайн, начало 25 февраля
Тестирование REST API
онлайн, начало 25 февраля
Логи как инструмент тестировщика
онлайн, начало 25 февраля
Автоматизация функционального тестирования
онлайн, начало 22 февраля
Фотография

Как узнать если объект на страничке, для определения дальнейших действ

junit Java

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

#1 senex

senex

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

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

Отправлено 18 Январь 2019 - 10:07

Intellij IDEA+Java+Selenium+JUnit
Вот у меня на одной страничке есть выбор 2-ух объектов, но если только один, то тест фейлится и висит на findElement когда нету одного из объектов, я понимаю что оно не может найти, но нельзя ли предусмотреть условия или какой таймаут.

//1-ый объект
WebElement SelectUserOwners = driver.findElement(By.xpath("/html/body/div[6]/div[2]/div/form/div[1]/table/tbody/tr/td[2]/div[2]/div/div[4]/div/div/div[2]/a"));
SelectUserOwners.click();

//2-ой объект
WebElement SelectGroupOwners = driver.findElement(By.xpath( "/html/body/div[6]/div[2]/div/form/div[1]/table/tbody/tr/td[1]/div[2]/div/div[4]/div/div/div[2]/a"));
SelectGroupOwners.click();

 

//Сохранение
WebElement CreateNewImage = driver.findElement(By.xpath("/html/body/div[6]/div[11]/div/button[2]"));
CreateNewImage.click();

 

Хочу сделать проверку,
- если есть 1-объект - выбрать его,
- если 2-объект - выбрать его,
- если есть оба - выбрать оба.

 

 


  • 0

#2 TatyanaV

TatyanaV

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

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


Отправлено 18 Январь 2019 - 12:08

Два варианта:
1. findElementне падает с эксепшеном, даже если элементы с таким локатором не найдены - просто возвращает пустой список. Соответственно:
ArrayList<WebElement> selectUserOwners = driver.findElements(By.xpath("/html/body/div[6]/div[2]/div/form/div[1]/table/tbody/tr/td[2]/div[2]/div/div[4]/div/div/div[2]/a"));
if (selectUserOwners.size() > 0selectUserOwners.get(0).click();
 
2. Обернуть оба "элемента" в try { <поиск элемента и клик> } catch (NoSuchElementException e) {}

 

п.с.: локаторы - адские просто. Максимально нестабильные из всех, которые только могут придти в голову :).

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


  • 1

#3 senex

senex

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

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

Отправлено 18 Январь 2019 - 16:19

Спасибо TatyanaV 2-ой вариант зашёл.  :smile: 
а вот тут вопрос "п.с.: локаторы - адские просто. Максимально нестабильные из всех, которые только могут придти в голову :)."
на данный момент, я просто через devtool copy-xpath. Верно ли я понял, что я могу руками переписать и сделать более лаконичными? 

Может быть из-за того, что они такие "адские", на некоторых диалоговых окнах web элементы никак не хотят находиться, как будто фокус уходит с диалога на фоновую страничку?


  • 0

#4 MissLeman

MissLeman

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

  • Members
  • PipPip
  • 141 сообщений


Отправлено 21 Январь 2019 - 08:47

https://www.guru99.c...h-selenium.html вот это почитайте, имхо лучший материал по XPATH (но не забываем, что кроме икспасов еще есть css локаторы и, возможно, какие-то специфичные для инструмента)


  • 2

#5 senex

senex

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

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

Отправлено 21 Январь 2019 - 12:54

Спасибо за ссылку, если не сложно можете оценить, вот такое нахождение элементов нормально или ещё раз и много раз читать статью)) ?

driver.findElement(By.xpath("//a[@href=\"/mc/image/list\"]")).click();
driver.findElement(By.xpath("//span[text()='+ Create New']")).click();
WebElement listOS = driver.findElement(By.xpath("//*[@id=\"imageOSSelect\"]"));
getSelect(listOS).selectByValue("WIN10_64");
driver.findElement(By.xpath("//*[@id=\"deployment_data_center\"]")).click();
driver.findElement(By.xpath("//span[text()='Next >']")).click();


p.s.
вот на русском по XPath тут смотрел

https://drive.google...1R1TzFXbmc/view


  • 1

#6 TatyanaV

TatyanaV

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

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


Отправлено 21 Январь 2019 - 13:35

Кода Ваших страниц тут нет, чтобы сказать, нет ли там возможности не искать по тексту (как + Create New и Next >), но вообще - выглядит гораздо лучше. Фиксированные айдишники - вообще идеальный вариант.


  • 0

#7 MissLeman

MissLeman

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

  • Members
  • PipPip
  • 141 сообщений


Отправлено 22 Январь 2019 - 09:19

Если есть Id, зачем xpath? :)


  • 0

#8 TatyanaV

TatyanaV

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

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


Отправлено 22 Январь 2019 - 10:22

Ну, Вы ему писали выше про css - может решил начать с освоения xpath'а.


  • 0

#9 senex

senex

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

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

Отправлено 23 Январь 2019 - 09:08

MissLeman,TatyanaV, я только начал осваивать на проекте автоматизацию самостоятельно, точнее передо мной поставили цель "нам нужна автоматизация", пока именно UI часть, в нете очень много мнений по поводу всей этой автоматизации, кто-то и xpath хвалит, кто-то говорит медленнее, чем сразу к ID обращаться) поэтому пока xpath учусь писать ручками, "шишки" придется самому набивать походу) Пока у меня ~100 тестов, ещё можно безболезненно переписывать и максимум будет 300-500, скорость для меня не особа важна, а вот советов по стабильности работы тестов очень хотелось бы) изменения на проекте редкие раз в 3 месяца.


  • 0

#10 MissLeman

MissLeman

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

  • Members
  • PipPip
  • 141 сообщений


Отправлено 24 Январь 2019 - 14:10

ну, я не спец в этом (может Татьяна поправит потом), но вообще локаторы надо писать примерно так:

1) есть ID - ищем по ID

2) нету ID, но можно написать однозначный локатор по css - пишем по css

3) если нет, остается xpath, пишем, опираясь на атрибуты элемента (класс, ссылка... НЕ текст, не title и т.п.)

4) и только в самом крайнем случае юзаем текстовое содержимое, но само по себе ничего страшного в этом нет, иногда без этого никак (например, открыть дропдаун со странами и выбрать определенную страну - форматирование у всех элементов, скорее всего, будет одинаковым).

 

если вам поставили цель, раскрутите этих, которые поставили, на тренинг Баранцева Java для тестировщиков, вам намного легче будет, думаю, или еще какой-нибудь курс по нему найдите


  • 0

#11 LexDraven

LexDraven

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

  • Members
  • Pip
  • 8 сообщений
  • Город:Пермь

Отправлено 25 Январь 2019 - 04:36

3) если нет, остается xpath, пишем, опираясь на атрибуты элемента (класс, ссылка... НЕ текст, не title и т.п.)

 

не понимаю почему все так боятся текста, часто ли у вас менялся текст на кнопках или ссылках? Привязка к тексту вполне оправдана, кнопка Сохранить так и останется Сохранить, даже при смене верстки, классов и так далее.

 

driver.findElement(By.xpath("//a[@href=\"/mc/image/list\"]")).click(); - зачем экранировать кавычки, если есть апострофы '  '?


  • 0

#12 TatyanaV

TatyanaV

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

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


Отправлено 25 Январь 2019 - 06:07

 

3) если нет, остается xpath, пишем, опираясь на атрибуты элемента (класс, ссылка... НЕ текст, не title и т.п.)

 

не понимаю почему все так боятся текста, часто ли у вас менялся текст на кнопках или ссылках? Привязка к тексту вполне оправдана, кнопка Сохранить так и останется Сохранить, даже при смене верстки, классов и так далее.

Кнопка "Сохранить" может внезапно стать кнопкой "Save", если в Вашем приложении есть возможность смены языков.

При локаторах по тексту - придётся под каждый язык свою версию локатора делать.

При локаторах по айдишникам, к примеру, условная кнопка #saveBtn - таковой и останется вне зависимости от выбранного языка.


  • 0

#13 senex

senex

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

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

Отправлено 28 Январь 2019 - 09:46

LexDraven, да, экранирование лишнее) 
TatyanaV, можете посмотреть, как быть при таком раскладе?

Видимо мне ещё много учится, но я вот тоже не совсем понимаю, вот есть 2 кнопки:

<div class="ui-dialog-buttonset">

 <button type="button" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" role="button">

   <span class="ui-button-text">Cancel</span>

  </button>

  <button type="button" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" role="button" aria-disabled="false">

   <spanclass="ui-button-text">Import</span>

 </button>

</div>

 

Вот как я нашел: 

driver.findElement(By.xpath("//span[text() = 'Import']")).click();

 

без текста не нашёл вариант как найти элемент, класс одинаковый, через css вроде тоже не получится или для большей надежности можно указать класс и потом только текст, но если кнопка переименуется, вижу неплохой вариант просто использовать POM при разработке тестов.

 


  • 0

#14 checo

checo

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

  • Members
  • PipPipPipPip
  • 328 сообщений
  • Город:Н.Новгород

Отправлено 28 Январь 2019 - 10:37

Забавно. Интересно, как фронт-энд навешивает события на эти кнопки. Хотя не удивлюсь, если во фронт-энде тоже распознавание по тексту.


  • 0

#15 TatyanaV

TatyanaV

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

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


Отправлено 28 Январь 2019 - 11:28

Да, тут похоже, без текста никак. (поиски в стиле button[2] в расчет не беру).

 

Если есть возможность - можно попросить разработчиков добавить айдишники к элементам, с которыми пользователь может взаимодействовать (поля / кнопки и т.п.).

Не только из-за стабильности (и лаконичности) локаторов, но и в целях удобства дальнейшей автоматизации (если есть id - Вы и не будете тратить время и другие локаторы искать).


  • 0

#16 LexDraven

LexDraven

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

  • Members
  • Pip
  • 8 сообщений
  • Город:Пермь

Отправлено 28 Январь 2019 - 15:44

 

 

3) если нет, остается xpath, пишем, опираясь на атрибуты элемента (класс, ссылка... НЕ текст, не title и т.п.)

 

не понимаю почему все так боятся текста, часто ли у вас менялся текст на кнопках или ссылках? Привязка к тексту вполне оправдана, кнопка Сохранить так и останется Сохранить, даже при смене верстки, классов и так далее.

Кнопка "Сохранить" может внезапно стать кнопкой "Save", если в Вашем приложении есть возможность смены языков.

При локаторах по тексту - придётся под каждый язык свою версию локатора делать.

При локаторах по айдишникам, к примеру, условная кнопка #saveBtn - таковой и останется вне зависимости от выбранного языка.

 

ну так я конечно и говорил про 3 вариант, когда уже нет ни ид, ни класса, ни цсс

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


  • 0

#17 MissLeman

MissLeman

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

  • Members
  • PipPip
  • 141 сообщений


Отправлено 29 Январь 2019 - 12:38

Текст, насколько я понимаю, это не то что нельзя, просто зачем изобретать велосипед, если у вас есть запорожец. И зачем ездить на запорожце, если есть феррари :)

 

С текстом еще вот какая проблема бывает, у меня не далее как на прошлой неделе четыре теста полегло, потому что разработчик, никому не сказамши, исправил по указанию дизайнера title (этот атрибут тоже, кстати, надо юзать с осторожностью, т.к. по сути он тот же текст) с More Actions на More actions. Подумаешь, буковка, что там тестировать.


  • 1


Selenium 2.0: стартовый уровень
онлайн
Программирование на Java для тестировщиков
онлайн
Автоматизация функционального тестирования
онлайн
Selenium WebDriver: полное руководство
онлайн




Темы с аналогичным тегами junit, Java

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

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

Яндекс.Метрика
Реклама на портале