def _take_and_transfer_screenshot(self, renderer, imageName, screenshotNumber, testClassName, testRunName, displayNumber, useSystemCompositorForScreenshot, minWidth, minHeight): splittedImageName = os.path.splitext(imageName) localScreenshotName = "{}_{}_{}{}".format(splittedImageName[0], screenshotNumber, self.name, splittedImageName[1]) targetScreenshotName = "{}{}_{:04d}_{}".format(self.fixed_screenshot_prefix, self.unique_screenshot_prefix, self.target_screenshot_counter, localScreenshotName) self.target_screenshot_counter += 1 # trigger screenshot(s) if useSystemCompositorForScreenshot: self._take_system_compositor_screenshot(targetScreenshotName, renderer) else: self._take_renderer_screenshot(targetScreenshotName, renderer, displayNumber) resultDirForTest = helper.get_result_dir_subdirectory(self.resultDir, testClassName+"/"+testRunName) self._transfer_screenshots(targetScreenshotName, self.tmpDir, resultDirForTest) localScreenshotFile = os.path.join(resultDirForTest, localScreenshotName) log.info("Store remote {} as local {}".format(targetScreenshotName, localScreenshotFile)) os.rename(os.path.join(resultDirForTest, targetScreenshotName), localScreenshotFile) #check image size pilImage = Image.open(localScreenshotFile) if (pilImage.size[0] < minWidth) or (pilImage.size[1] < minHeight): log.errorAndAssert("Screenshot too small: expected >= {}x{}, got {}x{}".format(minWidth, minHeight, pilImage.size[0], pilImage.size[1])) return localScreenshotFile
def _take_and_transfer_screenshot(self, renderer, imageName, testClassName, testRunName, displayNumber, useSystemCompositorForScreenshot, minWidth, minHeight): splittedImageName = os.path.splitext( imageName) # split into image name and extension extendedImageNameBase = splittedImageName[ 0] + '_' + self.name # extend name with target name to make unique # Add wildcard, because the system compositor outputs multiple screenshots. One for each screen, that has the suffix "_<number>". screenshotNamePattern = extendedImageNameBase + "*.*" #delete old screenshot files on target if existing self._delete_files_on_target(screenshotNamePattern, self.tmpDir) # trigger screenshot(s) if useSystemCompositorForScreenshot: self._take_system_compositor_screenshot( extendedImageNameBase + ".png", renderer) else: self._take_renderer_screenshot(extendedImageNameBase + ".bmp", renderer, displayNumber) resultDirForTest = helper.get_result_dir_subdirectory( self.resultDir, testClassName + "/" + testRunName) self._transfer_screenshots(screenshotNamePattern, self.tmpDir, resultDirForTest) # delete screenshots on target (disk space is precious these days) self._delete_files_on_target(screenshotNamePattern, self.tmpDir) #search for suitable screenshot suitableScreenshotFound = False screenShotFiles = glob.glob( os.path.normcase(resultDirForTest + '/' + screenshotNamePattern)) folderForUnusedPath = helper.get_result_dir_subdirectory( resultDirForTest, 'unused_screenshots') if len(screenShotFiles) == 0: log.errorAndAssert("No screenshot files found") for f in screenShotFiles: if not suitableScreenshotFound: #check image size pilImage = Image.open(f) if (pilImage.size[0] >= minWidth) and (pilImage.size[1] >= minHeight): suitableScreenshotFound = True returnFile = f else: #too small, move to unused folder log.info( "Screenshot too small: expected >= {}x{}, got {}x{}". format(minWidth, minHeight, pilImage.size[0], pilImage.size[1])) os.rename( f, os.path.join(folderForUnusedPath, os.path.basename(f))) else: #suitable file already found, move others to unused foler os.rename( f, os.path.join(folderForUnusedPath, os.path.basename(f))) if not suitableScreenshotFound: log.errorAndAssert("No suitable screenshot found") return returnFile