コード例 #1
0
    def _stitch_screenshot(
            self,
            original_stitch_state,  # type: PositionMemento
            stitch_provider,  # type: PositionProvider
            screenshot_parts,  # type: List[SubregionForStitching]
            stitched_image,  # type: Image.Image
            scale_ratio,  # type: float
            scaled_cut_provider,  # type: CutProvider
    ):
        # type: (...) -> Image
        logger.info("enter: scale_ratio {}".format(scale_ratio))
        for part_region in screenshot_parts:
            logger.debug("Part: {}".format(part_region))
            # Scroll to the part's top/left
            part_region_location = part_region.scroll_to.offset(
                original_stitch_state.position)
            origin_position = stitch_provider.set_position(
                part_region_location)

            target_position = part_region.paste_physical_location.offset(
                part_region_location - origin_position)

            # Actually taking the screenshot.
            datetime_utils.sleep(self.wait_before_screenshots)
            part_image = self.image_provider.get_image()
            self.debug_screenshot_provider.save(part_image,
                                                self._debug_msg("part_image"))

            cut_part = scaled_cut_provider.cut(part_image)
            self.debug_screenshot_provider.save(cut_part,
                                                self._debug_msg("cut_part"))

            r = part_region.physical_crop_area
            if not r.is_size_empty:
                cropped_part = image_utils.crop_image(cut_part, r)
            else:
                cropped_part = cut_part
            self.debug_screenshot_provider.save(
                cropped_part, self._debug_msg("cropped_part"))
            scaled_part_image = image_utils.scale_image(
                cropped_part, scale_ratio)
            self.debug_screenshot_provider.save(
                scaled_part_image, self._debug_msg("scaled_part_image"))

            r2 = part_region.logical_crop_area
            scaled_cropped_part_image = image_utils.crop_image(
                scaled_part_image, r2)
            self.debug_screenshot_provider.save(
                scaled_cropped_part_image,
                self._debug_msg("scaled_cropped_part_image"))

            logger.debug("pasting part at {}".format(target_position))

            stitched_image.paste(scaled_cropped_part_image,
                                 box=(target_position.x, target_position.y))
            self.debug_screenshot_provider.save(
                stitched_image, self._debug_msg("stitched_image"))
        return stitched_image
コード例 #2
0
    def get_image(self):
        image = TakesScreenshotImageProvider(self._eyes).get_image()

        if self._eyes.is_cut_provider_explicitly_set:
            return image

        logger.info("physical device pixel size",
                    width=image.width,
                    height=image.height)

        viewport_location = device_viewport_location(self._eyes.driver)
        if viewport_location:
            original_viewport_size = self._eyes._get_viewport_size()
            viewport_size = original_viewport_size.scale(
                self._eyes.device_pixel_ratio)
            crop_region = Region(
                viewport_location.x,
                viewport_location.y,
                viewport_size.width,
                viewport_size.height,
            )
            logger.info("calculated viewport region",
                        viewport_region=crop_region)
            image = image_utils.crop_image(image, crop_region)
        else:
            if self._devices_regions is None:
                self.init_device_regions_table()
            original_viewport_size = RectangleSize.from_(
                self._eyes.scroll_root_element.size_and_borders.size)
            device_data = DeviceData(
                image.width,
                image.height,
                original_viewport_size.width,
                original_viewport_size.height,
            )
            if device_data in self._devices_regions:
                logger.debug("device model found in hash table")
                crop_by_version = self._devices_regions.get(device_data)
                if (crop_by_version.major_version <=
                        self._useragent.browser_major_version):
                    image = image_utils.crop_image(image,
                                                   crop_by_version.region)
                else:
                    logger.debug(
                        "device version not found in list. returning original image."
                    )
            else:
                logger.debug(
                    "device not found in list. returning original image.")

        return image
コード例 #3
0
    def get_image(self):
        image = TakesScreenshotImageProvider(self._eyes).get_image()
        self._eyes.debug_screenshot_provider.save(image, "SAFARI")

        if self._eyes.is_cut_provider_explicitly_set:
            return image

        scale_ratio = self._eyes.device_pixel_ratio
        original_viewport_size = self._eyes._get_viewport_size()
        viewport_size = original_viewport_size.scale(scale_ratio)

        logger.info("logical viewport size: {}".format(original_viewport_size))

        if self._useragent.os == OSNames.IOS:
            if self._devices_regions is None:
                self.init_device_regions_table()

            logger.info("physical device pixel size: {} x {}".format(
                image.width, image.height))

            device_delta = DeviceData(
                image.width,
                image.height,
                original_viewport_size.width,
                original_viewport_size.height,
                self._useragent.browser_major_version,
            )
            if device_delta in self._devices_regions:
                logger.debug("device model found in hash table")
                crop = self._devices_regions.get(device_delta)
                image = image_utils.crop_image(image, crop)
            else:
                logger.debug(
                    "device not found in list. returning original image.")
        elif not self._eyes.configuration.force_full_page_screenshot:
            current_frame_chain = self._eyes.driver.frame_chain  # type: FrameChain

            if len(current_frame_chain) == 0:
                position_provider = ScrollPositionProvider(
                    self._eyes.driver,
                    self._eyes.driver.find_element_by_tag_name("html"),
                )
                loc = position_provider.get_current_position()
            else:
                loc = current_frame_chain.default_content_scroll_position

            loc = loc.scale(scale_ratio)
            image = image_utils.crop_image(
                image, Region.from_location_size(loc, viewport_size))
        return image
コード例 #4
0
    def get_image(self):
        image = TakesScreenshotImageProvider(self._eyes).get_image()

        if self._eyes.is_cut_provider_explicitly_set:
            return image

        scale_ratio = self._eyes.device_pixel_ratio
        original_viewport_size = self._eyes._get_viewport_size()
        viewport_size = original_viewport_size.scale(scale_ratio)

        logger.info("logical viewport size: {}".format(original_viewport_size))

        force_full_page_screenshot = self._eyes.configure.force_full_page_screenshot
        if force_full_page_screenshot is not None:
            if not force_full_page_screenshot:
                current_frame_chain = self._eyes.driver.frame_chain  # type: FrameChain

                if len(current_frame_chain) == 0:
                    position_provider = ScrollPositionProvider(
                        self._eyes.driver,
                        self._eyes.driver.find_element_by_tag_name("html"),
                    )
                    loc = position_provider.get_current_position()
                else:
                    loc = current_frame_chain.default_content_scroll_position

                loc = loc.scale(scale_ratio)
                image = image_utils.crop_image(
                    image, Region.from_(loc, viewport_size))
        return image
コード例 #5
0
    def cut(self, image):
        # type: (Image) -> Image
        if self.header == 0 and self.footer == 0 and self.right == 0 and self.left == 0:
            return image

        target_region = Region(
            self.left,
            self.header,
            image.width - self.left - self.right,
            image.height - self.header - self.footer,
        )
        return image_utils.crop_image(image, target_region)
コード例 #6
0
def cut_to_viewport_size_if_required(driver, image):
    # type: (EyesWebDriver, Image) -> Image
    # Some browsers return always full page screenshot (IE).
    # So we cut such images to viewport size
    position_provider = get_cur_position_provider(driver)
    curr_frame_scroll = get_updated_scroll_position(position_provider)
    screenshot_type = update_screenshot_type(None, image, driver)
    if screenshot_type != ScreenshotType.VIEWPORT:
        viewport_size = driver.eyes.viewport_size
        image = image_utils.crop_image(
            image,
            region_to_crop=Region(
                top=curr_frame_scroll.x,
                left=0,
                height=viewport_size["height"],
                width=viewport_size["width"],
            ),
        )
    return image
コード例 #7
0
    def get_image(self):
        image = TakesScreenshotImageProvider(self._eyes).get_image()

        if self._eyes.is_cut_provider_explicitly_set:
            return image

        # original_viewport_size = self._eyes._get_viewport_size()
        # FIXME: huck to get correct viewport size on mobile
        original_viewport_size = RectangleSize.from_(
            self._eyes.scroll_root_element.size_and_borders.size
        )
        logger.info("logical viewport size: {}".format(original_viewport_size))

        if self._devices_regions is None:
            self.init_device_regions_table()

        logger.info(
            "physical device pixel size: {} x {}".format(image.width, image.height)
        )

        device_data = DeviceData(
            image.width,
            image.height,
            original_viewport_size.width,
            original_viewport_size.height,
        )
        if device_data in self._devices_regions:
            logger.debug("device model found in hash table")
            crop_by_version = self._devices_regions.get(device_data)
            if crop_by_version.major_version <= self._useragent.browser_major_version:
                image = image_utils.crop_image(image, crop_by_version.region)
            else:
                logger.debug(
                    "device version not found in list. returning original image."
                )
        else:
            logger.debug("device not found in list. returning original image.")
        return image
コード例 #8
0
def cut_to_viewport_size_if_required(driver, image):
    # type: (EyesWebDriver, Image) -> Image
    # Some browsers return always full page screenshot (IE).
    # So we cut such images to viewport size

    cur_position = driver.eyes._original_scroll_position
    if cur_position:
        top = cur_position.y
    else:
        top = 0

    screenshot_type = update_screenshot_type(None, image, driver)
    if screenshot_type != ScreenshotType.VIEWPORT:
        viewport_size = driver.eyes.configure.viewport_size
        image = image_utils.crop_image(
            image,
            region_to_crop=Region(
                top=top,
                left=0,
                height=viewport_size["height"],
                width=viewport_size["width"],
            ),
        )
    return image