Задался вопросом реализации получения елемента строки из HTML таблицы, да так что бы был доступ к всем внутренним саб-элементам (ячейки).
В моем случае мне необходимо получить из таблицы определенную строку содержащую в определенной ячейке какой то текст. И после этого, в начале проверить содержание остальных ячеек, и далее нажать на ссылку, которая находится в определенной ячейке.
Имеются или какие то готовые решения работы с данными в таблицах?
Если вам нужно работать с ячейками таблицы как с объектами (т.е кликать, брать текст и тд) то лучший вариант делать классы оболочки для таблиц в которых вы описываете столбцы таблиц (если конечно вам это нужно)
Как пример делаете класс оболочки
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(); //кликаете по имейлу в первой строке таблицы и тд
Хотя, в принципе, что-то универсальное базовое реализовать можно, оставив реализацию уникальных методов парсинга строк и элементов пользователю библиотеки.
Если что-то найдешь напиши пожалуйста сюда, интересно посмотреть
Как вариант более универсальной работы с таблицей:
Создаете класс
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