package com.algocrafts.table; import com.algocrafts.locators.Locators; import com.algocrafts.selenium.Element; import com.algocrafts.selenium.Locator; import com.algocrafts.selenium.SearchScope; import java.util.stream.Collectors; import java.util.stream.Stream; import static com.algocrafts.converters.GetText.TEXT; import static com.algocrafts.locators.Locators.elements; import static com.algocrafts.selectors.TagName.*; import static java.util.stream.Collectors.toSet; public class Table<T, Where extends SearchScope<Where>> { private final Where where; private final Locator<Where, Element> locator; private final Locator<Stream<Element>, T> mapper; public Table(Where where, Locator<Where, Element> locator, Locator<Stream<Element>, T> mapper) { this.where = where; this.locator = locator; this.mapper = mapper; } public Stream<String> getHeader() { return locator.andThen(elements(TH)).locate(where).map(TEXT); } public Stream<T> getRows() { return locator.andThen(elements(TR)).locate(where) .filter(e -> Locators.<Element>optionalElement(TD) .locate(e) .isPresent()) .map(elements(TD)) .map(mapper); } public TableContents<T> getContents() { return new TableContents<T>( this.getHeader().collect(toSet()), this.getRows().collect(Collectors.<T>toSet()) ); } }