Обнаружение элементов без использования xpath

java
selenium
webdriver
Теги: #<Tag:0x00007fedbfd1f1c8> #<Tag:0x00007fedbfd1ed90> #<Tag:0x00007fedbfd1eb38>

(Nastya) #1

Добрый вечер.
Я новичок в автоматизации тестирования и у меня возник следующий вопрос:
Каким образом можно получить элементы не используя xpath, cssselector и т.д. и можно ли вобще обойтись без них?
Я понимаю, что использование строк типа:
xpath ="//*[@id=“root”]/div/div/div[2]/div/div[2]/div[2]/div/div/div/div/div/div/div[2]/table/tbody/tr"
в любом случае приведет в будущем:

  1. к проваленным тестам с эксепшеном типа: Unable to locate element, т.к. у нас часто меняют интерфейс(что-то убирают, что-то добавляют)
  2. такие пути в целом смотрятся не очень эстетично, если можно так выразиться:see_no_evil:

Причем гугл на запросы типа: selenium java how to locate elements without using xpath cssselectors and others выдал следующие результаты:

  1. https://loadfocus.com/blog/2013/09/05/how-to-locate-web-elements-with-selenium-webdriver/ - где в общем-то, про использование:
  1. By ID:
  2. By CLASS:
  3. By NAME:
  4. By TAGNAME:
  5. By CSS Selector:
  6. By Link:
  7. By XPath:
  1. Нашла еще использование Page Object Pattern здесь http://toolsqa.com/selenium-webdriver/page-object-pattern-model-page-factory/
    Где в целом решается проблема п.2) - код действительно становится более красивым, но по прежнему необходимо указать путь(каким либо образом) к конкретному элементу, используя @FindBy аннотацию.
    У меня возникала идея создавать ArrayList со всеми найденными объектами к примеру по xpath ="//*[@id=“root”]/div/div/div[2]/div/div[2]/div[2]/div/div/div/div/div/div/div[2]/table" и уже среди элементов листа искать по каким-либо параметрам необходимые мне элементы :tired_face:

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


(Yury) #2

Это все подходы. Выбирайте из них.
И вовсе необязательно использовать абсолютный XPath. Можно же писать красивые и легко поддерживаемые локаторы.


(Евгений Салмин) #3

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


(Nastya) #4

Спасибо за ответ, я настолько новичок, что в некоторых вопросах возможно бесконечно глуплю:grimacing: понятия не имела про то что, xpath может быть не абсолютным :see_no_evil: уже все прогуглила
Теперь в принципе понятно, что вопрос стоит: как построить хороший локатор :relieved:


#5

Вот это локатор

легко заменяется на
//*[@id=“root”]/descendant::tr

Изучайте правильность написания локаторов и будет вам счастье :slight_smile:


(Maxim Andryushchenkov) #6

Анастасия, ну и как без знания xpath можно вообще иметь представление о том, что такое элемент на странице? Там нет ничего сложного, нужно всего лишь понять что такое родитель для элемента, изучить функцию contains(), конструкцию поиска по тексту [.=‘что-то’] и уметь использовать 2 вида поиска // и /. А на сладкое вам будет обратный поиск /… родителя для элемента. Не думаю что кого-то устраивают поиски элемента по id, name, class и тд. Симпл-поиски это для тривиальных задач, а чтобы решать задачи посложнее - без xpath не обойтись, имхо.
Вот вам, кстати, немного мана, курите на здоровье:
ТЫК
и ТЫК


(Yaroslav Pernerovskyy) #7

Нет, нельзя.


(Алексей Щербин) #8

В принципе можно, задавая координаты x,y расположения обьекта на странице. Есть специальные фреймворки для этого. Но сразу предупрежу, что штука крайне нестабильная. Но, когда требуется протестить flash, то альтерантивы считай нет.


(Dmitri Komarist) #9

В принципе обходится без xpath нужно, считайте xpath крайним вариантом и используйте его только в последнюю очередь (именно так как написано в вашем списке, он на последнем месте не просто так). Если без него никак то попробуйте обсудить эту проблему с Вашими разработчиками и добавить более высокоуровневые локаторы. Xpath в любом случае со временем приведет Вас к куче обвалившихся тестов, и поверте мне если свойства PageObject будут иметь не очень информативные имена Вы не вспомните на какой элемент указывал Ваш Xpath и поддержка автотестов привратится в сущий ад!


(Алексей Коваленко) #10

Вообще можно использовать SiculiX (без острой необходимости не советую). Но он довольно нестабилен. Хотя все решается. А так разбирайтесь с Xpath. Очень пригодится.