gecko-dev/browser/components/loop/test/visual-regression/screenshot

97 lines
3.5 KiB
Python
Executable file

#!/usr/bin/env python
from selenium import webdriver
from PIL import Image
from os import listdir
from os.path import isfile, join
import subprocess
import argparse
import re
from os import path
refs_location = path.join(path.dirname(__file__), "refs")
newscreenshots_location = path.join(path.dirname(__file__), "new")
diff_location = path.join(path.dirname(__file__), "diff")
ui_showcase_url = "http://localhost:3000/ui/"
def take_screenshots(dir_name):
fox = webdriver.Firefox()
# Open the UI Showcase
fox.get(ui_showcase_url)
# Find all component containers
elements = fox.find_elements_by_css_selector(".example")
regex = re.compile(r"[/\\(),':\-]")
for element in elements:
header = element.find_element_by_css_selector("h3")
component = element.find_element_by_css_selector(".comp iframe")
location = component.location
size = component.size
element_id = re.escape(re.sub(regex, '', header.get_attribute("id")))
title = path.join(dir_name, element_id + ".png")
print title
fox.save_screenshot(title) # saves screenshot of entire page
im = Image.open(title) # uses PIL library to open image in memory
left = location["x"]
top = location["y"]
right = location["x"] + size["width"]
bottom = location["y"] + size["height"]
im = im.crop((left, top, right, bottom)) # defines crop points
im.save(title) # saves new cropped image
fox.quit()
def diff_screenshots():
onlyfiles = [ f for f in listdir(refs_location)
if isfile(join(refs_location,f)) and f[-3:] == "png" ]
for f in onlyfiles:
print f
ref_file = path.join(refs_location, f)
new_file = path.join(newscreenshots_location, f)
diff_file = path.join(diff_location, f)
compare_cmd = "compare '" + ref_file + "' '" + new_file + \
"' '" + diff_file + "'"
join_cmd = "convert +append '" + ref_file + "' '" + diff_file + \
"' '" + new_file + "'" + " '" + diff_file + "_joined.png'"
remove_cmd = "rm " + diff_file
cmd = compare_cmd + " ; " + join_cmd + " ; " + remove_cmd
print cmd
subprocess.Popen(cmd, shell=True)
def cleanup(clean_location):
files = [ f for f in listdir(clean_location)
if isfile(join(clean_location,f)) and f[-3:] == "png" ]
for f in files:
remove_cmd = "rm " + re.escape(path.join(clean_location, f))
subprocess.Popen(remove_cmd, shell=True)
description = "Firefox Hello test for visual regressions. Run once before " + \
"making any changes with --refs to build the reference files " + \
"and once more with your patch applied using --diffs. If any " + \
"screenshots have changed they will show up in /test/diff."
parser = argparse.ArgumentParser(description=description)
parser.add_argument("-r", "--refs", action="store_true", help="Build the " +
"reference screenshots.")
parser.add_argument("-d", "--diffs", action="store_true", help="Compare " +
"your changes against the reference screenshots.")
parser.add_argument("-c", "--cleanup", action="store_true", help="Remove " +
"all files from /diff and /new folders but not the " +
"reference files")
args = parser.parse_args()
if args.refs:
take_screenshots(refs_location)
if args.diffs:
take_screenshots(newscreenshots_location)
diff_screenshots()
if args.cleanup:
cleanup(newscreenshots_location)
cleanup(diff_location)