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 = SeleniumPositionProviderFactory.GetPositionProvider(logger, driver.Eyes.StitchMode, driver, frameScrollRoot);
                logger_.Debug("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_.Debug("position provider: using CurrentFramePositionProvider: {0}", positionProvider);
            }
            else
            {
                positionProvider = driver.Eyes.PositionProvider;
                logger_.Debug("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!");
        }
 public EyesWebDriverTargetLocator(EyesWebDriver driver, Logger logger, ITargetLocator targetLocator)
 {
     driver_        = driver;
     logger_        = logger;
     targetLocator_ = targetLocator;
     jsExecutor_    = new SeleniumJavaScriptExecutor(driver_);
     if (driver.Eyes != null)
     {
         scrollPositionProvider_ = SeleniumPositionProviderFactory.GetPositionProvider(
             logger_, StitchModes.Scroll, jsExecutor_, driver.Eyes.GetCurrentFrameScrollRootElement(), driver.Eyes.userAgent_);
     }
 }
示例#3
0
        public override Bitmap GetImage()
        {
            Bitmap image = base.GetImage();

            logger_.Verbose("Bitmap Size: {0}x{1}", image.Width, image.Height);

            eyes_.DebugScreenshotProvider.Save(image, "SAFARI");

            if (eyes_.IsCutProviderExplicitlySet)
            {
                return(image);
            }

            double scaleRatio = eyes_.DevicePixelRatio;

            Size originalViewportSize = GetViewportSize();

            Size viewportSize = new Size(
                (int)Math.Ceiling(originalViewportSize.Width * scaleRatio),
                (int)Math.Ceiling(originalViewportSize.Height * scaleRatio));

            logger_.Verbose("logical viewport size: " + originalViewportSize);

            if (userAgent_.OS.Equals(OSNames.IOS))
            {
                image = CropIOSImage(image, originalViewportSize, logger_);
            }
            else if (!eyes_.ForceFullPageScreenshot)
            {
                Point      loc;
                FrameChain currentFrameChain = eyes_.GetDriver().GetFrameChain();

                if (currentFrameChain.Count == 0)
                {
                    IWebElement       scrollRootElement = eyes_.GetCurrentFrameScrollRootElement();
                    IPositionProvider positionProvider  = SeleniumPositionProviderFactory.GetPositionProvider(logger_, StitchModes.Scroll, jsExecutor_, scrollRootElement, userAgent_);
                    loc = positionProvider.GetCurrentPosition();
                }
                else
                {
                    loc = currentFrameChain.GetDefaultContentScrollPosition();
                }

                loc = new Point((int)Math.Ceiling(loc.X * scaleRatio), (int)Math.Ceiling(loc.Y * scaleRatio));

                image = BasicImageUtils.Crop(image, new Rectangle(loc, viewportSize));
            }
            eyes_.DebugScreenshotProvider.Save(image, "SAFARI_CROPPED");

            return(image);
        }
        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);
        }
示例#5
0
        public override Bitmap GetImage()
        {
            logger_.Verbose("Getting current position...");
            Point  loc;
            double scaleRatio = eyes_.DevicePixelRatio;

            FrameChain        currentFrameChain = eyes_.GetDriver().GetFrameChain();
            IPositionProvider positionProvider  = null;

            if (currentFrameChain.Count == 0)
            {
                IWebElement scrollRootElement = eyes_.GetCurrentFrameScrollRootElement();
                positionProvider = SeleniumPositionProviderFactory.GetPositionProvider(logger_, StitchModes.Scroll, jsExecutor_, scrollRootElement, userAgent_);
                loc = positionProvider.GetCurrentPosition();
            }
            else
            {
                loc = currentFrameChain.GetDefaultContentScrollPosition();
            }
            Point scaledLoc = new Point((int)Math.Round(loc.X * scaleRatio), (int)Math.Round(loc.Y * scaleRatio));

            Bitmap        image  = base.GetImage();
            EyesWebDriver driver = eyes_.GetDriver();
            RectangleSize originalViewportSize = EyesSeleniumUtils.GetViewportSize(logger_, driver);
            RectangleSize viewportSize         = originalViewportSize.Scale(scaleRatio);

            if (image.Height > viewportSize.Height || image.Width > viewportSize.Width)
            {
                //Damn IE driver returns full page screenshot even when not asked to!
                logger_.Verbose("seems IE returned full page screenshot rather than only the viewport.");
                eyes_.DebugScreenshotProvider.Save(image, "IE");
                if (!eyes_.IsCutProviderExplicitlySet)
                {
                    image = BasicImageUtils.Crop(image, new Rectangle(scaledLoc, viewportSize));
                }
            }

            positionProvider?.SetPosition(loc);
            return(image);
        }