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
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
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
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
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)
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
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
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