package com.jquery.menu; 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.locators.Locators; import com.algocrafts.pages.Page; import com.algocrafts.selectors.ClassName; import com.algocrafts.selenium.Clickable; import com.algocrafts.selenium.Element; import com.algocrafts.selenium.Locator; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.stream.Stream; import static com.algocrafts.conditions.ElementPredicates.DISPLAYED; import static com.algocrafts.conditions.OptionalPresents.PRESENT; import static com.algocrafts.converters.GetText.TEXT; import static com.algocrafts.converters.OptionalGetter.GET; import static com.algocrafts.locators.Locators.element; import static com.algocrafts.locators.Locators.elements; import static com.algocrafts.selectors.Id.GLOBAL_NAV; import static com.algocrafts.selectors.TagName.*; import static java.util.stream.Collectors.toList; public class AllMenuLocatorForJQuery implements Locator<Page, Stream<Clickable>> { private static final Locator<Page, Stream<Element>> MENU_BAR = new ElementLocator<Page>(GLOBAL_NAV) .andThen(element(ClassName.L_TINYNAL1)) .andThen(elements(LI)) .andThen(new Filter<>(DISPLAYED .and(Locators.<Element>optionalElement(UL) .and(PRESENT.negate()) .or(Locators.<Element>optionalElement(LI) .and(PRESENT))))); private static final Locator<Element, String> LINK_TEXT = new ElementLocator<Element>(A).andThen(TEXT); private static final Locator<Element, Optional<Element>> MENU_GROUP = Locators.<Element>optionalElement(UL); @Override public Stream<Clickable> locate(Page page) { List<Clickable> allMenu = new ArrayList<>(); MENU_BAR.locate(page).forEach(header -> { Element menubar = MENU_BAR .andThen(new FirstMatch<>(TEXT .and(new Equals(LINK_TEXT.locate(header))))) .andThen(GET) .locate(page); String group = LINK_TEXT.locate(menubar); allMenu.add(new Menu(page, new MenuGroupLocator(group))); page.mouseOver(header); Optional<Element> menuGroup = MENU_GROUP.locate(menubar); if (menuGroup.isPresent()) { menuGroup.get().until(DISPLAYED); allMenu.addAll(Locators.<Element>elements(LI).locate(menubar).map(menu -> { String menuText = page.mouseOver().andThen(LINK_TEXT).locate(menu); return new Menu(page, new MouseOverMenuLocator(group, menuText)); }).collect(toList())); } }); return allMenu.stream(); } }