File size: 3,115 Bytes
197f2a5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import { chromium } from 'playwright';
import { mkdir } from 'fs/promises';

const URL = 'http://localhost:4321/?viz=true';
const OUTPUT_DIR = './test-screenshots';
const DEVICE_SCALE_FACTOR = 2;
const MAX_EMBEDS = 5;

async function main() {
  await mkdir(OUTPUT_DIR, { recursive: true });

  console.log('๐Ÿš€ Launching browser...');
  const browser = await chromium.launch({ headless: false });
  const context = await browser.newContext({
    deviceScaleFactor: DEVICE_SCALE_FACTOR,
    viewport: { width: 1200, height: 800 }
  });
  const page = await context.newPage();

  console.log(`๐Ÿ“„ Navigating to ${URL}...`);
  await page.goto(URL, { waitUntil: 'domcontentloaded', timeout: 60000 });
  await page.waitForTimeout(3000);

  const embeds = await page.locator('.html-embed:has(select)').all();
  console.log(`\n๐Ÿ” Found ${embeds.length} embeds with <select>`);

  const targets = embeds.slice(0, MAX_EMBEDS);
  for (let i = 0; i < targets.length; i++) {
    const embed = targets[i];

    if (!(await embed.isVisible())) {
      console.log(`  โญ๏ธ  Skipping hidden embed ${i + 1}`);
      continue;
    }

    const baseName = `htmlembed-select-${i + 1}`;
    const closedPath = `${OUTPUT_DIR}/${baseName}.png`;
    const openPath = `${OUTPUT_DIR}/${baseName}--open.png`;

    try {
      await embed.scrollIntoViewIfNeeded();
      await page.waitForTimeout(100);

      await embed.screenshot({ path: closedPath, type: 'png' });
      console.log(`  โœ… ${baseName}.png`);

      const select = embed.locator('select').first();
      await select.evaluate((el) => {
        el.dataset.__prevSize = el.getAttribute('size') ?? '';
        el.dataset.__prevStyle = el.getAttribute('style') ?? '';
        el.dataset.__prevMultiple = el.multiple ? '1' : '0';

        const optionCount = el.querySelectorAll('option').length;
        const size = Math.min(optionCount || 1, 8);

        el.setAttribute('size', String(size));
        el.multiple = true;
        el.style.position = 'relative';
        el.style.zIndex = '9999';
        el.style.height = 'auto';
        el.style.maxHeight = 'none';
        el.style.background = 'white';
      });
      await page.waitForTimeout(150);

      await embed.screenshot({ path: openPath, type: 'png' });
      console.log(`  โœ… ${baseName}--open.png`);

      await select.evaluate((el) => {
        const prevSize = el.dataset.__prevSize;
        const prevStyle = el.dataset.__prevStyle;
        const prevMultiple = el.dataset.__prevMultiple;

        if (prevSize) {
          el.setAttribute('size', prevSize);
        } else {
          el.removeAttribute('size');
        }
        el.multiple = prevMultiple === '1';
        el.setAttribute('style', prevStyle || '');

        delete el.dataset.__prevSize;
        delete el.dataset.__prevStyle;
        delete el.dataset.__prevMultiple;
      });
      await page.waitForTimeout(100);
    } catch (err) {
      console.log(`  โŒ Failed for embed ${i + 1}: ${err.message}`);
    }
  }

  await browser.close();
  console.log(`\n๐ŸŽ‰ Done! Check ${OUTPUT_DIR}/`);
}

main().catch(console.error);