Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

HtmlElement + TestNG + Java. Таблица. Как удалить ряд

html-elements
webdriver
java
Теги: #<Tag:0x00007f7b64ef8b20> #<Tag:0x00007f7b64ef88c8> #<Tag:0x00007f7b64ef86c0>

(James May) #1

Добрый день!

Использую Java в связке с HtmlElements

Есть у них типизированый элемент Table.

Мне необходимо выцепить данные из таблицы следуя заголовкам.
На этот случай предусмотрен метод table.getRowsAsStringMappedToHeadings()
Все бы ничего, но таблица имеет пустые элементы tr.
В них обычно вставлены сепараторы.
Соотственно, чтобы воспользоваться вышеуказанным методом необходимо от этих пустых рядов избавиться, т.к. в методе есть условие:

if (row.size() != headings.size()) {
	throw new HtmlElementsException("Headings count is not equal to number of cells in row");
}

Сами ряды вытаскиваются методом table.getRows() который возвращает элемент типа List<List>, где List является элементами “td”

Мне заведомо известно, что размер List.size(); в успешном случае должен быть равен 10.
Значит, теоретически, можно удалить все листы, размер которых меньше 10.

К сожалению, как я не пытался, получить результат мне не удалось.

Использовал я следующие методы:

Iterator<List<WebElement>> iter = table.getRows().iterator();
while(iter.hasNext()){
	List<WebElement> list = iter.next();
	if(list.size < 10){
		iter.remove();
	}
}

В результате ничего удаленно не было.
Тогда я попробовал:

table.getRows().removeIf(
	(List<WebElement> list)-> {return list.size < 10;}
);

Но и в этом случае, никакого результата получить не удалось.
Так же я выцыплял порядковый номер этих листов и пытался их удалить через table.getRows().remove(i), но старания так же были тщетными.

Вопрос заключается в том, где я ошибся и возможно ли это вообще, удалить из объекта Table ряды, меньшие заданному числу.

Спасибо!

P.s. Теоретически, можно отказаться от использования Table, прописать нужные пути Xpath’ом. Я знаю. Но в моем случае это таблица не одна, и для каждой хотелось бы иметь возможность модификации.


(Sergey Korol) #2

Вы пошли по заведомо неверному пути. Ваш кастомный элемент физически не хранит списки строк / столбцов. Хранится только родительский WebElement. Даже если вы что-то удалите из списка, результатом будет уже новый список, никак не связанный с элементом таблицы. Единственно верным решением тут будет переопределение getRows у Table. С этим не должно быть никаких проблем, ввиду публичности метода.


(James May) #3

К этому очень не хотелось прибегать, т.к. у меня уже есть кастомный тип, который экстендит Table и переопределяет методы. Была надежда обойтись малой кровью :slight_smile:


(Sergey Korol) #4

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


(James May) #5

Да я уже, спасибо!