t.me/atinfo_chat Telegram группа по автоматизации тестирования

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

Теги: #<Tag:0x00007f7488ac8a38> #<Tag:0x00007f7488ac88f8> #<Tag:0x00007f7488ac87b8>

Добрый вечер.
Я новичок в автоматизации тестирования и у меня возник следующий вопрос:
Каким образом можно получить элементы не используя 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:

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

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

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

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

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

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

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

2 Симпатий

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

Нет, нельзя.

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

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

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