package com.gorillalogic.agents.html.processor;
import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import com.gorillalogic.monkeytalk.Command;
public enum ElementLocator {
ID,
CLASSNAME,
TAGNAME,
NAME,
LINKTEXT,
PARTIALLINKTEXT,
CSS,
XPATH,
JAVASCRIPT,
COMPONENTTYPE;
private static ElementLocator getFromMonkeyID(String monkeyID){
if(monkeyID.equalsIgnoreCase("*")){
return COMPONENTTYPE;
} else if(monkeyID.matches("classname=.*")){
return CLASSNAME;
} else if(monkeyID.matches("tagname=.*")){
return TAGNAME;
} else if(monkeyID.matches("name=.*")){
return NAME;
} else if(monkeyID.matches("linktext=.*")){
return LINKTEXT;
} else if(monkeyID.matches("partiallinktext=.*")){
return PARTIALLINKTEXT;
} else if(monkeyID.matches("css=.*")){
return CSS;
} else if(monkeyID.matches("javascript=.*")){
return JAVASCRIPT;
} else if(monkeyID.matches("xpath=.*")){
return XPATH;
} else {
return ID;
}
}
public static WebElement findWebElement(Command c, WebDriver driver){
switch(getFromMonkeyID(c.getMonkeyId())){
case CLASSNAME: driver.findElements(By.className(removeMetaData(c.getMonkeyId())));
case TAGNAME: return driver.findElement(By.tagName(removeMetaData(c.getMonkeyId())));
case COMPONENTTYPE: return driver.findElement(By.tagName(c.getComponentType()));
case NAME: return driver.findElement(By.name(removeMetaData(c.getMonkeyId())));
case LINKTEXT: return driver.findElement(By.linkText(removeMetaData(c.getMonkeyId())));
case PARTIALLINKTEXT: return driver.findElement(By.partialLinkText(removeMetaData(c.getMonkeyId())));
case CSS: return driver.findElement(By.cssSelector(removeMetaData(c.getMonkeyId())));
case JAVASCRIPT: return (WebElement) ((JavascriptExecutor)driver).executeScript(removeMetaData(c.getMonkeyId()));
case XPATH: return driver.findElements(By.xpath(removeMetaData(c.getMonkeyId()))).get(0);
default: {
//First find by ID
WebElement element = null;
if(element == null){
List<WebElement> elements = driver.findElements(By.xpath("//"+c.getComponentType()+"[@id='"+ c.getMonkeyId()+"']"));
if(elements.size() > 0 )
element = elements.get(0);
}
//Second find by NAME
if(element == null){
List<WebElement> elements = driver.findElements(By.xpath("//"+c.getComponentType()+"[@name='"+ c.getMonkeyId()+"']"));
if(elements.size() > 0 )
element = elements.get(0);
}
//Third find by VALUE (value of the text node)
if(element == null){
List<WebElement> elements = driver.findElements(By.xpath("//"+c.getComponentType()+"[@value='"+ c.getMonkeyId()+"']"));
if(elements.size() > 0 )
element = elements.get(0);
}
//Forth find by TEXT
if(element == null){
List<WebElement> elements = driver.findElements(By.xpath("//"+c.getComponentType()+"[text()='"+ c.getMonkeyId()+"']"));
if(elements.size() > 0 )
element = elements.get(0);
}
return element;
}
}
}
private static String removeMetaData(String monkeyID) {
if(monkeyID.equalsIgnoreCase("*")){
return "*";
} else if(monkeyID.matches("classname=.*")){
return monkeyID.substring("classname=".length());
} else if(monkeyID.matches("tagname=.*")){
return monkeyID.substring("tagname=".length());
} else if(monkeyID.matches("name=.*")){
return monkeyID.substring("name=".length());
} else if(monkeyID.matches("linktext=.*")){
return monkeyID.substring("linktext=".length());
} else if(monkeyID.matches("partiallinktext=.*")){
return monkeyID.substring("partiallinktext=".length());
} else if(monkeyID.matches("css=.*")){
return monkeyID.substring("css=".length());
} else if(monkeyID.matches("javascript=.*")){
return monkeyID.substring("javascript=".length());
} else if(monkeyID.matches("xpath=.*")){
return monkeyID.substring("xpath=".length());
} else {
return monkeyID;
}
}
}