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

Фотография

Нужна помощь с раскрытием всех элементов дерева меню


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

#1 Drenjy

Drenjy

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

  • Members
  • Pip
  • 12 сообщений
  • ФИО:Самойлов Андрей Евгеньевич


Отправлено 16 мая 2017 - 07:06

Привет, форумчане! Снова нужна ваша помощь. Есть дерево меню,
http://joxi.ru/J2beaDQFkYzvm6
По xpath (.//*[@name='org_struct_admin1']//table/tbody/tr/td[1]/img) нахожу все элементы которые мне нужны,
клик делаю если стиль соответствует закрытому меню.
Нужно раскрывать все элементы, что бы просмотреть содержимое и найти нужное.
Сделал вот такую конструкцию:

 public void openStructureTree(){
        List<WebElement> elements=driver.findElements(By.xpath(".//*[@name='org_struct_admin1']//table/tbody/tr/td[1]/img"));
        for (WebElement element:elements){
            String opentree= element.getAttribute("style");
            System.out.println("Значение для элементов: "+element.getAttribute("style"));
        if (opentree.equals("width: 16px; height: 16px; background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAX0lEQVR42t2TwQkAMQgE07w95JtPIKWkCsGfEH2kgQ25EhQO7qaAYdHdgiTlx4I5J/becUHvHWMMiEhcYGZorYGZY4LLWgu1Vrh7THBRVRDRk+jdBOkbpL6Q7sF3tnAAAyDoFbr+8FgAAAAASUVORK5CYII=\") 0px 0px no-repeat;")) {
            
            click(By.xpath(".//*[@name='org_struct_admin1']//table/tbody/tr/td[1]/img"));
        }
        }
    }

Понятное дело, нажимается первый найденный элемент.
Проблема в том, что каждое меню это добавление новых div, например

Первый элемент - .//*[@name='org_struct_admin1']/div[5]/div/div[2]/table/tbody/tr/td[1]/img

Второй элемент- .//*[@name='org_struct_admin1'']/div[5]/div/div[2]/div/div/table/tbody/tr/td[1]/img

Следовательно не получится замутить что-то вроде div["+i+i"]
Понимаю, что нужно записать найденный элемент с нужным стилем, и клик произвести именно по нему, но вот как это сделать технически, я пока не придумал.


  • 0

#2 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 17 мая 2017 - 07:02

1. Тебе надо грамотно подобрать локаторы, т.к. в каждом меню добавляются новые div, то нужно, использовать "//". Как-то так

2.

equals("width: 16px; height: 16px; background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAX0lEQVR42t2TwQkAMQgE07w95JtPIKWkCsGfEH2kgQ25EhQO7qaAYdHdgiTlx4I5J/becUHvHWMMiEhcYGZorYGZY4LLWgu1Vrh7THBRVRDRk+jdBOkbpL6Q7sF3tnAAAyDoFbr+8FgAAAAASUVORK5CYII=\") 0px 0px no-repeat;"

 

Это вообще жесть какая-то, постарайся не привязываться к стилю или хотя бы используй contains

3. Тоже странная строка

String opentree= element.getAttribute("style");

 

 

В строковую переменную opentree  записываешь стиль элемента ....


  • 0

#3 checo

checo

    Опытный участник

  • Members
  • PipPipPipPip
  • 400 сообщений
  • Город:Н.Новгород

Отправлено 17 мая 2017 - 08:57

Если можно написать универсальный локатор, который матчит любой нераскрытый элемент меню на любом уровне, то просто цикл while с поиском первого такого элемента: если найден - раскрыть, и так, пока не найдется ни одного.


  • 0

#4 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 17 мая 2017 - 11:59

Если можно написать универсальный локатор, который матчит любой нераскрытый элемент меню на любом уровне, то просто цикл while с поиском первого такого элемента: если найден - раскрыть, и так, пока не найдется ни одного.

 

да, так имхо будет лучше:

Псеводокод:

while(isElementPresent(element)) {
 element.click()
}

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


  • 0

#5 Drenjy

Drenjy

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

  • Members
  • Pip
  • 12 сообщений
  • ФИО:Самойлов Андрей Евгеньевич


Отправлено 22 мая 2017 - 07:35

1. Тебе надо грамотно подобрать локаторы, т.к. в каждом меню добавляются новые div, то нужно, использовать "//". Как-то так

2.

equals("width: 16px; height: 16px; background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAX0lEQVR42t2TwQkAMQgE07w95JtPIKWkCsGfEH2kgQ25EhQO7qaAYdHdgiTlx4I5J/becUHvHWMMiEhcYGZorYGZY4LLWgu1Vrh7THBRVRDRk+jdBOkbpL6Q7sF3tnAAAyDoFbr+8FgAAAAASUVORK5CYII=\") 0px 0px no-repeat;"

 

Это вообще жесть какая-то, постарайся не привязываться к стилю или хотя бы используй contains

3. Тоже странная строка

String opentree= element.getAttribute("style");

 

 

В строковую переменную opentree  записываешь стиль элемента ....

Виктор, спасибо. Про "contains" я и забыл совсем :(
Да, приходится использовать такой ужас т.к страница генерируется автоматически из Б.Д и Java, Вообще странная конструкция, но что есть... С while - пожалуй именно то, что нужно!


  • 0


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

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