package com.abmash.core.browser.interaction;
import com.abmash.api.Browser;
import com.abmash.api.HtmlElement;
import java.util.List;
import org.openqa.selenium.WebElement;
public class Select extends ActionOnHtmlElement {
public enum SelectMethod {
SELECT, DESELECT
}
private enum CompareMethod {
EQUAL, CONTAINS
}
private HtmlElement element;
private org.openqa.selenium.support.ui.Select select;
private SelectMethod method;
private String optionValue;
public Select(Browser browser, HtmlElement element, String optionQuery, SelectMethod method) {
super(browser, element);
this.element = element;
this.select = new org.openqa.selenium.support.ui.Select(element.getSeleniumElement());
this.optionValue = getOptionValue(optionQuery.toLowerCase());
this.method = method;
}
private String getOptionValue(String query) {
List<WebElement> options = select.getOptions();
WebElement option = null;
String optionValue = null;
if((option = hasFittingOption(options, query, CompareMethod.EQUAL)) != null) optionValue = option.getAttribute("value");
else if((option = hasFittingOption(options, query, CompareMethod.CONTAINS)) != null) optionValue = option.getAttribute("value");
return optionValue;
}
private WebElement hasFittingOption(List<WebElement> options, String query, CompareMethod compare) {
for (WebElement option: options) {
String optionAttrVal = option.getAttribute("value").toLowerCase();
String optionText = option.getText().toLowerCase();
switch (compare) {
case EQUAL:
if(optionAttrVal.equals(query) || optionText.equals(query)) {
return option;
}
break;
case CONTAINS:
if(optionAttrVal.contains(query) || optionText.contains(query)) {
return option;
}
break;
}
}
return null;
}
@Override
protected void perform() throws Exception {
if(element != null) {
// TODO check if option exists
browser.log().info("Selected option '" + optionValue + "' for: {}", element);
switch(method) {
case SELECT:
select.selectByValue(optionValue);
break;
case DESELECT:
select.deselectByValue(optionValue);
break;
}
} else {
browser.log().warn("Select element to choose option does not exist");
}
}
}