Select dynamic/hidden DOM. Скрываемый/раскрываемый рут DOM

Доброго дня.

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

Суть в том, что есть раскрываемый список, представленный таблицей.
Элементы, скрытые под экспандером, само собой, на странице не видны. И элемент DOM’а не отображается до тех пор, пока не раскрыть список. Т.е. нельзя извлечь элемент сразу прописав xpath/другой метод к нему.

Я не программист, а только работаю с Java WebDriver, поэтому не знаю как данный метод “динамического” DOM’а называется. Я могу ошибаться, но это не Shadow DOM поскольку рут ведет в другое место, и вообще он пустой. И по-идее это не методология “скрытого” DOM, когда есть либо элемент на странице, но его нет в DOM, или нет на странице но есть в DOM.

Хотелось бы услышать, возможно ли при таких условиях пройтись по DOM к нужному элементу, чтобы взаимодействовать с ним? Либо можно как-то отобразить нужную ветку, чтобы можно было написать путь туда? Или может быть вы можете предложить другие варианты, чем обращение к DOM.

Если нужна уточняющая информация, пожалуйста, спрашивайте.

Для примера:
Список что-то вроде этого. С подкатегориями. Внутри чекбоксы, нужно проверить активирован бокс или нет, и опираясь от этого, совершить действия. До раскрытия списка, элементы подкатегории (ветки) не видны нигде.
Доп. информация:
Мне нужны только некоторые чекбоксы из списка. Я пробовал работать с List или извлечением массива, чтобы взять нужные позиции списка, но проблема, опять же, в раскрываемых категориях. Если категория раскрыта или закрыта, то количество и позиции боксов поменяются.
С выделением элементов на раскрытие категории (экспандеры) тоже есть проблемы, поскольку кроме них есть такие же другие элементы в списке, которые цепляются к их идентификатору (не ID, там class вроде или tagname) и также меняют свое количество в зависимости от раскрываемости списка.

Давайте я уточню, вы хотите кликать по подменю списка не раскрывая этот список?

1 лайк

Если это возможно - то да. Я вроде видел информацию связанную с браузингом через dom.
Если это невозможно, то другие предложения был бы рад услышать.
И отдельно хотел бы увидеть решение проблемы с раскрываемым рутом dom. Может быть если не в рамках данной задачи, но вообще.

Давайте по порядку.

  • Какая главная цель нашей автоматизации? Правильно, максимально точно имитировать действия юзера. Тогда скажите мне как Юзер сможет нажать на подменю не раскрывая меню?
  • К чему мы пришли? Даже если и есть способ нажать на подменю не раскрывая меню, то он нам НЕ НУЖЕН, потому что у нас не такая задача.

Мое предложение это:

  1. Нажать на меню;
  2. Нажать на подменю.
1 лайк

С точки зрения симуляции действий пользователя - вы правы.
Чекбоксы связаны с элементами, которые активируются на странице. Нужна проверка, что нужные элементы из списка включены и отображаются. Проверка на отображение уже написана.
Я изучал разные подходы к текущей задаче, но есть большая проблема с тем, как написан сайт.
У большинства элементов либо нет уникальных id или имени, либо они генерируются случайными цифрами. Но это не большая проблема благодаря xpath.
И как я упоминал выше, элементы списка (строка с названием, чекбоксы, и экспандер) представляют собой кашу.
Чекбоксы вместо смены статуса меняют свой класс. Но это вопрос касательно их проверки.
Кроме самих экспандеров есть подобные им элементы в списке, которые также захватываются при сборе списка (нужно открыть некоторые из них).
Я ещё пробовал сделать двойной клик по строке, чтобы развернуть список, вместо кликальная по экспандеру, но там какой-то невидимый элемент перекрывает строку.

Касательно имитации действий пользователя. Мне не хотелось захламлять код однотипными действиями. И хотелось привести проверку к наиболее оптимальному варианту. Чтобы проверка проходила быстрее и занимала как можно меньше строк.

У большинства элементов либо нет уникальных id или имени, либо они генерируются случайными цифрами. Но это не большая проблема благодаря xpath.

Вы можете сначала находить весь список. Потом уже внутри списка находить нужную вам строчку по тексту например. И потом делать то, что вам нужно с ней.

Я ещё пробовал сделать двойной клик по строке, чтобы развернуть список, вместо кликальная по экспандеру, но там какой-то невидимый элемент перекрывает строку.

Значит вы нашли некий внутренний элемент, а нужно было кликать на внешний. Но это уже другая проблема.

Делал так.

  1. список генерируется в зависимости от раскрываемости списка. Т.е. нужные элементы могут быть не отображены.
  2. название строки с боксом это отдельный элемент. В таблице 4 элементе по столбцам (формально они не являются столбцами). Экспандер, чекбокс, индикатор (картинка), название строки. Если я сделаю список из чекбоксов, там не будет ни id, ни названий, ничего кроме класса checkbox или checkbox_selected. Я писал выше про это.
    Т.е. я не смогу сделать список -> getAttribute (“name”). Или что-то вроде этого.
  3. у экспандеров тоже нет уникальных имён. Только класс expander и что-то вроде expander_activated.
    Хотя я написал уже селектор по xpath для всех боксов, но с экспандером категорий у меня проблемы.

Как выглядит раскрытие ветки:
_
<img <img
Бокс:
input type=“button” role=“checkbox” class=" x-tree-checkbox"
Активный бокс:
input type=“button” role=“checkbox” aria-checked=“true” class=" x-tree-checkbox x-tree-checkbox-checked"

Покажите картинку, я немного вас не понимаю.

Должно быть достаточно. Или вам нужно строение dom?

У меня возникает мысль создать объект с полями:

Экспандер, чекбокс, индикатор (картинка), название строки

И потом делать array с объектами, где у вас будут вложенности.
Как именно это заимплементить я вам врядли подскажу в виде, чтобы вы смогли просто скопипастить.
Плюс возможно есть смысл взглянуть на такой инструмент как Sikuli, чтобы можно было находить/чекать картинки.

2 лайка

если будет представление страницы в адекватном (читай полном) виде и корректная постановка задачи то вариантов придумать можно много, начиная от !!валидных!! локаторов и заканчивая решениями с области ООП и извращенной фантазии