Example #1
0
def get_updated_scroll_position(position_provider):
    # type: (SeleniumPositionProvider) -> Point
    try:
        sp = position_provider.get_current_position()
        if not sp:
            sp = Point.zero()
    except WebDriverException:
        sp = Point.zero()

    return sp
 def from_screenshot(cls, driver, image, screenshot_region):
     # type: (EyesWebDriver, Image.Image, Region) -> EyesWebDriverScreenshot
     return cls(
         driver,
         image,
         ScreenshotType.ENTIRE_FRAME,
         Point.zero(),
         frame_window=Region.from_location_size(
             Point.zero(), screenshot_region.size
         ),
         region_window=Region.from_(screenshot_region),
     )
 def get_updated_frame_location_in_screenshot(self, frame_location_in_screenshot):
     # type: (Point) -> Point
     if self.frame_chain.size > 0:
         frame_location_in_screenshot = calc_frame_location_in_screenshot(
             self._driver, self._frame_chain, self._screenshot_type
         )
     elif not frame_location_in_screenshot:
         frame_location_in_screenshot = Point.zero()
     return frame_location_in_screenshot
 def create_viewport(cls, driver, image):
     # type: (EyesWebDriver, Image.Image) -> EyesWebDriverScreenshot
     instance = cls(driver, image, ScreenshotType.VIEWPORT, Point.zero())
     instance._validate_frame_window()
     return instance
    def get_stitched_region(self, region, full_area, position_provider):
        # type: (Region, Optional[Region], Optional[PositionProvider]) -> Image.Image
        argument_guard.not_none(region)
        argument_guard.not_none(position_provider)

        logger.info("get_stitched_region()")
        logger.info("PositionProvider: %s ; Region: %s" %
                    (position_provider, region))

        with self.origin_provider:
            self.origin_provider.set_position(
                Point.zero())  # first scroll to 0,0 so CSS stitching works.

            # Saving the original position (in case we were already in the outermost frame).
            with position_provider:
                logger.info("Getting top/left image...")
                image = self.image_provider.get_image()
                self.debug_screenshot_provider.save(
                    image, self._debug_msg("original"))
                pixel_ratio = self._get_pixel_ratio(image)
                scaled_cut_provider = self.cut_provider.scale(pixel_ratio)
                image = self._cut_if_needed(image, scaled_cut_provider)
                region_in_screenshot = self._get_region_in_screenshot(
                    region, image, pixel_ratio)
                image = self._crop_if_needed(image, region_in_screenshot)
                image = self._scale_if_needed(image, pixel_ratio)
                if full_area is None or full_area.is_empty:
                    entire_size = self._get_entire_size(
                        image, position_provider)
                    # Notice that this might still happen even if we used
                    # "get_image_part", since "entire_page_size" might be that of a
                    # frame
                    if (image.width >= entire_size.width
                            and image.height >= entire_size.height):
                        return image

                    full_area = Region.from_location_size(
                        Point.zero(), entire_size)

                image_parts = self._get_image_parts(full_area, image)

                stitched_image = self._create_stitched_image(full_area, image)
                # These will be used for storing the actual stitched size (it is
                # sometimes less than the size extracted via "get_entire_size").
                last_successful_location = Point.zero()
                last_successful_part_size = RectangleSize.from_(image)

                # Take screenshot and stitch for each screenshot part
                logger.debug("Getting the rest of the image parts...")
                part_image = None
                for part_region in image_parts:
                    logger.debug("Taking screenshot for %s" % part_region)

                    # Scroll to the part's top/left
                    origin_position = position_provider.set_position(
                        part_region.location)
                    target_position = origin_position.offset(
                        -full_area.left, -full_area.top)
                    logger.debug("Origin Position is set to %s" %
                                 origin_position)
                    logger.debug("Target Position is %s" % target_position)

                    # Actually taking the screenshot.
                    logger.debug("Getting image...")
                    part_image = self.image_provider.get_image()
                    self.debug_screenshot_provider.save(
                        part_image,
                        self._debug_msg("original-scrolled-{}".format(
                            position_provider.get_current_position())),
                    )
                    part_image = self._cut_if_needed(part_image,
                                                     scaled_cut_provider)
                    part_image = self._crop_if_needed(part_image,
                                                      region_in_screenshot)
                    part_image = self._scale_if_needed(part_image, pixel_ratio)

                    # Stitching the current part.
                    stitched_image.paste(part_image,
                                         box=(target_position.x,
                                              target_position.y))
                    last_successful_location = origin_position

                if part_image:
                    last_successful_part_size = RectangleSize.from_(part_image)

            logger.info("Stitching done!")
        # If the actual image size is smaller than the extracted size, we crop the image.
        stitched_image = self._crop_if_smaller(
            full_area,
            last_successful_location,
            last_successful_part_size,
            stitched_image,
        )

        self.debug_screenshot_provider.save(stitched_image,
                                            self._debug_msg("stitched"))
        return stitched_image