Nessuna descrizione

selenium-test.js 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. const { Builder, By, until } = require('selenium-webdriver');
  2. const chrome = require('selenium-webdriver/chrome');
  3. const fs = require('fs');
  4. const path = require('path');
  5. console.log('Starting Selenium script for testing pages...');
  6. (async () => {
  7. const userDataDir = path.join(__dirname, 'chrome-user-data', `${Date.now()}-${Math.random().toString(36).substring(2, 8)}`);
  8. fs.mkdirSync(userDataDir, { recursive: true });
  9. let options = new chrome.Options();
  10. options.addArguments('--no-sandbox');
  11. options.addArguments('--headless');
  12. let driver = await new Builder()
  13. .forBrowser('chrome')
  14. .setChromeOptions(options)
  15. .build();
  16. const SuccessfullyLoadedPath = [];
  17. const FailedToLoadPath = [];
  18. try {
  19. await driver.manage().window().setRect({ width: 1600, height: 1200 });
  20. await driver.manage().window().maximize()
  21. await driver.manage().setTimeouts({ implicit: 15000 });
  22. const frontendURL = process.argv[2];
  23. const routes = process.argv.slice(3);
  24. console.log('Frontend URL:', frontendURL);
  25. const isCloud = frontendURL === 'http://localhost:3002' || frontendURL === 'https://sandbox.shuffler.io' || frontendURL === 'https://shuffler.io';
  26. if (isCloud) {
  27. // Login Credentials
  28. const LOGIN_URL = `${frontendURL}/login`;
  29. // put your login credentials here
  30. const USERNAME = '';
  31. const PASSWORD = '';
  32. console.log('Logging in...');
  33. await driver.get(LOGIN_URL);
  34. try {
  35. await driver.wait(until.elementLocated(By.css('#emailfield')), 10000);
  36. await driver.findElement(By.css('#emailfield')).sendKeys(USERNAME);
  37. await driver.wait(until.elementLocated(By.css('#outlined-password-input')), 10000);
  38. await driver.findElement(By.css('#outlined-password-input')).sendKeys(PASSWORD);
  39. await driver.wait(until.elementLocated(By.css('#loginButton')), 10000);
  40. await driver.findElement(By.css('#loginButton')).click();
  41. // Ensure login success by checking URL change
  42. await driver.wait(async () => {
  43. const url = await driver.getCurrentUrl();
  44. return url.includes('welcome');
  45. }, 20000);
  46. console.log('Successfully logged in!');
  47. } catch (error) {
  48. console.error('Login failed:', error.message);
  49. FailedToLoadPath.push(LOGIN_URL);
  50. await driver.quit();
  51. process.exit(1);
  52. }
  53. }else {
  54. // Steps for onprem testing
  55. // 1. Login
  56. // 2. Create new workflow
  57. // Write your own login credentials here if you are testing onprem locally
  58. const USERNAME = 'demo@demo.io';
  59. const PASSWORD = 'supercoolpassword';
  60. const WORKFLOW_URL = `${frontendURL}/workflows`;
  61. try {
  62. // Login
  63. console.log('Logging in...');
  64. await driver.get(`${frontendURL}/login`);
  65. await driver.wait(until.elementLocated(By.css('#emailfield')), 10000);
  66. await driver.findElement(By.css('#emailfield')).sendKeys(USERNAME);
  67. await driver.wait(until.elementLocated(By.css('#outlined-password-input')), 10000);
  68. await driver.findElement(By.css('#outlined-password-input')).sendKeys(PASSWORD);
  69. const loginButton = await driver.findElement(By.css('#loginButton'));
  70. await driver.executeScript("arguments[0].scrollIntoView(true);", loginButton);
  71. await loginButton.click();
  72. // Ensure signup success by checking URL change
  73. await driver.wait(async () => {
  74. const url = await driver.getCurrentUrl();
  75. return url.includes('welcome') || url.includes('workflows');
  76. }, 20000);
  77. const isParentPresent = await driver.wait(async () => {
  78. return await driver.executeScript(
  79. "return document.querySelector('.parent-component') !== null;"
  80. );
  81. }, 5000).catch(() => false);
  82. if (!isParentPresent) {
  83. const logs = await driver.manage().logs().get('browser');
  84. const severeErrors = logs.filter(log => log.level.name === 'SEVERE');
  85. if (severeErrors.length > 0) {
  86. const crashCausingErrors = severeErrors.filter(err => {
  87. return !err.message.includes('Warning:') &&
  88. !err.message.includes('MUI:')
  89. });
  90. console.error(`Page (${frontendURL}/login) did not load correctly:`, crashCausingErrors);
  91. FailedToLoadPath.push(`${frontendURL}/login`);
  92. }
  93. }
  94. console.log('Successfully logged in!');
  95. } catch (error) {
  96. console.error('Failed to login:', error.message);
  97. FailedToLoadPath.push(WORKFLOW_URL);
  98. await driver.quit();
  99. process.exit(1);
  100. }
  101. try {
  102. // Create new workflow
  103. console.log('Creating new workflow...');
  104. await driver.get(WORKFLOW_URL);
  105. await driver.sleep(1000);
  106. await driver.wait(until.elementLocated(By.css('#create_workflow_button')), 10000);
  107. const create_workflow_button = await driver.findElement(By.css('#create_workflow_button'));
  108. await driver.sleep(1000);
  109. await create_workflow_button.click();
  110. await driver.sleep(1500);
  111. await driver.wait(until.elementLocated(By.css('#Enter-Workflow-Name')), 10000);
  112. const enter_workflow_name_field = await driver.findElement(By.css('#Enter-Workflow-Name'));
  113. await driver.sleep(1000);
  114. await enter_workflow_name_field.sendKeys("Test Workflow");
  115. // Wait before saving
  116. await driver.sleep(1500);
  117. await driver.wait(until.elementLocated(By.css('#save_workflow_button')), 10000);
  118. const save_workflow_button = await driver.findElement(By.css('#save_workflow_button'));
  119. await driver.sleep(1000); // Delay before clicking
  120. await save_workflow_button.click();
  121. // Wait for the parent component to appear
  122. await driver.sleep(2000);
  123. const isParentPresent = await driver.wait(async () => {
  124. return await driver.executeScript(
  125. "return document.querySelector('.parent-component') !== null;"
  126. );
  127. }, 5000).catch(() => false);
  128. if (!isParentPresent) {
  129. const logs = await driver.manage().logs().get('browser');
  130. const severeErrors = logs.filter(log => log.level.name === 'SEVERE');
  131. if (severeErrors.length > 0) {
  132. const crashCausingErrors = severeErrors.filter(err => {
  133. return !err.message.includes('Warning:') &&
  134. !err.message.includes('MUI:');
  135. });
  136. console.error(`Page (${WORKFLOW_URL}) did not load correctly:`, crashCausingErrors);
  137. FailedToLoadPath.push(`${WORKFLOW_URL}`);
  138. }
  139. }
  140. } catch (error) {
  141. console.error('Failed to create new workflow:', error.message);
  142. FailedToLoadPath.push(WORKFLOW_URL);
  143. await driver.quit();
  144. process.exit(1);
  145. }
  146. }
  147. // Get routes from command line arguments
  148. if (routes.length === 0) {
  149. console.error('No routes found to test.');
  150. await driver.quit();
  151. process.exit(1);
  152. }
  153. console.log(`Found ${routes.length} routes to test.`);
  154. for (const route of routes) {
  155. const url = `${frontendURL}/${route}`;
  156. console.log(`Testing route: ${url}`);
  157. try {
  158. await driver.get(url);
  159. await driver.sleep(3000);
  160. // Wait for document readiness
  161. await driver.wait(async () => {
  162. return await driver.executeScript('return document.readyState') === 'complete';
  163. }, 10000);
  164. const isParentPresent = await driver.wait(async () => {
  165. return await driver.executeScript(
  166. "return document.querySelector('.parent-component') !== null;"
  167. );
  168. }, 5000).catch(() => false);
  169. if (!isParentPresent) {
  170. const logs = await driver.manage().logs().get('browser');
  171. const severeErrors = logs.filter(log => log.level.name === 'SEVERE');
  172. if (severeErrors.length > 0) {
  173. const crashCausingErrors = severeErrors.filter(err => {
  174. return !err.message.includes('Warning:') &&
  175. !err.message.includes('MUI:')
  176. });
  177. console.error(`Page (${url}) did not load correctly:`, crashCausingErrors);
  178. FailedToLoadPath.push(url);
  179. }
  180. continue;
  181. }
  182. console.log(`Successfully loaded: ${url}`);
  183. SuccessfullyLoadedPath.push(url);
  184. } catch (error) {
  185. console.error(`Failed to load ${url}:`, error.message);
  186. }
  187. }
  188. } finally {
  189. console.log("Total pages tested: ", SuccessfullyLoadedPath.length + FailedToLoadPath.length);
  190. console.log("Successfully loaded pages: ", SuccessfullyLoadedPath.length);
  191. if (FailedToLoadPath.length > 0) {
  192. console.log("Failed to load pages: ", FailedToLoadPath.length);
  193. console.log("Failed to load pages paths: ", FailedToLoadPath);
  194. process.exit(1);
  195. }else {
  196. console.log("No pages failed to load. Congrats!");
  197. }
  198. await driver.quit();
  199. fs.rmSync(userDataDir, { recursive: true, force: true });
  200. }
  201. })();