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

com.applitools.eyes.selenium.PageState Maven / Gradle / Ivy

package com.applitools.eyes.selenium;

import com.applitools.eyes.Location;
import com.applitools.eyes.Logger;
import com.applitools.eyes.Region;
import com.applitools.eyes.UserAgent;
import com.applitools.eyes.positioning.PositionProvider;
import com.applitools.eyes.selenium.fluent.FrameLocator;
import com.applitools.eyes.selenium.fluent.ISeleniumCheckTarget;
import com.applitools.eyes.selenium.fluent.ISeleniumFrameCheckTarget;
import com.applitools.eyes.selenium.frames.Frame;
import com.applitools.eyes.selenium.frames.FrameChain;
import com.applitools.eyes.selenium.wrappers.EyesRemoteWebElement;
import com.applitools.eyes.selenium.wrappers.EyesSeleniumDriver;
import com.applitools.eyes.selenium.wrappers.EyesTargetLocator;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import com.applitools.eyes.config.Configuration;

public class PageState {
    private EyesSeleniumDriver driver;
    private Logger logger;
    private List frameStates;
    private FrameChain originalFrameChain;
    private StitchMode stitchMode;
    private UserAgent userAgent;

    public PageState(Logger logger, EyesSeleniumDriver driver, StitchMode stitchMode, UserAgent userAgent) {
        this.logger = logger;
        this.driver = driver;
        this.stitchMode = stitchMode;
        this.userAgent = userAgent;
    }

    public void preparePage(ISeleniumCheckTarget seleniumCheckTarget, Configuration config, WebElement userDefinedSRE) {
        frameStates = new ArrayList<>();
        originalFrameChain = driver.getFrameChain().clone();

        if (seleniumCheckTarget.getTargetElement() != null ||
                seleniumCheckTarget.getTargetSelector() != null ||
                seleniumCheckTarget.getFrameChain().size() > 0) {
            prepareParentFrames();
        }

        if (!EyesDriverUtils.isMobileDevice(driver)) {
            saveCurrentFrameState(frameStates, driver, userDefinedSRE);
            tryHideScrollbarsInFrame(config, driver, userDefinedSRE);
            int switchedToFrameCount = switchToTargetFrame(seleniumCheckTarget, config, frameStates, userDefinedSRE);
            logger.verbose("switchedToFrameCount: " + switchedToFrameCount);
        }
    }

    private void prepareParentFrames() {
        if (originalFrameChain.size() == 0) {
            return;
        }

        EyesTargetLocator switchTo = (EyesTargetLocator) driver.switchTo();
        FrameChain fc = originalFrameChain.clone();
        while (fc.size() > 0) {
            switchTo.parentFrame();
            Frame currentFrame = fc.pop();
            WebElement rootElement = EyesSeleniumUtils.getCurrentFrameScrollRootElement(logger, driver, null);
            saveCurrentFrameState(frameStates, driver, rootElement);
            maximizeTargetFrameInCurrentFrame(currentFrame.getReference(), rootElement);
        }
        Collections.reverse(frameStates);
        switchTo.frames(originalFrameChain);
    }

    public void restorePageState() {
        if (EyesDriverUtils.isMobileDevice(driver)) {
            return;
        }

        Collections.reverse(frameStates);
        for(FrameState state : frameStates) {
            state.restore();
        }
        ((EyesTargetLocator) driver.switchTo()).frames(originalFrameChain);
    }

    private int switchToTargetFrame(ISeleniumCheckTarget checkTarget, Configuration config,
                                   List frameStates, WebElement userDefinedSRE) {
        List frameChain = checkTarget.getFrameChain();
        for(FrameLocator frameLocator : frameChain)
        {
            WebElement frameElement = EyesSeleniumUtils.findFrameByFrameCheckTarget(frameLocator, driver);
            maximizeTargetFrameInCurrentFrame(frameElement, userDefinedSRE);
            switchToFrame(frameElement, frameLocator, config, frameStates);
        }
        return frameChain.size();
    }

    private void maximizeTargetFrameInCurrentFrame(WebElement frameElement, WebElement userDefinedSRE) {
        WebElement currentFrameSRE = EyesSeleniumUtils.getCurrentFrameScrollRootElement(logger, driver, userDefinedSRE);

        PositionProvider positionProvider = SeleniumEyes.getPositionProviderForScrollRootElement(logger, driver,
                stitchMode, userAgent, currentFrameSRE);

        Region frameRect = EyesRemoteWebElement.getClientBoundsWithoutBorders(frameElement, driver, logger);
        if (stitchMode == StitchMode.SCROLL) {
            Location pageScrollPosition = positionProvider.getCurrentPosition();
            frameRect = frameRect.offset(pageScrollPosition.getX(), pageScrollPosition.getY());
        }
        positionProvider.setPosition(frameRect.getLocation());
    }

    private void switchToFrame(WebElement frameElement,
                               ISeleniumFrameCheckTarget frameTarget, Configuration config, List frameStates) {
        WebDriver.TargetLocator switchTo = driver.switchTo();

        switchTo.frame(frameElement);
        WebElement rootElement = SeleniumEyes.getScrollRootElementFromSREContainer(logger, frameTarget, driver);
        Frame frame = driver.getFrameChain().peek();
        frame.setScrollRootElement(rootElement);
        saveCurrentFrameState(frameStates, driver, rootElement);
        tryHideScrollbarsInFrame(config, driver, rootElement);
        frame.setScrollRootElementInnerBounds(EyesRemoteWebElement.getClientBoundsWithoutBorders(rootElement, driver, logger));
    }

    private static void tryHideScrollbarsInFrame(Configuration config, EyesSeleniumDriver driver, WebElement rootElement) {
        if (config.getHideScrollbars()) {
            EyesDriverUtils.setOverflow(driver, "hidden", rootElement);
        }
    }

    private static void saveCurrentFrameState(List frameStates, EyesSeleniumDriver driver, WebElement rootElement) {
        FrameState frameState = FrameState.getCurrentFrameState(driver, rootElement);
        frameStates.add(frameState);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy