Работа с таблицами - получение елемента строки


(Alex Shats) #1

Всем привет,

Задался вопросом реализации получения елемента строки из HTML таблицы, да так что бы был доступ к всем внутренним саб-элементам (ячейки).

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

Имеются или какие то готовые решения работы с данными в таблицах?


(svim) #2

Работа с xpath. А в чём сложности? Приведите пример таблицы.


(Александр Таранков) #3

Поскольку верстка таблиц - вещь не универсальная, то готовое решение, подходящее для всех вряд ли возможно. Каждый изобретает свой велосипед для себя


(Бабай) #4

Если вам нужно работать с ячейками таблицы как с объектами (т.е кликать, брать текст и тд) то лучший вариант делать классы оболочки для таблиц в которых вы описываете столбцы таблиц (если конечно вам это нужно)

Как пример делаете класс оболочки

class TableColumnClass{

private WebElement name;
private WebElement email;

итд

и геттеры\сеттеры
}

потом делаете метод который будет разбивать таблицу на строки, сетать объекты классов оболочек элементы и пихать их в коллекцию

class TestClassPageObject {

// таблица  в которую вы хотите разобрать
private WebElement table

//метод будет возвращать коллекцию объектов класса TableColumnClass который в свою очередь будет представлять строку в которой вы хотите использовать какой то элемент

public List<TableColumnClass> getTable (){
List<TableColumnClass> result = new ArrayList<TableColumnClass>();
By by = By.xpath("тут ваш икспас с помощью которого вы находите все строки конкретно уже в таблице")
List<WebElement> tr = table.findElements(by);
for (int i = 0; i < tr.size(); i++) {
			result.add(i, createTable(tr.get(i)));
		}
return result;
}

private TableColumnClass createTable (WebElement tr){
By by = By.xpath("тут ваш икспас с помощью которого вы находите все ячейки конкретно уже в строке")
List<WebElement> tds = tr.findElements(by);
TableColumnClass result = new TableColumnClass ();

тут вы присваиваете конкретные ячейки таблицы
result.setName(tds.get(0));
result.setEmail(tds.get(1));
return result
}
}

вот и все. Потом вы можете очень просто получать доступ ко всем элементам таблицы

List<TableColumnClass> table = getTable();

table.get(0).getName.getText(); // вы получаете имя в первой строке таблице
table.get(1).getName.getText() // вы получаете имя во второй строке таблицы

table.get(0).getEmail.click(); //кликаете по имейлу в первой строке таблицы и тд

(Александр Таранков) #5

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

Если что-то найдешь напиши пожалуйста сюда, интересно посмотреть


(Sergey Korol) #6

Посмотрите в сторону htmlelements, где уже реализован класс Table. Возможно найдете для себя что-нибудь полезное.


(Бабай) #7

Как вариант более универсальной работы с таблицей:

Создаете класс

abstract public class AbstractTable {

	protected WebElement lement;

	public WebElement getElement() {
		return element;
	}

	public void setElement(WebElement element) {
		this.element = element;
	}

}

в родительский ПО добавляете метод

public <T extends AbstractTable> List<T> getTable (WebElement table, Class<T> t){
		List<T> r = new ArrayList<T>();
		try{
		List<WebElement> wrp = table.findElements(By.tagName("tr"));
		for (int i = 0; i<wrp.size(); i++){
			T d = t.newInstance();
			d.setElement(wrp.get(i));
			r.add(d);
		}}catch(Exception e){

		}
		return r;
		}

Дальше делаете класс оболочку для ваших таблиц

    public class NumberTable extends AbstractTable{

   private WebElement name = element.findElement(By.xpath("");

    тут любые методы для работы с этими элементами
        )
        }

и дальше делаете тоже самое что писал выше.
главное в метод getTable() передавать элемент таблицы и класс оболчки
Если есть желение в AbstractTable можно добавить PageFactory и в наследниках искать элементы через @FindBy