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

Техники локализации плавающих дефектов
онлайн, начало 19 апреля
Тестирование безопасности
онлайн, начало 21 апреля
Тестирование мобильных приложений
онлайн, начало 21 апреля
Автоматизатор мобильных приложений
онлайн, начало 21 апреля
Фотография

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

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

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

#1 Choson

Choson

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

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

Отправлено 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 586 сообщений
  • ФИО:Андрей Адеркин
  • Город:Йошкар-Ола

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

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

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


  • 0

#3 Choson

Choson

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

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

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

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


  • 0

#4 sergueik

sergueik

    Активный участник

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

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

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


  • 0

#5 barancev

barancev

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

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


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

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

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

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

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

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


  • 0

#7 Choson

Choson

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

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

Отправлено 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


Selenium 2.0: стартовый уровень
онлайн
Программирование на Java для тестировщиков
онлайн
Автоматизация функционального тестирования
онлайн
Selenium WebDriver: полное руководство
онлайн



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

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

Яндекс.Метрика
Реклама на портале