package com.daugherty;
import com.algocrafts.clickables.Menu;
import com.algocrafts.conditions.Equals;
import com.algocrafts.converters.Filter;
import com.algocrafts.converters.FirstMatch;
import com.algocrafts.locators.ElementLocator;
import com.algocrafts.pages.Page;
import com.algocrafts.selectors.Id;
import com.algocrafts.selenium.Clickable;
import com.algocrafts.selenium.Element;
import com.algocrafts.selenium.Locator;
import org.openqa.selenium.By;
import java.util.List;
import java.util.function.Supplier;
import java.util.stream.Stream;
import static com.algocrafts.conditions.ElementPredicates.DISPLAYED;
import static com.algocrafts.converters.GetText.LINK_TEXT;
import static com.algocrafts.converters.GetText.TEXT;
import static com.algocrafts.converters.OptionalGetter.GET;
import static com.algocrafts.locators.Locators.elements;
import static com.algocrafts.selectors.TagName.LI;
import static com.google.common.collect.Lists.newArrayList;
public class AllMenuLocatorForDaugherty implements Locator<Page, Stream<Clickable>> {
@Override
public Stream<Clickable> locate(Page page) {
List<Clickable> allMenu = getClickables(page, Id.MAIN_NAV);
allMenu.addAll(getClickables(page, Id.SECONDARY_NAV));
return allMenu.stream();
}
private List<Clickable> getClickables(Page page, Supplier<By> id) {
Locator<Page, Stream<Element>> menubars = new ElementLocator<Page>(id)
.andThen(elements(LI))
.andThen(new Filter<>(DISPLAYED));
List<Clickable> allMenu = newArrayList();
menubars.apply(page).forEach(header -> {
try {
Element menubar = menubars
.andThen(new FirstMatch<>(TEXT.and(new Equals(LINK_TEXT.locate(header)))))
.andThen(GET)
.locate(page);
String group = LINK_TEXT.apply(menubar);
allMenu.add(new Menu(page, new MenuGroupLocator(group, id)));
} catch (Exception e) {
e.printStackTrace();
}
});
return allMenu;
}
}