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

com.automationrockstars.design.gir.webdriver.Waits Maven / Gradle / Ivy

The newest version!
/*******************************************************************************
 * Copyright (c) 2015, 2016 Automation RockStars Ltd.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Apache License v2.0
 * which accompanies this distribution, and is available at
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Contributors:
 *     Automation RockStars - initial API and implementation
 *******************************************************************************/
package com.automationrockstars.design.gir.webdriver;

import com.automationrockstars.base.ConfigLoader;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;

import org.openqa.selenium.*;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.FluentWait;
import org.openqa.selenium.support.ui.WebDriverWait;
import ru.yandex.qatools.htmlelements.element.HtmlElement;
import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementClassAnnotationsHandler;

import java.util.Arrays;

import static com.automationrockstars.base.ConfigLoader.config;
import static com.automationrockstars.design.gir.webdriver.DriverFactory.getUnwrappedDriver;
import static org.openqa.selenium.support.ui.ExpectedConditions.*;

public class Waits {

    public static void waitUntilVisible(UiObject element) {
        waitUntilVisible(element.getWrappedElement());
    }


    public static WebElement waitUntilVisible(By by) {
        return DriverFactory.delay().until(findVisible(by));
    }

    private static Function isNotMoving(final By by) {
        return new Function() {
            Point previous = new Point(-7, -77);

            public String toString() {
                return String.format("Element identified by %s is not moving", by);
            }

            @Override
            public Boolean apply(SearchContext input) {
                Point current = webElementWait(input).until(visible(by)).getLocation();
                if (previous.equals(current)) {
                    return true;
                } else {
                    previous = current;
                    return false;
                }
            }
        };
    }

    public static void waitUntilNotMoving(final WebElement element) {
        withDefaultDelay().until(new Function() {
            Point previous = element.getLocation();

            @Override
            public Boolean apply(WebDriver input) {
                if (element.getLocation().equals(previous)) {
                    return true;
                } else {
                    previous = element.getLocation();
                    return false;
                }
            }
        });
    }

    public static void waitUntilNotMoving(final By uiElement) {
        webElementWait(getUnwrappedDriver()).until(isNotMoving(uiElement));
    }

    private static ExpectedCondition findVisible(final By by) {
        return new ExpectedCondition() {

            @Override
            public WebElement apply(WebDriver input) {
                if (input instanceof FilterableSearchContext) {
                    try {
                        return input.findElement(by);
                    } catch (Throwable e) {
                        return null;
                    }
                } else {
                    try {
                        return DriverFactory.getDriver().findElement(by);
                    } catch (Throwable e) {
                        return null;
                    }
                }
            }

            @Override
            public String toString() {
                return String.format("Visibility of element found %s", by);
            }
        };

    }

    public static WebElement waitUntilVisible(WebElement element) {
        return DriverFactory.delay().until(visibilityOf(element));
    }


    public static WebElement waitUntilClickable(WebElement element) {
        return DriverFactory.delay().until(elementToBeClickable(element));
    }


    public static void waitUntilHidden(By by) {
        DriverFactory.delay().until(invisibilityOfElementLocated(by));
    }

    public static void waitUntilHidden(UiObject element) {
        waitUntilHidden(element.getLocator());
    }

    @SuppressWarnings("unchecked")
    public static void waitUntilHidden(HtmlElement element) {
        By by = null;
        try {
            by = new HtmlElementClassAnnotationsHandler((Class) element.getClass()).buildBy();
        } catch (Throwable ignore) {
            if (element instanceof UiObject) {
                by = ((UiObject) element).getLocator();
            }
        }
        if (by != null) {
            waitUntilHidden(by);
        }
    }

    public static ExpectedCondition anyVisible(final By... bys) {
        return new ExpectedCondition() {
            @Override
            public UiObject apply(WebDriver input) {
                while (input.getClass().isAssignableFrom(WrapsDriver.class)) {
                    input = ((WrapsDriver) input).getWrappedDriver();
                }
                int wait = config().getInt(FilterableSearchContext.STUBBORN_WAIT_PARAM, 5);
                config().setProperty(FilterableSearchContext.STUBBORN_WAIT_PARAM, 0);
                UiObject result = null;
                SearchContext ctx = new FilterableSearchContext(input);
                for (By by : bys) {
                    try {
                        result = new UiObject(ctx.findElement(by), by);
                        if (result.isDisplayed()) {
                            break;
                        } else {
                            result = null;
                        }

                    } catch (Exception ignore) {
                    }
                }
                config().setProperty(FilterableSearchContext.STUBBORN_WAIT_PARAM, wait);
                return result;
            }

            public String toString() {
                return String.format("Visiblity of any of elements %s", Arrays.toString(bys));
            }

        };
    }

    public static UiObject waitForAnyVisible(final By... bys) {
        return DriverFactory.delay().until(anyVisible(bys));

    }

    public static void waitUntilSourceContains(final String pageSourcePart) {
        DriverFactory.delay().until(new Function() {

            @Override
            public Boolean apply(WebDriver input) {
                return DriverFactory.getDriver().getPageSource().contains(pageSourcePart);
            }

            public String toString() {
                return String.format("Page source contains %s", pageSourcePart);
            }
        });
    }

    public static WebDriverWait withDefaultDelay() {
        return DriverFactory.delay();
    }

    public static WebDriverWait withDelay(int seconds) {
        return DriverFactory.delay(seconds);
    }


    public static ExpectedCondition clickable(By by) {
        return elementToBeClickable(by);
    }

    public static FluentWait webElementWait(SearchContext context) {
        return new FluentWait(context);
    }

    public static Function visible(final By by) {
        return new Function() {

            @Override
            public WebElement apply(SearchContext input) {
                Optional visibleElement = Iterables.tryFind(FilterableSearchContext.unwrap(input).findElements(by), new Predicate() {
                    @Override
                    public boolean apply(WebElement input) {
                        return input.isDisplayed();
                    }
                });

                if (visibleElement.isPresent()) {
                    return visibleElement.get();
                } else {
                    return null;
                }
            }
        };
    }

    public static Function hidden(final By by) {
        return new Function() {

            @Override
            public Boolean apply(SearchContext input) {
                Optional visibleElement = Iterables.tryFind(FilterableSearchContext.unwrap(input).findElements(by), new Predicate() {
                    @Override
                    public boolean apply(WebElement input) {
                        return input != null && input.isDisplayed();
                    }
                });
                return !visibleElement.isPresent();
            }
        };
    }

}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy