package bvira.test.abstraction; import org.jdom.Attribute; import org.jdom.Content; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; import org.jdom.xpath.XPath; import org.openqa.selenium.By; import org.openqa.selenium.SearchContext; import org.openqa.selenium.WebElement; import java.io.StringReader; import java.util.ArrayList; import java.util.List; public class StaticDriverAdaptor implements DriverAdaptor, SearchContext { private final Document document; private final String source; public StaticDriverAdaptor(String htmlText) { source = htmlText; SAXBuilder builder = new SAXBuilder(); try { document = builder.build(new StringReader(source)); } catch (Exception e) { throw new TestFrameworkException(("failure when trying to parse page in " + this.getClass().getName()), e); } } public List<WebElement> findElementsById(String id) { return getElements(("//.[@id='" + id + "']")); } public WebElement findElementByLinkText(String linkText) { List<WebElement> anchors = findElementsByLinkText(linkText); if (anchors.size() > 0) { return anchors.get(0); } else { throw new ElementNotFoundException("Unable to find anchor with link text: " + linkText); } } public List<WebElement> findElementsByLinkText(String linkText) { return getElements(String.format("//a[text() = '%s']", linkText)); } public WebElement findElementByPartialLinkText(String linkText) { List<WebElement> anchors = findElementsByPartialLinkText(linkText); if (anchors.size() > 0) { return anchors.get(0); } else { throw new ElementNotFoundException("Unable to find anchor with partial link text: " + linkText); } } public List<WebElement> findElementsByPartialLinkText(String linkText) { return getElements(String.format("//a[contains(text(), '%s')]", linkText)); } public WebElement findElementByXPath(String xpath) { return findSingleElement(xpath); } public List<WebElement> findElementsByXPath(String xpath) { return getElements(xpath); } public WebElement findElementByName(String name) { return findSingleElement("//input[@name='" + name + "']"); } public List<WebElement> findElementsByName(String name) { return getElements("//input[@name='" + name + "']"); } public WebElement findElementByTagName(String tagName) { return getElementByTagName(tagName); } private WebElement getElementByTagName(String tagName) { return findSingleElement("//" + tagName); } public List<WebElement> findElementsByTagName(String tagName) { return getElements("//" + tagName); } public List<WebElement> findElements(By by) { return by.findElements(this); } public WebElement findElement(By by) { return by.findElement(this); } public boolean elementExists(String id) { return elementExistsXpath(String.format("//*[@id='%s']", id)); } public boolean elementExistsXpath(String xpath) { return elementExists(By.xpath(xpath)); } public boolean elementExists(By by) { boolean exists = true; try { by.findElement(this); } catch (ElementNotFoundException e) { exists = false; } return exists; } public WebElement findSingleElement(String xpath) { try { Element node = (Element) XPath.selectSingleNode(getRoot(), xpath); if (node == null) { throw new ElementNotFoundException("Unable to find element by xpath: " + xpath); } return new HtmlElement(node); } catch (JDOMException e) { throw new TestFrameworkException(e); } } public WebElement findElementById(String id) { WebElement element = findSingleElement(("//.[@id='" + id + "']")); if (element != null) { return element; } else { throw new ElementNotFoundException(""); } } public WebElement getSingleElement(String xpath) { return findSingleElement(xpath); } public WebElement getElementById(String id) { WebElement element = findElementById(id); if (element == null) { throw new ElementNotFoundException(String.format("Element with id %s not found while looking for single element with id", id)); } return element; } public String getDocument() { return source; } public List<String> getElementValues(String xpath) { List<String> values = new ArrayList<String>(); List<Object> result = selectMultiElements(xpath); for (Object object : result) { if (object instanceof Content) { values.add(((Element) object).getValue()); } if (object instanceof Attribute) { values.add(((Attribute) object).getValue()); } } return values; } public List<String> getLinkHrefs() { return getElementValues("//a[@href]/@href"); } public Element getRoot() { return document.getRootElement(); } public String getSelectValueById(String id) { return findSingleElement(("//select[@id='" + id + "']/option[@selected]")).getAttribute("value"); } public String getTextInputById(String id) { WebElement el = findSingleElement(("//input[@id='" + id + "' and @type='text']")); return el.getAttribute("value"); } public String getTitle() { return findSingleElement("//title").getText(); } @SuppressWarnings("unchecked") public List<Object> selectMultiElements(String xpath) { try { return XPath.selectNodes(getRoot(), xpath); } catch (JDOMException e) { throw new TestFrameworkException(e); } } @SuppressWarnings("unchecked") public List<WebElement> getElements(String xpath) { try { List<Element> nodes = XPath.selectNodes(document, xpath); List<WebElement> htmlElements = new ArrayList<WebElement>(); for (Element element : nodes) { htmlElements.add(new HtmlElement(element)); } return htmlElements; } catch (JDOMException e) { throw new TestFrameworkException(e); } } public boolean isElementPresent(String xpath) { return findSingleElement(xpath) != null; } public Link findLinkByLabelText(String label) { List<Link> links = this.getLinkElements(); for (Link link : links) { if (label.equals(link.getValue())) { return link; } } throw new ElementNotFoundException("Could not find anchor with label: " + label); } private List<Link> getLinkElements() { List<WebElement> anchors = getElements("//a"); List<Link> links = new ArrayList<Link>(); for (WebElement anchor : anchors) { links.add(new Link(anchor)); } return links; } }