run-puppeteer.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. const puppeteer = require('puppeteer');
  2. const http = require('http');
  3. const ecstatic = require('ecstatic');
  4. const JasmineReporter = require('jasmine-terminal-reporter');
  5. const PORT = 7992;
  6. const DEFAULT_INACTIVITY_TIMEOUT = 10000;
  7. const [,, path] = process.argv;
  8. if (!path) {
  9. /* eslint-disable no-console */
  10. console.log('The `path` argument is missing.');
  11. return;
  12. }
  13. const cleanupFactory = (browser, server) => async(exitCode) => {
  14. await browser.close();
  15. await new Promise(resolve => server.close(resolve));
  16. process.exit(exitCode);
  17. };
  18. (async() => {
  19. const browser = await puppeteer.launch({
  20. timeout: DEFAULT_INACTIVITY_TIMEOUT,
  21. // devtools: true, // Turn it on to debug the tests.
  22. headless: false,
  23. // Puppeteer by default hide the scrollbars in headless mode (https://github.com/GoogleChrome/puppeteer/blob/master/lib/Launcher.js#L86).
  24. // To prevent this the custom arguments are provided.
  25. args: ['--no-sandbox', '--disable-setuid-sandbox', '--headless', '--disable-gpu', '--mute-audio'],
  26. });
  27. const page = await browser.newPage();
  28. page.setCacheEnabled(false);
  29. page.setViewport({
  30. width: 1200,
  31. height: 1000,
  32. });
  33. const server = http.createServer(ecstatic({
  34. root: `${__dirname}/../..`,
  35. showDir: true,
  36. autoIndex: true,
  37. }));
  38. const cleanup = cleanupFactory(browser, server);
  39. server.listen(PORT);
  40. const reporter = new JasmineReporter({
  41. colors: 1,
  42. cleanStack: 1,
  43. verbosity: 4,
  44. listStyle: 'flat',
  45. activity: true,
  46. isVerbose: false,
  47. });
  48. let errorCount = 0;
  49. await page.exposeFunction('jasmineStarted', specInfo => reporter.jasmineStarted(specInfo));
  50. await page.exposeFunction('jasmineSpecStarted', () => {});
  51. await page.exposeFunction('jasmineSuiteStarted', suite => reporter.suiteStarted(suite));
  52. await page.exposeFunction('jasmineSuiteDone', () => reporter.suiteDone());
  53. await page.exposeFunction('jasmineSpecDone', (result) => {
  54. if (result.failedExpectations.length) {
  55. errorCount += result.failedExpectations.length;
  56. }
  57. reporter.specDone(result);
  58. });
  59. await page.exposeFunction('jasmineDone', async() => {
  60. reporter.jasmineDone();
  61. await cleanup(errorCount === 0 ? 0 : 1);
  62. });
  63. page.on('pageerror', async(msg) => {
  64. /* eslint-disable no-console */
  65. console.log(msg);
  66. await cleanup(1);
  67. });
  68. try {
  69. await page.goto(`http://localhost:${PORT}/${path}`);
  70. } catch (error) {
  71. /* eslint-disable no-console */
  72. console.log(error);
  73. cleanup(1);
  74. }
  75. })();