t.me/atinfo_chat Telegram группа по автоматизации тестирования

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

Теги: #<Tag:0x00007f9af938b210> #<Tag:0x00007f9af938b0d0> #<Tag:0x00007f9af938afe0>

Добрый день!

Использую 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’ом. Я знаю. Но в моем случае это таблица не одна, и для каждой хотелось бы иметь возможность модификации.

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

1 Симпатия

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

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

1 Симпатия

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