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

com.automationrockstars.design.desktop.driver.ByImage Maven / Gradle / Ivy

/*
 * 
 */

package com.automationrockstars.design.desktop.driver;

import com.automationrockstars.design.desktop.driver.internal.ImageCache;
import com.google.common.base.Function;
import com.google.common.base.Preconditions;
import com.google.common.collect.Iterators;
import com.google.common.collect.Lists;
import org.openqa.selenium.By;
import org.openqa.selenium.SearchContext;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.internal.FindsById;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.remote.RemoteWebElement;

import java.util.List;

public class ByImage extends By {

    private String imagePath;

    public ByImage(String imagePath) {
        if (isImageId(imagePath)) {
            imagePath = translateFromId(imagePath);
        }
        this.imagePath = imagePath;
    }

    public static boolean isImageId(String id) {
        return id.startsWith("image:");
    }

    public static boolean isImageId(By by) {
        return by instanceof ById && isImageId(by.toString().replace("By.id: ", ""));
    }

    public static String translateFromId(String id) {
        Preconditions.checkArgument(isImageId(id), "id %s is not image id", id);
        return id.replace("image:", "");
    }

    public static String translateToId(String imagePath) {
        return String.format("image:%s", imagePath);
    }

    public static ByImage translateFrom(By byId) {
        Preconditions.checkArgument(isImageId(byId), "Only ById specyfying image can be translated");
        return new ByImage((byId.toString().replace("By.id: ", "")));
    }

    @Override
    public List findElements(SearchContext context) {
        Preconditions.checkArgument(ImageSearchContext.class.isAssignableFrom(context.getClass()) || context.toString().toLowerCase().contains("sikuli"), "ByImage works only with SikuliDriver");
        if (context instanceof RemoteWebDriver || context instanceof RemoteWebElement)
            return searchRemote(imagePath, context);
        List result = Lists.newArrayList(Iterators.transform(((ImageSearchContext) context).findElements(imagePath), new Function() {
            @Override
            public WebElement apply(ImageUiObject input) {
                return input;
            }
        }));
        return result;

    }

    public String path() {
        return imagePath;
    }

    private List searchRemote(String imagePath, SearchContext ctx) {
        if (WebDriver.class.isAssignableFrom(ctx.getClass())) {
            ImageCache.syncRemote((WebDriver) ctx);
        }
        return ((FindsById) ctx).findElementsById(translateToId(imagePath));
    }

    public String toString() {
        return String.format("element matching image %s", imagePath);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy