internal EyesWebDriver(Logger logger, SeleniumEyes eyes, IUserActionsEyes userActionEyes, RemoteWebDriver driver) { ArgumentGuard.NotNull(logger, nameof(logger)); //ArgumentGuard.NotNull(eyes, nameof(eyes)); ArgumentGuard.NotNull(driver, nameof(driver)); Logger_ = logger; Eyes = eyes; UserActionsEyes = userActionEyes; RemoteWebDriver = driver; frameChain_ = new FrameChain(logger); executeCommandMI_ = driver.GetType().GetMethod("Execute", BindingFlags.Instance | BindingFlags.NonPublic); var driverType = driver.GetType(); bool isAppiumDriver = false; var dt = driverType; while (dt != null && !isAppiumDriver) { isAppiumDriver = dt.Name.StartsWith("AppiumDriver`"); dt = dt.BaseType; } if (!isAppiumDriver) { executeCommandMI_ = driverType.GetMethod("Execute", BindingFlags.Instance | BindingFlags.NonPublic); var commandExecutorProperty = driverType.GetProperty("CommandExecutor", BindingFlags.Instance | BindingFlags.NonPublic); var commandExecutor = (ICommandExecutor)commandExecutorProperty.GetValue(driver); commandExecutor.CommandInfoRepository.TryAddCommand("getSession", new CommandInfo("GET", "/session/{sessionId}/")); } Logger_.Verbose("Driver is {0}", driver.GetType()); }
public PositionProviderAndMemento(IPositionProvider positionProvider, PositionMemento positionMemento, FrameChain frames, Point currentScrollPosition) { Provider = positionProvider; Memento = positionMemento; Frames = frames; CurrentScrollPosition = currentScrollPosition; }
/// <summary> /// Returns the viewport size of the default content (outer most frame). /// </summary> /// <param name="forceQuery">If true, we will perform the query even if we have a cached viewport size.</param> /// <returns>The viewport size of the default content (outer most frame).</returns> public Size GetDefaultContentViewportSize(bool forceQuery = false) { Logger_.Verbose("GetDefaultContentViewportSize()"); if (!defaultContentViewportSize_.IsEmpty && !forceQuery) { Logger_.Verbose("Using cached viewport size: {0}", defaultContentViewportSize_); return(defaultContentViewportSize_); } FrameChain currentFrames = frameChain_.Clone(); if (currentFrames.Count > 0) { SwitchTo().DefaultContent(); } Logger_.Verbose("Extracting viewport size..."); defaultContentViewportSize_ = EyesSeleniumUtils.GetViewportSizeOrDisplaySize(Logger_, this); Logger_.Verbose("Done! Viewport size: {0}", defaultContentViewportSize_); if (currentFrames.Count > 0) { ((EyesWebDriverTargetLocator)SwitchTo()).Frames(currentFrames); } return(defaultContentViewportSize_); }
internal void TryHideScrollbars(bool stitchContent, IWebElement scrollRootElement) { if (configuration_.HideScrollbars) { scrollRootElement_ = scrollRootElement; frameChain_ = driver_.GetFrameChain().Clone(); if (frameChain_.Count > 0) { FrameChain fc = frameChain_.Clone(); // for the target frame, we only wish to remove scrollbars when in "fully" mode. if (stitchContent) { Frame frame = fc.Peek(); frame.HideScrollbars(driver_); } RemoveScrollbarsFromParentFrames_(logger_, fc, driver_); } else { logger_.Verbose("hiding scrollbars of element: {0}", scrollRootElement); originalOverflow_ = EyesSeleniumUtils.SetOverflow("hidden", driver_, scrollRootElement); } logger_.Verbose("switching back to original frame"); ((EyesWebDriverTargetLocator)driver_.SwitchTo()).Frames(frameChain_); logger_.Verbose("done hiding scrollbars."); } else { logger_.Verbose("no need to hide scrollbars."); } }
/// <summary> /// Compares two frame chains. /// </summary> /// <param name="c1">Frame chain to be compared against c2.</param> /// <param name="c2">Frame chain to be compared against c1.</param> /// <returns>True if both frame chains represent the same frame, or false otherwise.</returns> public static bool IsSameFrameChain(FrameChain c1, FrameChain c2) { if (c1 == null) { return(c2 == null || c2.frames_.Count == 0); } if (c2 == null) { return(c1.frames_.Count == 0); } int lc1 = c1.frames_.Count; int lc2 = c2.frames_.Count; // different chains size means different frames if (lc1 != lc2) { return(false); } //noinspection ForLoopReplaceableByForEach for (int i = 0; i < lc1; ++i) { if (!c1.frames_[i].Reference.Equals(c2.frames_[i].Reference)) { return(false); } } return(true); }
/// <summary> /// Switches into every frame in the frame chain. This is used as way to /// switch into nested frames (while considering scroll) in a single call. /// </summary> /// <param name="frameChain">The path to the frame to switch to.</param> /// <returns>The WebDriver with the switched context.</returns> public IWebDriver Frames(FrameChain frameChain) { FrameChain currentFrameChain = driver_.GetFrameChain(); if (frameChain == currentFrameChain) { throw new ArgumentException("given " + nameof(frameChain) + " is the same instance as the one in the driver! Perhaps `.Clone()` is missing?"); } if (FrameChain.IsSameFrameChain(currentFrameChain, frameChain)) { logger_.Log(TraceLevel.Debug, Stage.General, new { message = "given frame chain equals current frame chain. returning." }); return(driver_); } logger_.Log(TraceLevel.Debug, Stage.General, new { frameChainSize = frameChain?.Count ?? 0 }); if (currentFrameChain.Count > 0) { this.DefaultContent(); } if (frameChain != null && frameChain.Count > 0) { foreach (Frame frame in frameChain) { this.Frame(frame.Reference); Frame newFrame = driver_.GetFrameChain().Peek(); newFrame.ScrollRootElement = frame.ScrollRootElement; } } return(driver_); }
internal void TryRestoreScrollbars() { if (configuration_.HideScrollbars) { ((EyesWebDriverTargetLocator)driver_.SwitchTo()).Frames(frameChain_); FrameChain fc = frameChain_.Clone(); if (fc.Count > 0) { while (fc.Count > 0) { Frame frame = fc.Pop(); frame.ReturnToOriginalOverflow(driver_); EyesWebDriverTargetLocator.ParentFrame(logger_, driver_.RemoteWebDriver.SwitchTo(), fc); } } else { if (originalOverflow_ != null) { logger_.Verbose("returning overflow of element to its original value: {0}", scrollRootElement_); EyesSeleniumUtils.SetOverflow(originalOverflow_, driver_, scrollRootElement_); } } ((EyesWebDriverTargetLocator)driver_.SwitchTo()).Frames(frameChain_); logger_.Verbose("done restoring scrollbars."); } else { logger_.Verbose("no need to restore scrollbars."); } }
public IWebDriver FramesDoScroll(FrameChain frameChain) { logger_.Verbose("EyesTargetLocator.framesDoScroll(frameChain)"); ITargetLocator targetLocator = driver_.SwitchTo(); targetLocator.DefaultContent(); IPositionProvider scrollProvider = new ScrollPositionProvider(logger_, jsExecutor_, driver_.Eyes.GetCurrentFrameScrollRootElement()); defaultContentPositionMemento_ = scrollProvider.GetState(); foreach (Frame frame in frameChain) { logger_.Verbose("Scrolling by parent scroll position..."); Point frameLocation = frame.Location; scrollProvider.SetPosition(frameLocation); logger_.Verbose("Done! Switching to frame..."); targetLocator.Frame(frame.Reference); Frame newFrame = driver_.GetFrameChain().Peek(); newFrame.ScrollRootElement = frame.ScrollRootElement; newFrame.ScrollRootElementInnerBounds = frame.ScrollRootElementInnerBounds; logger_.Verbose("Done!"); } logger_.Verbose("Done switching into nested frames!"); return(driver_); }
/// <summary> /// Switches into every frame in the frame chain. This is used as way to /// switch into nested frames (while considering scroll) in a single call. /// </summary> /// <param name="frameChain">The path to the frame to switch to.</param> /// <returns>The WebDriver with the switched context.</returns> public IWebDriver Frames(FrameChain frameChain) { FrameChain currentFrameChain = driver_.GetFrameChain(); if (frameChain == currentFrameChain) { throw new ArgumentException("given " + nameof(frameChain) + " is the same instance as the one in the driver! Perhaps `.Clone()` is missing?"); } if (FrameChain.IsSameFrameChain(currentFrameChain, frameChain)) { logger_.Verbose("given frame chain equals current frame chain. returning."); return(driver_); } logger_.Debug("(frameChain) - number of frames: {0}", frameChain?.Count ?? 0); if (currentFrameChain.Count > 0) { this.DefaultContent(); } if (frameChain != null && frameChain.Count > 0) { foreach (Frame frame in frameChain) { logger_.Debug("frame.Reference: {0}", frame.Reference); this.Frame(frame.Reference); logger_.Debug("frame.ScrollRootElement: {0}", frame.ScrollRootElement); Frame newFrame = driver_.GetFrameChain().Peek(); newFrame.ScrollRootElement = frame.ScrollRootElement; } logger_.Verbose("Done switching into nested frames!"); } return(driver_); }
public EyesWebDriverScreenshot(Logger logger, EyesWebDriver driver, Bitmap image, ScreenshotTypeEnum?screenshotType, Point?frameLocationInScreenshot) : base(image) { ArgumentGuard.NotNull(logger, nameof(logger)); ArgumentGuard.NotNull(driver, nameof(driver)); logger_ = logger; driver_ = driver; logger_.Verbose("enter"); UpdateScreenshotType_(screenshotType, image); IPositionProvider positionProvider; if (frameLocationInScreenshot == null || frameLocationInScreenshot.Value.IsEmpty) { IWebElement frameScrollRoot = driver.Eyes.GetCurrentFrameScrollRootElement(); positionProvider = driver.Eyes.GetPositionProvider(logger, driver.Eyes.StitchMode, driver, frameScrollRoot); logger_.Verbose("position provider: using the current frame scroll root element's position provider: {0}", positionProvider); } else if (driver.Eyes.CurrentFramePositionProvider != null) { positionProvider = driver.Eyes.CurrentFramePositionProvider; logger_.Verbose("position provider: using CurrentFramePositionProvider: {0}", positionProvider); } else { positionProvider = driver.Eyes.PositionProvider; logger_.Verbose("position provider: using PositionProvider: {0}", positionProvider); } //IPositionProvider positionProvider = driver.Eyes.CurrentFramePositionProvider ?? driver.Eyes.PositionProvider; frameChain_ = driver_.GetFrameChain(); logger_.Verbose("got frame chain. getting frame size..."); Size frameSize = GetFrameSize_(positionProvider); UpdateCurrentScrollPosition_(positionProvider); UpdateFrameLocationInScreenshot_(frameLocationInScreenshot); Size frameContentSize = GetFrameContentSize(); logger.Verbose("Calculating frame window..."); frameWindow_ = new Region(frameLocationInScreenshot_, frameContentSize); Region imageSizeAsRegion = new Region(0, 0, image.Width, image.Height); logger.Verbose("frameWindow_: {0} ; imageSizeAsRegion: {1}", frameWindow_, imageSizeAsRegion); frameWindow_.Intersect(imageSizeAsRegion); logger.Verbose("updated frameWindow_: {0}", frameWindow_); if (frameWindow_.Width <= 0 || frameWindow_.Height <= 0) { throw new EyesException("Got empty frame window for screenshot!"); } logger.Verbose("Done!"); }
internal void HideCaret() { if (configuration_.HideCaret) { frameChain_ = driver_.GetFrameChain().Clone(); logger_.Verbose("Hiding caret. driver_.FrameChain.Count: {0}", frameChain_.Count); activeElement_ = driver_.ExecuteScript(HIDE_CARET); } }
internal EyesWebDriver(Logger logger, SeleniumEyes eyes, RemoteWebDriver driver) { ArgumentGuard.NotNull(logger, nameof(logger)); //ArgumentGuard.NotNull(eyes, nameof(eyes)); ArgumentGuard.NotNull(driver, nameof(driver)); Logger_ = logger; Eyes = eyes; RemoteWebDriver = driver; frameChain_ = new FrameChain(logger); Logger_.Verbose("Driver is {0}", driver.GetType()); }
internal static FrameState GetCurrentFrameState(EyesWebDriver driver, IWebElement scrolledElement) { IJavaScriptExecutor jsExecutor = driver; Logger logger = driver.Eyes.Logger; UserAgent userAgent = UserAgent.ParseUserAgentString(driver.GetUserAgent()); IPositionProvider cssPositionProvider = SeleniumPositionProviderFactory.GetPositionProvider(logger, StitchModes.CSS, driver, scrolledElement, userAgent); IPositionProvider scrollPositionProvider = SeleniumPositionProviderFactory.GetPositionProvider(logger, StitchModes.Scroll, driver, scrolledElement, userAgent); string overflow = (string)jsExecutor.ExecuteScript("return arguments[0].style.overflow", scrolledElement); FrameChain frameChain = driver.GetFrameChain().Clone(); FrameState frameState = new FrameState(driver, scrolledElement, cssPositionProvider, scrollPositionProvider, overflow, frameChain); return(frameState); }
public FrameState(EyesWebDriver driver, IWebElement scrolledElement, IPositionProvider cssPositionProvider, IPositionProvider scrollPositionProvider, string overflow, FrameChain frameChain) { driver_ = driver; scrolledElement_ = scrolledElement; cssPositionProvider_ = cssPositionProvider; cssMemento_ = cssPositionProvider_.GetState(); scrollPositionProvider_ = scrollPositionProvider; scrollMemento_ = scrollPositionProvider_.GetState(); overflow_ = overflow; frameChain_ = frameChain; }
/// <summary> /// Create a frame(!) window screenshot /// </summary> /// <param name="logger"></param> /// <param name="driver"></param> /// <param name="image"></param> /// <param name="entireFrameSize"></param> public EyesWebDriverScreenshot(Logger logger, EyesWebDriver driver, Bitmap image, Size entireFrameSize, Point frameLocationInScreenshot) : base(image) { ArgumentGuard.NotNull(logger, nameof(logger)); ArgumentGuard.NotNull(driver, nameof(driver)); ArgumentGuard.NotNull(entireFrameSize, nameof(entireFrameSize)); logger_ = logger; driver_ = driver; frameChain_ = driver_.GetFrameChain(); // The frame comprises the entire screenshot. screenshotType_ = ScreenshotTypeEnum.ENTIRE_FRAME; currentFrameScrollPosition_ = new Point(0, 0); frameLocationInScreenshot_ = frameLocationInScreenshot; frameWindow_ = new Region(new Point(0, 0), entireFrameSize); }
public static void ParentFrame(Logger logger, ITargetLocator targetLocator, FrameChain frameChainToParent) { logger.Log(TraceLevel.Debug, Stage.General, StageType.Called); try { targetLocator.ParentFrame(); } catch { targetLocator.DefaultContent(); foreach (Frame frame in frameChainToParent) { targetLocator.Frame(frame.Reference); } } }
public static void ParentFrame(Logger logger, ITargetLocator targetLocator, FrameChain frameChainToParent) { logger.Debug("enter (static)"); try { targetLocator.ParentFrame(); } catch { targetLocator.DefaultContent(); foreach (Frame frame in frameChainToParent) { targetLocator.Frame(frame.Reference); } } }
private static void RemoveScrollbarsFromParentFrames_(Logger logger, FrameChain fc, EyesWebDriver driver) { logger.Verbose("enter"); driver.SwitchTo().ParentFrame(); fc.Pop(); Frame frame = fc.Peek(); while (fc.Count > 0) { logger.Verbose("fc.Count = {0}", fc.Count); frame.HideScrollbars(driver); driver.SwitchTo().ParentFrame(); fc.Pop(); frame = fc.Peek(); } logger.Verbose("exit"); }
internal void PreparePage(ISeleniumCheckTarget seleniumCheckTarget, Configuration config, IWebElement userDefinedSRE) { frameStates_ = new List <FrameState>(); originalFrameChain_ = driver_.GetFrameChain().Clone(); if (seleniumCheckTarget.GetTargetElement() != null || seleniumCheckTarget.GetTargetSelector() != null || seleniumCheckTarget.GetFrameChain().Count > 0) { PrepareParentFrames_(); } SaveCurrentFrameState_(frameStates_, driver_, userDefinedSRE); TryHideScrollbarsInFrame(config, driver_, userDefinedSRE); int switchedToFrameCount = SwitchToTargetFrame_(seleniumCheckTarget, config, frameStates_, userDefinedSRE); logger_.Verbose(nameof(switchedToFrameCount) + ": {0}", switchedToFrameCount); }
public static int CountCommonFrames(FrameChain c1, FrameChain c2) { ArgumentGuard.NotNull(c1, nameof(c1)); ArgumentGuard.NotNull(c2, nameof(c2)); int commonFrames = 0; int lc1 = c1.frames_.Count; int lc2 = c2.frames_.Count; int lc = Math.Min(lc1, lc2); for (int i = 0; i < lc; ++i) { if (c1.frames_[i].Reference.Equals(c2.frames_[i].Reference)) { commonFrames++; continue; } break; } return(commonFrames); }
private Point CalcFrameLocationInScreenshot_(FrameChain frameChain, ScreenshotTypeEnum screenshotType) { EyesWebDriverTargetLocator switchTo = (EyesWebDriverTargetLocator)driver_.SwitchTo(); FrameChain currentFC = frameChain.Clone(); switchTo.DefaultContent(); Point locationInScreenshot = Point.Empty; foreach (Frame frame in currentFC) { Rectangle rect = ((EyesRemoteWebElement)frame.Reference).GetClientBounds(); SizeAndBorders sizeAndBorders = ((EyesRemoteWebElement)frame.Reference).SizeAndBorders; RectangularMargins borders = sizeAndBorders.Borders; rect.Offset(borders.Left, borders.Top); locationInScreenshot.Offset(rect.Location); switchTo.Frame(frame.Reference); } return(locationInScreenshot); }
public IWebDriver FramesDoScroll(FrameChain frameChain) { logger_.Log(TraceLevel.Debug, Stage.General, StageType.Called); ITargetLocator targetLocator = driver_.SwitchTo(); targetLocator.DefaultContent(); IPositionProvider scrollProvider = new ScrollPositionProvider(logger_, jsExecutor_, driver_.Eyes.GetCurrentFrameScrollRootElement()); defaultContentPositionMemento_ = scrollProvider.GetState(); foreach (Frame frame in frameChain) { Point frameLocation = frame.Location; scrollProvider.SetPosition(frameLocation); targetLocator.Frame(frame.Reference); Frame newFrame = driver_.GetFrameChain().Peek(); newFrame.ScrollRootElement = frame.ScrollRootElement; newFrame.ScrollRootElementInnerBounds = frame.ScrollRootElementInnerBounds; } return(driver_); }
private void PrepareParentFrames_() { if (originalFrameChain_.Count == 0) { return; } EyesWebDriverTargetLocator switchTo = (EyesWebDriverTargetLocator)driver_.SwitchTo(); FrameChain fc = originalFrameChain_.Clone(); while (fc.Count > 0) { switchTo.ParentFrame(); Frame currentFrame = fc.Pop(); IWebElement rootElement = EyesSeleniumUtils.GetCurrentFrameScrollRootElement(driver_, null); SaveCurrentFrameState_(frameStates_, driver_, rootElement); MaximizeTargetFrameInCurrentFrame_(currentFrame.Reference, rootElement); } frameStates_.Reverse(); switchTo.Frames(originalFrameChain_); }
public EyesWebDriverNavigation(INavigation navigation, FrameChain frameChain) { navigation_ = navigation; frameChain_ = frameChain; }