com.applitools.eyes.selenium.frames.FrameChain Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of eyes-selenium-java4 Show documentation
Show all versions of eyes-selenium-java4 Show documentation
Applitools Eyes SDK for Selenium Java WebDriver
The newest version!
/*
* Applitools software.
*/
package com.applitools.eyes.selenium.frames;
import com.applitools.eyes.EyesException;
import com.applitools.eyes.Location;
import com.applitools.eyes.Logger;
import com.applitools.eyes.RectangleSize;
import com.applitools.eyes.selenium.exceptions.NoFramesException;
import com.applitools.utils.ArgumentGuard;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
/**
* Represents a path to a frame, including their location and scroll.
*/
public class FrameChain implements Iterable {
private final Logger logger;
private List frames;
/**
* Compares two frame chains.
* @param c1 Frame chain to be compared against c2.
* @param c2 Frame chain to be compared against c1.
* @return True if both frame chains represent the same frame, false otherwise.
*/
@SuppressWarnings("BooleanMethodIsAlwaysInverted")
public static boolean isSameFrameChain(FrameChain c1, FrameChain c2) {
int lc1 = c1.frames.size();
int lc2 = c2.frames.size();
// different chains size means different frames
if (lc1 != lc2) {
return false;
}
Iterator c1Iterator = c1.iterator();
Iterator c2Iterator = c2.iterator();
//noinspection ForLoopReplaceableByForEach
for (int i = 0; i < lc1; ++i) {
if (!c1Iterator.next().getReference().equals(c2Iterator.next().getReference())) {
return false;
}
}
return true;
}
/**
* Creates a new frame chain.
* @param logger A Logger instance.
*/
public FrameChain(Logger logger) {
ArgumentGuard.notNull(logger, "logger");
this.logger = logger;
frames = new LinkedList<>();
}
/**
* Creates a frame chain which is a copy of the current frame.
* @param logger A Logger instance.
* @param other A frame chain from which the current frame chain will be created.
*/
public FrameChain(Logger logger, FrameChain other) {
ArgumentGuard.notNull(logger, "logger");
ArgumentGuard.notNull(other, "other");
this.logger = logger;
frames = new ArrayList<>(other.frames);
}
/**
* @return The number of frames in the chain.
*/
public int size() {
return frames.size();
}
/**
* Removes all current frames in the frame chain.
*/
public void clear() {
frames.clear();
}
/**
* Removes the last inserted frame element. Practically means we switched
* back to the parent of the current frame
*/
public Frame pop() {
return frames.remove(frames.size() - 1);
}
/**
* @return Returns the top frame in the chain.
*/
public Frame peek() {
if (frames.size() == 0) return null;
return frames.get(frames.size() - 1);
}
/**
* Appends a frame to the frame chain.
* @param frame The frame to be added.
*/
public void push(Frame frame) {
frames.add(frame);
}
/**
* @return The location of the current frame in the page.
*/
public Location getCurrentFrameOffset() {
Location result = new Location(0, 0);
for (Frame frame : frames) {
result = result.offset(frame.getLocation());
}
return result;
}
/**
* @return The outermost frame's location, or NoFramesException.
*/
public Location getDefaultContentScrollPosition() {
if (frames.size() == 0) {
throw new NoFramesException("No frames in frame chain");
}
return new Location(frames.get(0).getOriginalLocation());
}
/**
* @return The size of the current frame.
*/
public RectangleSize getCurrentFrameSize() {
logger.verbose("getCurrentFrameSize()");
RectangleSize result = frames.get(frames.size() - 1).getOuterSize();
logger.verbose("Done!");
return result;
}
/**
* @return The inner size of the current frame.
*/
public RectangleSize getCurrentFrameInnerSize() {
logger.verbose("GetCurrentFrameInnerSize()");
RectangleSize result = frames.get(frames.size() - 1).getInnerSize();
logger.verbose("Done!");
return result;
}
/**
* @return An iterator to go over the frames in the chain.
*/
@SuppressWarnings("NullableProblems")
@Override
public Iterator iterator() {
return new Iterator() {
Iterator framesIterator = frames.iterator();
public boolean hasNext() {
return framesIterator.hasNext();
}
public Frame next() {
return framesIterator.next();
}
public void remove() {
throw new EyesException("Remove is forbidden using the iterator!");
}
};
}
@SuppressWarnings("MethodDoesntCallSuperMethod")
public FrameChain clone() {
return new FrameChain(this.logger, this);
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy