Пример #1
0
        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());
        }
Пример #2
0
 public PositionProviderAndMemento(IPositionProvider positionProvider, PositionMemento positionMemento, FrameChain frames, Point currentScrollPosition)
 {
     Provider = positionProvider;
     Memento  = positionMemento;
     Frames   = frames;
     CurrentScrollPosition = currentScrollPosition;
 }
Пример #3
0
        /// <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.");
            }
        }
Пример #5
0
        /// <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);
        }
Пример #6
0
        /// <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_);
        }
Пример #10
0
        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);
     }
 }
Пример #12
0
        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());
        }
Пример #13
0
        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);
        }
Пример #14
0
        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);
 }
Пример #16
0
 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");
        }
Пример #19
0
        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);
        }
Пример #20
0
        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);
        }
Пример #22
0
        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_);
        }
Пример #23
0
        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_);
        }
Пример #24
0
 public EyesWebDriverNavigation(INavigation navigation, FrameChain frameChain)
 {
     navigation_ = navigation;
     frameChain_ = frameChain;
 }