package com.algocrafts.selenium; import org.openqa.selenium.*; import org.openqa.selenium.interactions.internal.Coordinates; import org.openqa.selenium.internal.Locatable; import org.slf4j.Logger; import java.util.List; import static org.slf4j.LoggerFactory.getLogger; public class Element implements SearchScope<Element>, WebElement, Locatable { private static final Logger logger = getLogger(Element.class); private WebElement element; private SearchContext searchContext; private By by; public Element(WebElement element) { this.element = element; } @Override public String getAttribute(String key) { return element.getAttribute(key); } @Override public boolean isDisplayed() { return element.isDisplayed(); } @Override public Point getLocation() { return element.getLocation(); } @Override public Dimension getSize() { return element.getSize(); } @Override public Rectangle getRect() { return null; } @Override public String getCssValue(String propertyName) { return element.getCssValue(propertyName); } @Override public void click() { logger.info("clicking " + element + "[" + this + "]"); element.click(); } @Override public void submit() { logger.info("Submitting " + element + "[" + this + "]"); element.submit(); } @Override public void sendKeys(CharSequence... keysToSend) { element.sendKeys(keysToSend); } @Override public String getText() { return element.getText(); } @Deprecated @Override public List<WebElement> findElements(By by) { return new ElementsFinder(by).locate(element); } @Deprecated @Override public Element findElement(By by) { Element locate; try { locate = new Element(element.findElement(by)); } catch (StaleElementReferenceException e) { //<2> this.element = searchContext.findElement(this.by); //<3> return findElement(by); //<4> } return locate; } @Override public void clear() { element.clear(); } @Override public String getTagName() { return element.getTagName(); } public boolean isSelected() { return element.isSelected(); } @Override public boolean isEnabled() { return element.isEnabled(); } @Override public void onTimeout() { logger.info("Saving " + element + "[" + this + "]"); } @Override public Coordinates getCoordinates() { return ((Locatable) element).getCoordinates(); } @Override public String toString() { String tagName = element.getTagName(); return "[Element: " + (tagName.equals("input") ? element.getAttribute("value") : tagName.equals("img") ? element.getAttribute("src") : element.getText()) + "] wrapping " + element; } public void setBrowser(SearchContext searchContext) { this.searchContext = searchContext; } public void setBy(By by) { this.by = by; } @Override public <X> X getScreenshotAs(OutputType<X> target) throws WebDriverException { return element.getScreenshotAs(target); } }