package net.thucydides.core.pages;
import org.apache.commons.lang3.StringUtils;
import org.openqa.selenium.WebElement;
public class HtmlTag {
protected final WebElement webElement;
private HtmlTag(WebElement webElement) {
this.webElement = webElement;
}
public static HtmlTag from(WebElement webElement) {
if (ButtonTag.canHandleThis(webElement)) {
return new ButtonTag(webElement);
}
if (LinkTag.canHandleThis(webElement)) {
return new LinkTag(webElement);
}
return new HtmlTag(webElement);
}
protected static StringMatcher tagFrom(WebElement webElement) {
return new StringMatcher(webElement.getTagName());
}
protected static StringMatcher typeFrom(WebElement webElement) {
return new StringMatcher(webElement.getAttribute("type"));
}
public String inHumanReadableForm() {
String tagName = webElement.getTagName();
String value = webElement.getAttribute("value");
String text = webElement.getText();
StringBuilder elementDescription = new StringBuilder(tagName);
if (StringUtils.isNotEmpty(value)) {
elementDescription.append(" - ").append(value);
}
if (StringUtils.isNotEmpty(text)) {
elementDescription.append(" '").append(text).append("'");
}
return elementDescription.toString();
}
//
// Implementation classes
//
static class ButtonTag extends HtmlTag {
private ButtonTag(WebElement webElement) {
super(webElement);
}
@Override
public String inHumanReadableForm() {
return "button: " + super.inHumanReadableForm();
}
public static boolean canHandleThis(WebElement webElement) {
return (tagFrom(webElement).is("input")
&& (typeFrom(webElement).is("button") || typeFrom(webElement).is("submit")));
}
}
static class LinkTag extends HtmlTag {
private LinkTag(WebElement webElement) {
super(webElement);
}
@Override
public String inHumanReadableForm() {
return "link '" + webElement.getText() + "'";
}
public static boolean canHandleThis(WebElement webElement) {
return tagFrom(webElement).is("a");
}
}
static class StringMatcher {
private final String value;
StringMatcher(String value) {
this.value = value;
}
public boolean is(String expectedValue) {
return StringUtils.equals(value, expectedValue);
}
}
}