Java tutorial
package com.epam.jdi.uitests.web.selenium.elements.complex; /* * Copyright 2004-2016 EPAM Systems * * This file is part of JDI project. * * JDI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * JDI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with JDI. If not, see <http://www.gnu.org/licenses/>. */ import com.epam.jdi.uitests.core.interfaces.base.ISetup; import com.epam.jdi.uitests.core.interfaces.complex.IDropDown; import com.epam.jdi.uitests.web.selenium.elements.GetElementType; import com.epam.jdi.uitests.web.selenium.elements.base.Clickable; import com.epam.jdi.uitests.web.selenium.elements.base.Element; import com.epam.jdi.uitests.web.selenium.elements.common.Label; import com.epam.jdi.uitests.web.selenium.elements.pageobjects.annotations.objects.JDropdown; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.ui.Select; import java.lang.reflect.Field; import java.util.List; import java.util.function.Function; import static com.epam.jdi.uitests.core.settings.JDISettings.exception; import static com.epam.jdi.uitests.web.selenium.elements.pageobjects.annotations.WebAnnotationsUtil.findByToBy; import static com.epam.jdi.uitests.web.selenium.elements.pageobjects.annotations.objects.FillFromAnnotationRules.fieldHasAnnotation; /** * RadioButtons control implementation * * @author Alexeenko Yan */ public class Dropdown<TEnum extends Enum> extends Selector<TEnum> implements IDropDown<TEnum>, ISetup { protected GetElementType element; protected GetElementType expander; public Dropdown() { super(); } public Dropdown(By selectLocator) { super(selectLocator); } public Dropdown(By selectLocator, By optionsNamesLocator) { this(selectLocator, optionsNamesLocator, null); } public Dropdown(By selectLocator, By optionsNamesLocator, By allOptionsNamesLocator) { super(optionsNamesLocator, allOptionsNamesLocator); element = new GetElementType(selectLocator, this); expander = new GetElementType(selectLocator, this); } public void setup(Field field) { if (!fieldHasAnnotation(field, JDropdown.class, IDropDown.class)) return; JDropdown jDropdown = field.getAnnotation(JDropdown.class); By root = findByToBy(jDropdown.root()); By value = findByToBy(jDropdown.value()); By list = findByToBy(jDropdown.list()); By expand = findByToBy(jDropdown.expand()); if (root == null) root = findByToBy(jDropdown.jroot()); if (value == null) value = findByToBy(jDropdown.jvalue()); if (list == null) list = findByToBy(jDropdown.jlist()); if (expand == null) expand = findByToBy(jDropdown.jexpand()); if (root != null) setAvatar(root); if (value != null) { this.element = new GetElementType(value, this); if (expander == null) this.expander = element; } if (list != null) this.allLabels = new GetElementType(list, this); if (expand != null) { this.expander = new GetElementType(expand, this); if (element == null) this.element = expander; } } protected Label element() { if (element == null) return getLocator() != null ? new GetElementType(getLocator(), getParent()).get(Label.class) : null; return element.get(Label.class); } protected Clickable expander() { if (expander == null) { if (getLocator() != null) return new GetElementType(getLocator(), getParent()).get(Label.class); throw exception("'Expand' element for dropdown not defined"); } return expander.get(Label.class); } protected void expandAction(String name) { if (element().isDisplayed()) { setWaitTimeout(0); if (!isDisplayedAction(name)) restoreWaitTimeout(); timer().wait(() -> { expander().click(); return timer(1).wait(() -> isDisplayedAction(name)); }); restoreWaitTimeout(); } } protected void expandAction(int index) { if (!isDisplayedAction(index)) element().click(); } @Override protected void selectAction(String name) { if (element().getLocator().toString().contains("select")) try { new Select(element().getWebElement()).selectByVisibleText(name); return; } catch (Exception ignore) { } expandAction(name); super.selectAction(name); } @Override protected void selectAction(int index) { if (element() != null) { expandAction(index); super.selectAction(index); } else new Select(getWebElement()).selectByIndex(index); } @Override protected boolean isDisplayedAction(String name) { WebElement element; try { element = allLabels.get(TextList.class).getElement(name); } catch (Exception | Error ex) { return false; } return element != null && element.isDisplayed(); } @Override protected String getValueAction() { return getTextAction(); } @Override protected String getSelectedAction() { return getTextAction(); } /** * Waits while Element becomes visible */ @Override public void waitDisplayed() { element().waitDisplayed(); } /** * Waits while Element becomes invisible */ @Override public void waitVanished() { element().waitVanished(); } public void wait(Function<WebElement, Boolean> resultFunc) { element().wait(resultFunc); } public <R> R wait(Function<WebElement, R> resultFunc, Function<R, Boolean> condition) { return element().wait(resultFunc, condition); } public <R> R test(Function<WebElement, R> resultFunc, Function<R, Boolean> condition) { return resultFunc.apply(getWebElement()); } public void wait(Function<WebElement, Boolean> resultFunc, int timeoutSec) { element().wait(resultFunc, timeoutSec); } public <R> R wait(Function<WebElement, R> resultFunc, Function<R, Boolean> condition, int timeoutSec) { return element().wait(resultFunc, condition, timeoutSec); } @Override protected List<String> getOptionsAction() { boolean isExpanded = isDisplayedAction(1); if (!isExpanded) element().click(); List<String> result = super.getOptionsAction(); if (!isExpanded) element().click(); return result; } protected void clickAction() { element().click(); } protected String getTextAction() { String result = ""; if (element().getLocator().toString().contains("select")) try { result = new Select(element().getWebElement()).getFirstSelectedOption().getText(); } catch (Exception ignore) { } return result != null && !result.equals("") ? result : element().getText(); } /** * Expanding DropDown */ public final void expand() { actions.expand(() -> expandAction(1)); } public final void expand(String name) { actions.expand(() -> expandAction(name)); } public final void expand(int index) { actions.expand(() -> expandAction(index)); } /** * Closing DropDown */ public final void close() { if (isDisplayedAction(1)) element().click(); } /** * Click on Element */ public final void click() { actions.click(this::clickAction); } /** * @return Get Elements text */ public final String getText() { return actions.getText(this::getTextAction); } /** * @param text Specify expected text * @return Wait while Elements text contains expected text. Returns Elements text */ public final String waitText(String text) { return actions.waitText(text, this::getTextAction); } /** * @param regEx Specify expected regular expression Text * @return Wait while Elements text matches regEx. Returns Elements text */ public final String waitMatchText(String regEx) { return actions.waitMatchText(regEx, this::getTextAction); } /** * @param attributeName Specify attribute name * @param value Specify attribute value * Sets attribute value for Element */ public void setAttribute(String attributeName, String value) { element().setAttribute(attributeName, value); } @Override public String getImgPath() { return null; } @Override public void setImgPath(String imgPath) { } public WebElement getWebElement() { return new GetElementType(getLocator(), this).get(Element.class).getWebElement(); } public String getAttribute(String name) { return element().getAttribute(name); } /** * @param name Specify attribute name * @param value Specify attribute value * Waits while attribute gets expected value. Return false if this not happens */ public void waitAttribute(String name, String value) { element().waitAttribute(name, value); } }