Como capturar automaticamente screenshots de diffs visuais da biblioteca KiCad

  1. Baixe o arquivo de artefatos de diff visual do job de CI relevante.
  2. Descompacte o arquivo.
  3. Execute o seguinte script Python no diretório descompactado:
screenshot_visual_diff.sh
python ScreenshotVisualDiff.py diffs
ScreenshotVisualDiff.py
#!/usr/bin/env python3
# Encontra arquivos HTML no diretório "diffs" recursivamente
import os
import asyncio
from pyppeteer import launch
from urllib.parse import quote
from tqdm import tqdm

import argparse

parser = argparse.ArgumentParser(description='Screenshot Visual Diff')
parser.add_argument('diffs_dir', type=str, help='Diretório contendo os HTMLs de diff visual. Basta baixar e descompactar os artefatos.')
args = parser.parse_args()

def find_diff_html_files(directory):
    html_files = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.endswith('.html') and not "index.html" in file:
                html_files.append(os.path.join(root, file))
    return html_files

diff_files = find_diff_html_files(args.diffs_dir)

async def screenshot_file(diff_file):
    browser = await launch({
        "defaultViewport": {"width": 1920, "height": 1080}
    })
    page = await browser.newPage()
    # Abrir arquivo
    encoded_diff_file = quote(diff_file)
    url = f"file://{os.path.abspath(encoded_diff_file)}#visual-diff"
    await page.goto(url)
    # Capturar screenshot
    await page.screenshot({'path': diff_file.replace(".html", ".png")})
    # Limpeza
    await browser.close()

# Verificar se um event loop já está em execução

def get_or_create_eventloop():
    try:
        return asyncio.get_event_loop()
    except RuntimeError as ex:
        if "There is no current event loop in thread" in str(ex):
            loop = asyncio.new_event_loop()
            asyncio.set_event_loop(loop)
            return asyncio.get_event_loop()
        else:
            raise ex


async def run():
    loop = get_or_create_eventloop()
    for diff_file in tqdm(diff_files, desc="Processing files"):
        tqdm.write(f"Processing: {diff_file}")
        future = loop.create_task(screenshot_file(diff_file))
        await future

asyncio.run(run())

Check out similar posts by category: KiCAD Pyppeteer Python