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

Фотография

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

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
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 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
  • PipPipPip
  • 152 сообщений


Отправлено 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
  • 388 сообщений
  • ФИО:Воробьева Татьяна


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

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


  • 0

#7 MissLeman

MissLeman

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

  • Members
  • PipPipPip
  • 152 сообщений


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

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


  • 0

#8 TatyanaV

TatyanaV

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

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


Отправлено 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
  • PipPipPip
  • 152 сообщений


Отправлено 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
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 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
  • 400 сообщений
  • Город:Н.Новгород

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

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


  • 0

#15 TatyanaV

TatyanaV

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

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


Отправлено 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
  • PipPipPip
  • 152 сообщений


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

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

 

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


  • 1



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

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

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