All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.automationrockstars.design.desktop.driver.internal.SikuliImageUiObject Maven / Gradle / Ivy

/*
 * 
 */

package com.automationrockstars.design.desktop.driver.internal;

import com.automationrockstars.design.desktop.driver.ByImage;
import com.automationrockstars.design.desktop.driver.ImageUiObject;
import com.automationrockstars.design.gir.webdriver.UiObject;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import com.google.common.collect.Iterators;
import com.google.common.collect.Lists;
import org.openqa.selenium.*;
import org.openqa.selenium.By.ById;
import org.openqa.selenium.interactions.Keyboard;
import org.openqa.selenium.interactions.Mouse;
import org.sikuli.script.FindFailed;
import org.sikuli.script.Match;
import org.sikuli.script.Region;

import javax.annotation.Nullable;
import java.nio.file.Paths;
import java.util.Iterator;
import java.util.List;

public class SikuliImageUiObject extends UiObject implements ImageUiObject {

    private final String imagePath;

    private Match wrapped;
    private String name = null;
    private double timeout = 5;

    public SikuliImageUiObject(Match image, String imagePath) {
        this.imagePath = imagePath;
        this.wrapped = image;

    }

    public static ImageUiObject wrap(Match toWrap, String imagePath, @Nullable String name) {
        SikuliImageUiObject result = new SikuliImageUiObject(toWrap, imagePath);
        result.setName(name);
        return result;

    }

    public static Iterator wrap(Iterator toWrap, final String imagePath, @Nullable final String name) {
        return Iterators.transform(toWrap, new Function() {

            @Override
            public ImageUiObject apply(Match input) {
                return wrap(input, imagePath, name);
            }
        });
    }

    static Iterator findAllWrapper(Region where, String locator, @Nullable String name) {
        try {
            return where.findAll(ImageCache.path(locator));
        } catch (FindFailed e) {
            throw new NoSuchElementException(String.format("Element %s not found on the screen", (name == null) ? locator : name));
        }
    }

    static Match findWrapper(Region where, String locator, @Nullable String name) {
        try {
            return where.wait(ImageCache.path(locator), 0);
        } catch (FindFailed e) {
            throw new NoSuchElementException(String.format("Element %s not found on the screen", (name == null) ? locator : name));
        }
    }

    public Match getImageElement() {
        return wrapped;
    }

    public WebElement getWrappedElement() {
        return this;
    }

    public void click() {
        getImageElement().click();
    }

    public void sendKeys(CharSequence... keys) {
        click();
        getImageElement().type(Joiner.on("").join(keys));
    }

    public void waitUntilVisible() {
        getImageElement();
    }

    public void waitUntilHidden() {
        SikuliDriver.waitUntilInvisible(imagePath, timeout);
    }

    @Override
    public String getText() {
        return getImageElement().text();
    }

    @Override
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public By getLocator() {
        return new ByImage(imagePath);
    }

    @Override
    public Point getLocation() {
        return new Point(getImageElement().x, getImageElement().y);
    }

    @Override
    public Dimension getSize() {
        return new Dimension(getImageElement().getW(), getImageElement().getH());
    }

//	@Override
//	public Coordinates getCoordinates() {
//		return new Coordinates() {
//
//			@Override
//			public Point onScreen() {
//				Point location = getLocation();
//				return location;
//			}
//
//			@Override
//			public Point onPage() {
//				return onScreen();
//			}
//
//			@Override
//			public Point inViewPort() {
//				return onScreen();
//			}
//
//			@Override
//			public Object getAuxiliary() {
//				return getImageElement().toStringShort();
//			}
//		};
//	}

    public String toString() {
        if (Strings.isNullOrEmpty(name)) {
            return String.format("Element identified by image %s", imagePath.toString());
        } else {
            return getName();
        }
    }

    @Override
    public boolean isVisible() {
        Match element = SikuliDriver.isVisible(imagePath);
        if (element == null) {
            return false;
        }
        this.wrapped = element;
        return true;
    }

    @Override
    public Keyboard getKeyboard() {
        return new SikuliKeyboard(getImageElement());
    }

    @Override
    public Mouse getMouse() {
        return new SikuliMouse(getImageElement());
    }

    @Override
    public void submit() {
        click();


    }

    @Override
    public void clear() {
        getImageElement().type(org.sikuli.script.Key.CTRL + "a");
        getImageElement().type(org.sikuli.script.Key.DELETE);

    }

    @Override
    public String getTagName() {
        return "desktopImage";
    }

    @Override
    public String getAttribute(String name) {
        throw new IllegalAccessError("Not supported");
    }

    @Override
    public boolean isSelected() {
        return true;
//		throw new IllegalAccessError("Not supported");
    }

    @Override
    public boolean isEnabled() {
        return true;
    }

    @Override
    public List findElements(By by) {
        if (by instanceof ById) {
            by = new ByImage(((ById) by).toString().split(" ")[1]);
        }
        return Lists.newArrayList(Iterators.transform(wrap(findAllWrapper(getImageElement(), ((ByImage) by).path(), null), ((ByImage) by).path(), null), new Function() {
            @Override
            public WebElement apply(ImageUiObject input) {
                return input;
            }
        }));
    }

    @Override
    public WebElement findElement(By by) {
        String path = null;
        if (by instanceof ByImage) {
            path = ((ByImage) by).path();
        } else {
            path = ByImage.translateFrom(by).path();
        }
        return wrap(findWrapper(getImageElement(), path, null), path, null);
    }

    @Override
    public boolean isDisplayed() {
        return isVisible();
    }

    @Override
    public Rectangle getRect() {
        return new Rectangle(getLocation(), getSize());
    }

    @Override
    public String getCssValue(String propertyName) {
        throw new IllegalAccessError("Not supported");
    }

    @Override
    public  X getScreenshotAs(OutputType target) throws WebDriverException {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public ImageUiObject findElement(ByImage by) {
        return findElement(by.path());
    }

    @Override
    public ImageUiObject findElement(String imagePath) {
        Preconditions.checkArgument(Paths.get(imagePath).toFile().canRead(), "Cannot read file %s", imagePath);
        return wrap(findWrapper(getImageElement(), imagePath, null), imagePath, null);
    }

    @Override
    public Iterator findElements(ByImage by) {
        return findElements(by.path());
    }

    @Override
    public Iterator findElements(String imagePath) {
        Preconditions.checkArgument(Paths.get(imagePath).toFile().canRead(), "Cannot read file %s", imagePath);
        return wrap(findAllWrapper(getImageElement(), imagePath, null), imagePath, null);
    }

    public void highlight() {
        getImageElement().highlight(1);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy