github.com/Ilhicas/nomad@v1.0.4-0.20210304152020-e86851182bc3/scripts/screenshots/src/index.js (about) 1 const puppeteer = require("puppeteer"); 2 const { 3 capture, 4 wait, 5 error, 6 click, 7 clickJob, 8 clickTab, 9 clickMainMenu, 10 clickX 11 } = require("./utils"); 12 13 const HOST = process.env.EMBER_HOST || "http://localhost:4200"; 14 console.log(`Using host ${HOST}...`); 15 16 const ANSI_YELLOW = "\x1b[33m%s\x1b[0m"; 17 18 (async () => { 19 const startTime = Date.now(); 20 console.log("Preparing puppeteer..."); 21 22 // Create a new browser and tab 23 const browser = await puppeteer.launch({ 24 // Docker related chrome flags 25 args: [ 26 "--no-sandbox", 27 "--disable-setuid-sandbox", 28 "--disable-dev-shm-usage", 29 "--remote-debugging-port=9222", 30 ] 31 }); 32 const page = await browser.newPage(); 33 34 // Make sure the page is 4K is high-dpi scaling 35 page.setViewport({ width: 1440, height: 900, deviceScaleFactor: 2 }); 36 console.log("Loading Nomad UI..."); 37 console.log( 38 ANSI_YELLOW, 39 "\n!! Make sure to use the everyFeature Mirage scenario !!\n" 40 ); 41 42 try { 43 await page.goto(`${HOST}/ui/`); 44 } catch (err) { 45 await error( 46 browser, 47 "Could not load the Nomad UI. Is the Ember server running?" 48 ); 49 } 50 51 // Give Mirage a chance to settle 52 console.log("Waiting for Mirage..."); 53 await wait(5000); 54 console.log("Starting capture sequence!\n"); 55 56 // DEBUG: log the URL on all navigations 57 monitorURL(page); 58 59 await capture(page, "jobs-list"); 60 61 await clickJob(page, "service"); 62 await capture(page, "job-detail-service"); 63 await page.goBack(); 64 65 await clickJob(page, "batch"); 66 await capture(page, "job-detail-batch"); 67 await page.goBack(); 68 69 await clickJob(page, "system"); 70 await capture(page, "job-detail-system"); 71 await page.goBack(); 72 73 await clickJob(page, "periodic"); 74 await capture(page, "job-detail-periodic"); 75 await click(page, "tr.job-row"); 76 await capture(page, "job-detail-periodic-child"); 77 await page.goBack(); 78 await page.goBack(); 79 80 await clickJob(page, "parameterized"); 81 await capture(page, "job-detail-parameterized"); 82 await click(page, "tr.job-row"); 83 await capture(page, "job-detail-parameterized-child"); 84 await page.goBack(); 85 await page.goBack(); 86 87 await clickJob(page, "service"); 88 89 await clickTab(page, "Definition"); 90 await capture(page, "job-detail-tab-definition"); 91 await page.click(".boxed-section .button.is-light.is-compact.pull-right"); 92 await capture(page, "job-detail-tab-definition-editing"); 93 94 await clickTab(page, "Versions"); 95 await capture(page, "job-detail-tab-versions"); 96 await page.click(".timeline-object .button.is-light.is-compact.pull-right"); 97 await capture(page, "job-detail-tab-versions-expanded"); 98 99 await clickTab(page, "Deployments"); 100 await capture(page, "job-detail-tab-deployments"); 101 await page.click(".timeline-object .button.is-light.is-compact.pull-right"); 102 await capture(page, "job-detail-tab-deployments-expanded"); 103 104 await clickTab(page, "Allocations"); 105 await capture(page, "job-detail-tab-allocations"); 106 107 await clickTab(page, "Evaluations"); 108 await capture(page, "job-detail-tab-evaluations"); 109 110 await clickMainMenu(page, "Jobs"); 111 await page.click(".toolbar-item .button.is-primary"); 112 await capture(page, "job-run-empty"); 113 // Fill in the code editor somehow 114 // Capture the plan stage 115 116 await clickMainMenu(page, "Jobs"); 117 await clickJob(page, "service"); 118 await click(page, ".task-group-row"); 119 await capture(page, "task-group"); 120 121 await clickMainMenu(page, "Jobs"); 122 await clickJob(page, "service"); 123 124 const allocCount = await page.$$eval(".allocation-row", s => s.length); 125 for (let i = 1; i <= allocCount; i++) { 126 await click(page, `.allocation-row:nth-of-type(${i}) a.is-primary`); 127 await capture(page, `allocation-${i}`); 128 await page.goBack(); 129 await wait(2000); 130 } 131 132 await click(page, ".allocation-row a.is-primary"); 133 await click(page, ".task-row"); 134 await capture(page, "task-detail"); 135 136 await clickTab(page, "Logs"); 137 await capture(page, "task-logs"); 138 139 await clickMainMenu(page, "Clients"); 140 await capture(page, "clients-list"); 141 142 const clientCount = await page.$$eval(".client-node-row", s => s.length); 143 for (let i = 1; i <= clientCount; i++) { 144 await click(page, `.client-node-row:nth-of-type(${i})`); 145 await capture(page, `client-detail-${i}`); 146 await page.goBack(); 147 await wait(500); 148 } 149 150 await clickMainMenu(page, "Servers"); 151 await capture(page, "servers-list"); 152 153 await click(page, `.server-agent-row:nth-of-type(2)`); 154 await capture(page, "server-detail"); 155 156 await clickX(page, '//a[contains(text(), "ACL Tokens")]'); 157 await capture(page, "acl-tokens"); 158 159 console.log(`All done! ${humanDuration(Date.now() - startTime)}`); 160 process.exit(); 161 })(); 162 163 async function* watchURL(page) { 164 while (true) { 165 await page.waitForNavigation(); 166 yield page.url(); 167 } 168 } 169 170 async function monitorURL(page) { 171 for await (let url of watchURL(page)) { 172 console.log(`=> ${url}`); 173 } 174 } 175 176 function humanDuration(duration) { 177 const ms = duration % 1000; 178 const s = Math.floor((duration / 1000) % 60); 179 const m = Math.floor(duration / 1000 / 60); 180 181 const fs = s < 10 ? `0${s}` : `${s}`; 182 const fms = ms < 10 ? `00${ms}` : ms < 100 ? `0${ms}` : `${ms}`; 183 184 if (m) return `${m}m ${fs}s ${fms}ms`; 185 else if (s) return `${fs}s ${fms}ms`; 186 return `${fms}ms`; 187 }