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

Фотография

selenium + java или python. общий ближайший предок у двух элементов

Поиск общего предка

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

#1 Choson

Choson

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

  • Members
  • Pip
  • 17 сообщений
  • ФИО:Игорь

Отправлено 16 декабря 2020 - 13:48

Есть два элемента x и y. надо найти общего ближайшего предка.

Может есть какая функция?

 

Или другой вопрос:

ax = x.findElevmets(By.xpath("ancestor::*") получаю список предков x

ay = y.findElevmets(By.xpath("ancestor::*") получаю список предков y

В этих списках предки в произвольном порядке или в каком-то упорядоченном виде?

 

Спасибо!

 

 


  • 0

#2 Freiman

Freiman

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 591 сообщений
  • ФИО:Андрей Адеркин
  • Город:Йошкар-Ола

Отправлено 17 декабря 2020 - 07:14

Можно найти абсолютные XPath-ы для обоих элементов и потом их сравнивать.

Стандартной функции нет, stackoverflow предложил что-то подобное https://stackoverflo...element-in-java


  • 0

#3 Choson

Choson

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

  • Members
  • Pip
  • 17 сообщений
  • ФИО:Игорь

Отправлено 22 декабря 2020 - 08:51

Спасибо за ответ, но я проверил как записываются предки элемента в list. Поэтому выбрал такой вариант: 1. нахожу предков у элементов; 2. нахожу общих предков; 3. по любому списку предков ищу максимальный индекс из совпадений со списком общих предков. 2 и 3 пункты можно объединить - 2 вложенных цикла (индексы с концов списков), внутри условие сравнения элементов и выход из обоих циклов по первому совпадению.


  • 0

#4 sergueik

sergueik

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

  • Members
  • PipPipPip
  • 166 сообщений
  • ФИО:кузьмин сергей

Отправлено 22 декабря 2020 - 22:43

Игорь извините мое любопытство а какой use case ? или академичеккий интерес ? 


  • 0

#5 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 871 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 24 декабря 2020 - 11:14

Лучше всего это сделать не путём построения XPath, а использовать executeScript, чтобы выполнить кусочек кода, который ищет общий родительский элемент:

var element1 = driver.findElement(By.cssSelector("li.category-1"));
var element2 = driver.findElement(By.cssSelector("div#box-latest-products li.product"));
var findCommonAncestor = """
  function ancestors (node) { let n = node; const l = [];
  while (n && n.ownerDocument) { l.unshift(n); n = n.parentNode } return l };
  let l1 = ancestors(arguments[0]); let l2 = ancestors(arguments[1]);
  let result;
  for (let i = 0; i < l1.length; i++) { if (l1[i] === l2[i]) { result = l1[i] } else break };
  return result
  """;
var element = (WebElement) driver.executeScript(findCommonAncestor, element1, element2);

  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#6 Choson

Choson

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

  • Members
  • Pip
  • 17 сообщений
  • ФИО:Игорь

Отправлено 24 декабря 2020 - 16:06

Игорь извините мое любопытство а какой use case ? или академичеккий интерес ? 

Одностраничное вэб приложение, из которого открываются около 100 различных форм. Каждая форма как отдельная страница. Привязываться к атрибутам элементов не могу, поэтому привязываюсь к текстам. На каждой форме  нахожу уникальный текст = уникальный элемент, нахожу второй текст (элемент) так, чтобы общий предок был элементом нужной формы. далее остальные элементы формы нахожу внутри формы (тоже стараюсь по тексту). если в нужной форме есть повторяющиеся тексты ("редактировать", "ОК", и т.д.), то каким же образом нахожу блок в нужным текстом и из него уже нахожу нужный элемент с текстом.

Надеюсь понятно изложил.

В предыдущем посте я описал метод немного по другому.


  • 0

#7 Choson

Choson

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

  • Members
  • Pip
  • 17 сообщений
  • ФИО:Игорь

Отправлено 24 декабря 2020 - 16:14

 

Лучше всего это сделать не путём построения XPath, а использовать executeScript, чтобы выполнить кусочек кода, который ищет общий родительский элемент:

var element1 = driver.findElement(By.cssSelector("li.category-1"));
var element2 = driver.findElement(By.cssSelector("div#box-latest-products li.product"));
var findCommonAncestor = """
  function ancestors (node) { let n = node; const l = [];
  while (n && n.ownerDocument) { l.unshift(n); n = n.parentNode } return l };
  let l1 = ancestors(arguments[0]); let l2 = ancestors(arguments[1]);
  let result;
  for (let i = 0; i < l1.length; i++) { if (l1[i] === l2[i]) { result = l1[i] } else break };
  return result
  """;
var element = (WebElement) driver.executeScript(findCommonAncestor, element1, element2);

 

Почему лучше? у меня код получился раза в 2 больше, но там и поиск идет в листе листов элементов. Вопрос от кодера на java с опытом около 3-х недель.


  • 0


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

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