diff --git a/index.js b/index.js index 4ef461c..43fe0c4 100644 --- a/index.js +++ b/index.js @@ -5,10 +5,11 @@ import exactLandingPage from './tests/exactLandingPage.js'; //DASHBOARDS import correlationDashboard from './tests/CorrelationDashboard/correlationDashboard.js'; + import dashboardMyStandards from './tests/CorrelationDashboard/dashboardMyStandards.js'; import ExACT_dashboardMyContent from './tests/ExACT_dashboardMyContent.js'; import ExACT_dashboardSemanticStandardsComparison from './tests/ExACT_dashboardSemanticStandardsComparison.js'; -import dashboardMyStandards from './tests/dashboardMyStandards.js'; + import myStandardsSearchAlignedContent from './tests/myStandardsSearchAlignedContent.js'; import myStandardsSearchRelatedStandards from './tests/myStandardsSearchRelatedStandards.js'; @@ -66,6 +67,7 @@ app.get('/', (req, res) => {

DASHBOARD

Correlation Dashboard
+
- My Standards Widget
| MY STANDARDS WIDGET |<-------------'); + const errors = []; + + await driver.findElement(By.css('.form-control:nth-child(2)')).sendKeys('exact_juan'); + await driver.findElement(By.css('.passfield')).sendKeys('Edgate1!'); + await driver.findElement(By.css('.login')).click(); + console.log('----->| NEXT ACTION: Entered credentials and logged in'); + + //Wait for page readyState + await driver.wait(async () => { + const readyState = await driver.executeScript('return document.readyState'); + return readyState === 'complete'; + }, 30000, 'ExACT Dashboard did not fully load within 30 seconds'); + + //Wait for the dashboard container to exist in DOM + await driver.wait( + until.elementLocated(By.css('.gap-idle-wrap > img')), + 30000, + 'Dashboard image did not appear within 30 seconds' + ); + + //Wait for it to be visible + await driver.wait(async () => { + try { + const img = await driver.findElement(By.css('.gap-idle-wrap > img')); + return await img.isDisplayed(); + } catch (e) { + return false; + } + }, 30000, 'Dashboard image did not become visible within 30 seconds'); + + //Wait for any loading spinners to disappear + await driver.wait(async () => { + try { + const spinners = await driver.findElements(By.css('.spinner-border')); + for (const spinner of spinners) { + if (await spinner.isDisplayed()) return false; + } + return true; + } catch (e) { + return true; + } + }, 30000, 'Loading spinners did not disappear within 30 seconds'); + + //Wait for the slowest resource to complete + await driver.wait(async () => { + const completed = await driver.executeScript(` + const entries = performance.getEntriesByType('resource'); + return entries.some(entry => + entry.name.includes('content_sets.php') && + entry.responseEnd > 0 + ); + `); + return completed; + }, 30000, 'My Content widget (content_sets.php) did not complete loading within 30 seconds'); + console.log('Passed: My Content widget (content_sets.php) loaded successfully - Dashboard fully loaded'); + + //Final sleep to allow any remaining dynamic content to settle + await driver.sleep(2000); + + console.log('Passed: ExACT Dashboard loaded successfully'); + + if (errors.length > 0) { + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard title + { + description: 'Validate dashboard title text, size, and color', + action: async () => { + const multipleChecks = 'Dashboard title'; + const element = await driver.findElement(By.css('.e-heading')); + + //Get text, font, size, and color + const elementText = await element.getText(); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Correlation Dashboard') { + console.log('Passed: Dashboard title text matched as expected'); + } else { + errors.push(`Expected: "Correlation Dashboard"; Actual: "${elementText}"`); + } + + //font + if (elementFont === `"DM Serif Display", serif`) { + console.log('Passed: Dashboard title font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard title font-family "DM Serif Display, serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '32px') { + console.log('Passed: Dashboard title text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard title text font-size "32px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Dashboard title text color matched as expected'); + } else { + errors.push(`Expected: Dashboard title text color: "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //MY STANDARDS WIDGET + //Dashboard - My Standards Widget title (active) + { + description: 'Validate Dashboard Semantic Standards Comparison Widget title text, color, and size', + action: async () => { + const multipleChecks = 'My Standards Widget title (active)'; + const element = await driver.findElement(By.css('#mystd-tab')); + + //Get text, font, size, and color + const elementText = await element.getText(); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'My Standards') { + console.log('Passed: Dashboard - Semantic Standards Comparison Widget title matched as expected'); + } else { + errors.push(`Expected: Dashboard - "Semantic Standards Comparison"; Actual: "${elementText}"`); + } + + //font + if (elementFont === `Poppins, sans-serif`) { + console.log('Passed: Dashboard - Semantic Standards Comparison Widget font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - Semantic Standards Comparison Widget font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '15px') { + console.log('Passed: Dashboard - Semantic Standards Comparison Widget title text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - Semantic Standards Comparison Widget title text font-size "15px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Dashboard - Semantic Standards Comparison Widget title text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - Semantic Standards Comparison Widget title text color "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - Other Available Stndards tab title + { + description: 'Validate Dashboard - Other Available Stndards tab title text, color, and size', + action: async () => { + const multipleChecks = 'Other Available Stndards tab title'; + const element = await driver.findElement(By.css('#availstd-tab')); + + //Get text, font, size, and color + const elementText = await element.getText(); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Other Available Standards') { + console.log('Passed: Dashboard - Other Available Standards tab title matched as expected'); + } else { + errors.push(`Expected: Dashboard - "Other Available Standards"; Actual: "${elementText}"`); + } + + //font + if (elementFont === `Poppins, sans-serif`) { + console.log('Passed: Dashboard - Other Available Standards tab title font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards tab title font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '15px') { + console.log('Passed: Dashboard - Other Available Standards tab title text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards tab title text font-size "15px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(182, 186, 181, 1)') { + console.log('Passed: Dashboard - Other Available Standards tab title text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards tab title text color "rgba(182, 186, 181, 1)"'; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards dropdown + { + description: 'Validate Dashboard - My Standards dropdown list and value', + action: async () => { + const multipleChecks = 'My Standards dropdown list'; + const elementDropdown = await driver.findElement(By.css('#stdparent')); + const selectedOption = await elementDropdown.findElement(By.css('option:checked')); + + const elementText = await selectedOption.getText(); + const elementFont = await selectedOption.getCssValue('font-family'); + const elementSize = await selectedOption.getCssValue('font-size'); + const elementColor = await selectedOption.getCssValue('color'); + + const options = await elementDropdown.findElements(By.css('option')); + + //Track all errors + const errors = []; + + //text + if (elementText === 'United States Standards') { + console.log('Passed: Dashboard - My Standards dropdown text matched as expected'); + } else { + throw new Error(`Expected: Dashboard - My Standards: "United States Standards"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - My Standards dropdown font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards dropdown font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '13px') { + console.log('Passed: Dashboard - My Standards dropdown font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards dropdown font-size "13px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Dashboard - My Standards dropdown color matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards dropdown color: "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`); + } + + const expected = [ + 'ACTFL', + 'Australia', + 'California', + 'Canada', + 'Common Core Standards', + 'Creating Org', + 'Demo Client Standards', + 'Demo Standards', + 'Imports', + 'New Folder', + 'QA Client Test Frameworks', + 'United States Standards', + 'WIDA' + ]; + + const actual = []; + + for (const opt of options) { + const text = (await opt.getText()).trim(); + actual.push(text); + } + + if (JSON.stringify(actual) === JSON.stringify(expected)) { + console.log('Passed: Dashboard - My Standards Dropdown list matched as expected'); + } else { + throw new Error(`Expected: Dashboard - My Standards Dropdown list: ${JSON.stringify(expected)}, Actual: ${JSON.stringify(actual)}`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards Organization column title + { + description: 'Validate Dashboard - My Standards Organization column title, text, and font size', + action: async () => { + const multipleChecks = 'My Standards Organization column title' + const element = await driver.findElement(By.css('.table:nth-child(2) th:nth-child(1)')); + + //Get text, font, size, and color + const elementText = await element.getText(); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Organization') { + console.log('Passed: Dashboard - My Standards Organization column title matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards "Organization" column title; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - My Standards Organization column title font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Organization column title font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14px') { + console.log('Passed: Dashboard - My Standards Organization column title text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Organization column title text font-size "14px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(94, 105, 116, 1)') { + console.log('Passed: Dashboard - My Standards Organization column title text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Organization column title text color "rgba(94, 105, 116, 1)"'; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards Export column title + { + description: 'Validate Dashboard - My Standards Export column title, text, and font size', + action: async () => { + const multipleChecks = 'My Standards Export column title'; + const element = await driver.findElement(By.css('.table:nth-child(2) > thead .text-center:nth-child(2)')); + + //Get text, font, size, and color + const elementText = await element.getText(); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Export') { + console.log('Passed: Dashboard - My Standards Export column title matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards "Export" column title; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - My Standards Export column title font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Export column title font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14px') { + console.log('Passed: Dashboard - My Standards Export column title text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Export column title text font-size "14px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(94, 105, 116, 1)') { + console.log('Passed: Dashboard - My Standards Export column title text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Export column title text color "rgba(94, 105, 116, 1)"'; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards Manage column title + { + description: 'Validate Dashboard - My Standards Manage column title, text, and font size', + action: async () => { + const multipleChecks = 'My Standards Manage column title'; + const element = await driver.findElement(By.css('.text-center:nth-child(3)')); + + //Get text, font, size, and color + const elementText = await element.getText(); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Manage') { + console.log('Passed: Dashboard - My Standards Manage column title matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards "Manage" column title; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - My Standards Manage column title font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Manage column title font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14px') { + console.log('Passed: Dashboard - My Standards Manage column title text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Manage column title text font-size "14px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(94, 105, 116, 1)') { + console.log('Passed: Dashboard - My Standards Manage column title text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Manage column title text color "rgba(94, 105, 116, 1)"'; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards More Info column title + { + description: 'Validate Dashboard - My Standards More Info column title, text, and font size', + action: async () => { + const multipleChecks = 'My Standards More Info column title'; + const element = await driver.findElement(By.css('.table-sm > thead .text-center:nth-child(4)')); + + //Get text, font, size, and color + const elementText = await element.getText(); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'More Info') { + console.log('Passed: Dashboard - My Standards More Info column title matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards "More Info" column title; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - My Standards More Info column title font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards More Info column title font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14px') { + console.log('Passed: Dashboard - My Standards More Info column title text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards More Info column title text font-size "14px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(94, 105, 116, 1)') { + console.log('Passed: Dashboard - My Standards More Info column title text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards More Info column title text color "rgba(94, 105, 116, 1)"'; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards View column title + { + description: 'Validate Dashboard - My Standards View column title, text, and font size', + action: async () => { + const multipleChecks = 'My Standards View column title'; + const element = await driver.findElement(By.css('thead .text-center:nth-child(5)')); + + //Get text, font, size, and color + const elementText = await element.getText(); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'View') { + console.log('Passed: Dashboard - My Standards View column title matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards "View" column title; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - My Standards View column title font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards View column title font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14px') { + console.log('Passed: Dashboard - My Standards View column title text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards View column title text font-size "14px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(94, 105, 116, 1)') { + console.log('Passed: Dashboard - My Standards View column title text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards View column title text color "rgba(94, 105, 116, 1)"'; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards = Alabama + { + description: 'Validate Dashboard - My Standards Organization = Alabama Standards text', + action: async () => { + const multipleChecks = 'My Standards Organization - Alabama'; + const element = await driver.findElement(By.css('#stdbody > tr:nth-child(1) > td:nth-child(1)')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + const elementExportIcon = await driver.findElement(By.css('#stdbody > tr:nth-child(1) > .text-center:nth-child(2) img')); + const elementMoreInfoIconTooltip = await driver.findElement(By.css('#stdbody > tr:nth-child(1) > td:nth-child(4) > a')).getAttribute('title'); + const elementViewIcon = await driver.findElement(By.css('tr:nth-child(1) > .text-center:nth-child(5) img')); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Alabama') { + console.log("Passed: Dashboard - My Standards Alabama text matched as expected"); + } else { + throw new Error(`Expected: Dashboard - My Standards text: "Alabama"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - My Standards Alabama text font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Alabama text font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14.3px') { + console.log('Passed: Dashboard - My Standards Alabama text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Alabama text font-size "14.3px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(33, 37, 41, 1)') { + console.log('Passed: Dashboard - My Standards Alabama text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Alabama text color: "rgba(33, 37, 41, 1)"; Actual: "${elementColor}"`); + } + + //export icon + if (elementExportIcon) { + console.log('Passed: Dashboard - My Standards Alabama - Export icon is present'); + } else { + errors.push('Expected: Dashboard - My Standards Alabama - Export icon not found'); + } + + //more info icon tool-tip + if (elementMoreInfoIconTooltip === 'View Detail Information') { + console.log('Passed: Dashboard - My Standards Alabama icon tool-tip text matched as expected'); + } else { + errors.push(`Expected: ashboard - My Standards Alabama: "View Detail Information"; Actual: "${elementMoreInfoIconTooltip}"`); + } + + //view icon + if (elementViewIcon) { + console.log('Passed: Dashboard - My Standards Alabama - View icon is present'); + } else { + errors.push('Expected: Dashboard - My Standards Alabama - View icon not found'); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards = Arizona + { + description: 'Validate Dashboard - My Standards Organization = Arizona Standards text', + action: async () => { + const multipleChecks = 'My Standards Organization - Arizona'; + const element = await driver.findElement(By.css('#stdbody > tr:nth-child(2) > td:nth-child(1)')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + const elementExportIcon = await driver.findElement(By.css('#stdbody > tr:nth-child(2) > .text-center:nth-child(2) img')); + const elementMoreInfoIconTooltip = await driver.findElement(By.css('#stdbody > tr:nth-child(2) > td:nth-child(4) > a')).getAttribute('title'); + const elementViewIcon = await driver.findElement(By.css('tr:nth-child(2) > .text-center:nth-child(5) img')); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Arizona') { + console.log("Passed: Dashboard - My Standards Arizona text matched as expected"); + } else { + throw new Error(`Expected: Dashboard - My Standards text: "Arizona"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - My Standards Arizona text font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Arizona text font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14.3px') { + console.log('Passed: Dashboard - My Standards Arizona text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Arizona text font-size "14.3px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(33, 37, 41, 1)') { + console.log('Passed: Dashboard - My Standards Arizona text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Arizona text color: "rgba(33, 37, 41, 1)"; Actual: "${elementColor}"`); + } + + //export icon + if (elementExportIcon) { + console.log('Passed: Dashboard - My Standards Arizona - Export icon is present'); + } else { + errors.push('Expected: Dashboard - My Standards Arizona - Export icon not found'); + } + + //more info icon tool-tip + if (elementMoreInfoIconTooltip === 'View Detail Information') { + console.log('Passed: Dashboard - My Standards Arizona icon tool-tip text matched as expected'); + } else { + errors.push(`Expected: ashboard - My Standards Arizona: "View Detail Information"; Actual: "${elementMoreInfoIconTooltip}"`); + } + + //view icon + if (elementViewIcon) { + console.log('Passed: Dashboard - My Standards Arizona - View icon is present'); + } else { + errors.push('Expected: Dashboard - My Standards Arizona - View icon not found'); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards = California + { + description: 'Validate Dashboard - My Standards Organization = California Standards text', + action: async () => { + const multipleChecks = 'My Standards Organization - California'; + const element = await driver.findElement(By.css('#stdbody > tr:nth-child(3) > td:nth-child(1)')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + const elementExportIcon = await driver.findElement(By.css('#stdbody > tr:nth-child(3) > .text-center:nth-child(2) img')); + const elementMoreInfoIconTooltip = await driver.findElement(By.css('#stdbody > tr:nth-child(3) > td:nth-child(4) > a')).getAttribute('title'); + const elementViewIcon = await driver.findElement(By.css('tr:nth-child(3) > .text-center:nth-child(5) img')); + + //Track all errors + const errors = []; + + //text + if (elementText === 'California') { + console.log("Passed: Dashboard - My Standards California text matched as expected"); + } else { + throw new Error(`Expected: Dashboard - My Standards text: "California"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - My Standards California text font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards California text font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14.3px') { + console.log('Passed: Dashboard - My Standards California text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards California text font-size "14.3px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(33, 37, 41, 1)') { + console.log('Passed: Dashboard - My Standards California text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards California text color: "rgba(33, 37, 41, 1)"; Actual: "${elementColor}"`); + } + + //export icon + if (elementExportIcon) { + console.log('Passed: Dashboard - My Standards California - Export icon is present'); + } else { + errors.push('Expected: Dashboard - My Standards California - Export icon not found'); + } + + //more info icon tool-tip + if (elementMoreInfoIconTooltip === 'View Detail Information') { + console.log('Passed: Dashboard - My Standards California icon tool-tip text matched as expected'); + } else { + errors.push(`Expected: ashboard - My Standards California: "View Detail Information"; Actual: "${elementMoreInfoIconTooltip}"`); + } + + //view icon + if (elementViewIcon) { + console.log('Passed: Dashboard - My Standards California - View icon is present'); + } else { + errors.push('Expected: Dashboard - My Standards California - View icon not found'); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards = Florida + { + description: 'Validate Dashboard - My Standards Organization = Florida Standards text', + action: async () => { + const multipleChecks = 'My Standards Organization - Florida'; + const element = await driver.findElement(By.css('#stdbody > tr:nth-child(4) > td:nth-child(1)')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + const elementExportIcon = await driver.findElement(By.css('#stdbody > tr:nth-child(4) > .text-center:nth-child(2) img')); + const elementMoreInfoIconTooltip = await driver.findElement(By.css('#stdbody > tr:nth-child(4) > td:nth-child(4) > a')).getAttribute('title'); + const elementViewIcon = await driver.findElement(By.css('tr:nth-child(4) > .text-center:nth-child(5) img')); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Florida') { + console.log("Passed: Dashboard - My Standards Florida text matched as expected"); + } else { + throw new Error(`Expected: Dashboard - My Standards text: "Florida"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - My Standards Florida text font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Florida text font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14.3px') { + console.log('Passed: Dashboard - My Standards Florida text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Florida text font-size "14.3px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(33, 37, 41, 1)') { + console.log('Passed: Dashboard - My Standards Florida text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Florida text color: "rgba(33, 37, 41, 1)"; Actual: "${elementColor}"`); + } + + //export icon + if (elementExportIcon) { + console.log('Passed: Dashboard - My Standards Florida - Export icon is present'); + } else { + errors.push('Expected: Dashboard - My Standards Florida - Export icon not found'); + } + + //more info icon tool-tip + if (elementMoreInfoIconTooltip === 'View Detail Information') { + console.log('Passed: Dashboard - My Standards Florida icon tool-tip text matched as expected'); + } else { + errors.push(`Expected: ashboard - My Standards Florida: "View Detail Information"; Actual: "${elementMoreInfoIconTooltip}"`); + } + + //view icon + if (elementViewIcon) { + console.log('Passed: Dashboard - My Standards Florida - View icon is present'); + } else { + errors.push('Expected: Dashboard - My Standards Florida - View icon not found'); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards = Georgia + { + description: 'Validate Dashboard - My Standards Organization = Georgia Standards text', + action: async () => { + const multipleChecks = 'My Standards Organization - Georgia'; + const element = await driver.findElement(By.css('#stdbody > tr:nth-child(5) > td:nth-child(1)')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + const elementExportIcon = await driver.findElement(By.css('#stdbody > tr:nth-child(5) > .text-center:nth-child(2) img')); + const elementMoreInfoIconTooltip = await driver.findElement(By.css('#stdbody > tr:nth-child(5) > td:nth-child(4) > a')).getAttribute('title'); + const elementViewIcon = await driver.findElement(By.css('tr:nth-child(5) > .text-center:nth-child(5) img')); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Georgia') { + console.log("Passed: Dashboard - My Standards Georgia text matched as expected"); + } else { + throw new Error(`Expected: Dashboard - My Standards text: "Georgia"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - My Standards Georgia text font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Georgia text font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14.3px') { + console.log('Passed: Dashboard - My Standards Georgia text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Georgia text font-size "14.3px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(33, 37, 41, 1)') { + console.log('Passed: Dashboard - My Standards Georgia text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Georgia text color: "rgba(33, 37, 41, 1)"; Actual: "${elementColor}"`); + } + + //export icon + if (elementExportIcon) { + console.log('Passed: Dashboard - My Standards Georgia - Export icon is present'); + } else { + errors.push('Expected: Dashboard - My Standards Georgia - Export icon not found'); + } + + //more info icon tool-tip + if (elementMoreInfoIconTooltip === 'View Detail Information') { + console.log('Passed: Dashboard - My Standards Georgia icon tool-tip text matched as expected'); + } else { + errors.push(`Expected: ashboard - My Standards Georgia: "View Detail Information"; Actual: "${elementMoreInfoIconTooltip}"`); + } + + //view icon + if (elementViewIcon) { + console.log('Passed: Dashboard - My Standards Georgia - View icon is present'); + } else { + errors.push('Expected: Dashboard - My Standards Georgia - View icon not found'); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards = Illinois + { + description: 'Validate Dashboard - My Standards Organization = Illinois Standards text', + action: async () => { + const multipleChecks = 'My Standards Organization - Illinois'; + const element = await driver.findElement(By.css('#stdbody > tr:nth-child(6) > td:nth-child(1)')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + const elementExportIcon = await driver.findElement(By.css('#stdbody > tr:nth-child(6) > .text-center:nth-child(2) img')); + const elementMoreInfoIconTooltip = await driver.findElement(By.css('#stdbody > tr:nth-child(6) > td:nth-child(4) > a')).getAttribute('title'); + const elementViewIcon = await driver.findElement(By.css('tr:nth-child(6) > .text-center:nth-child(5) img')); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Illinois') { + console.log("Passed: Dashboard - My Standards Illinois text matched as expected"); + } else { + throw new Error(`Expected: Dashboard - My Standards text: "Illinois"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - My Standards Illinois text font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Illinois text font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14.3px') { + console.log('Passed: Dashboard - My Standards Illinois text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Illinois text font-size "14.3px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(33, 37, 41, 1)') { + console.log('Passed: Dashboard - My Standards Illinois text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Illinois text color: "rgba(33, 37, 41, 1)"; Actual: "${elementColor}"`); + } + + //export icon + if (elementExportIcon) { + console.log('Passed: Dashboard - My Standards Illinois - Export icon is present'); + } else { + errors.push('Expected: Dashboard - My Standards Illinois - Export icon not found'); + } + + //more info icon tool-tip + if (elementMoreInfoIconTooltip === 'View Detail Information') { + console.log('Passed: Dashboard - My Standards Illinois icon tool-tip text matched as expected'); + } else { + errors.push(`Expected: ashboard - My Standards Illinois: "View Detail Information"; Actual: "${elementMoreInfoIconTooltip}"`); + } + + //view icon + if (elementViewIcon) { + console.log('Passed: Dashboard - My Standards Illinois - View icon is present'); + } else { + errors.push('Expected: Dashboard - My Standards Illinois - View icon not found'); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards = New York + { + description: 'Validate Dashboard - My Standards Organization = New York Standards text', + action: async () => { + const multipleChecks = 'My Standards Organization - New York'; + const element = await driver.findElement(By.css('#stdbody > tr:nth-child(7) > td:nth-child(1)')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + const elementExportIcon = await driver.findElement(By.css('#stdbody > tr:nth-child(7) > .text-center:nth-child(2) img')); + const elementMoreInfoIconTooltip = await driver.findElement(By.css('#stdbody > tr:nth-child(7) > td:nth-child(4) > a')).getAttribute('title'); + const elementViewIcon = await driver.findElement(By.css('tr:nth-child(7) > .text-center:nth-child(5) img')); + + //Track all errors + const errors = []; + + //text + if (elementText === 'New York') { + console.log("Passed: Dashboard - My Standards New York text matched as expected"); + } else { + throw new Error(`Expected: Dashboard - My Standards text: "New York"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - My Standards New York text font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards New York text font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14.3px') { + console.log('Passed: Dashboard - My Standards New York text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards New York text font-size "14.3px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(33, 37, 41, 1)') { + console.log('Passed: Dashboard - My Standards New York text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards New York text color: "rgba(33, 37, 41, 1)"; Actual: "${elementColor}"`); + } + + //export icon + if (elementExportIcon) { + console.log('Passed: Dashboard - My Standards New York - Export icon is present'); + } else { + errors.push('Expected: Dashboard - My Standards New York - Export icon not found'); + } + + //more info icon tool-tip + if (elementMoreInfoIconTooltip === 'View Detail Information') { + console.log('Passed: Dashboard - My Standards New York icon tool-tip text matched as expected'); + } else { + errors.push(`Expected: ashboard - My Standards New York: "View Detail Information"; Actual: "${elementMoreInfoIconTooltip}"`); + } + + //view icon + if (elementViewIcon) { + console.log('Passed: Dashboard - My Standards New York - View icon is present'); + } else { + errors.push('Expected: Dashboard - My Standards New York - View icon not found'); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards = Texas + { + description: 'Validate Dashboard - My Standards Organization = Texas Standards text', + action: async () => { + const multipleChecks = 'My Standards Organization - Texas'; + const element = await driver.findElement(By.css('#stdbody > tr:nth-child(8) > td:nth-child(1)')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + const elementExportIcon = await driver.findElement(By.css('#stdbody > tr:nth-child(8) > .text-center:nth-child(2) img')); + const elementMoreInfoIconTooltip = await driver.findElement(By.css('#stdbody > tr:nth-child(8) > td:nth-child(4) > a')).getAttribute('title'); + const elementViewIcon = await driver.findElement(By.css('tr:nth-child(8) > .text-center:nth-child(5) img')); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Texas') { + console.log("Passed: Dashboard - My Standards Texas text matched as expected"); + } else { + throw new Error(`Expected: Dashboard - My Standards text: "Texas"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - My Standards Texas text font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Texas text font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14.3px') { + console.log('Passed: Dashboard - My Standards Texas text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Texas text font-size "14.3px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(33, 37, 41, 1)') { + console.log('Passed: Dashboard - My Standards Texas text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Texas text color: "rgba(33, 37, 41, 1)"; Actual: "${elementColor}"`); + } + + //export icon + if (elementExportIcon) { + console.log('Passed: Dashboard - My Standards Texas - Export icon is present'); + } else { + errors.push('Expected: Dashboard - My Standards Texas - Export icon not found'); + } + + //more info icon tool-tip + if (elementMoreInfoIconTooltip === 'View Detail Information') { + console.log('Passed: Dashboard - My Standards Texas icon tool-tip text matched as expected'); + } else { + errors.push(`Expected: ashboard - My Standards Texas: "View Detail Information"; Actual: "${elementMoreInfoIconTooltip}"`); + } + + //view icon + if (elementViewIcon) { + console.log('Passed: Dashboard - My Standards Texas - View icon is present'); + } else { + errors.push('Expected: Dashboard - My Standards Texas - View icon not found'); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards = Washington + { + description: 'Validate Dashboard - My Standards Organization = Washington Standards text', + action: async () => { + const multipleChecks = 'My Standards Organization - Washington'; + const element = await driver.findElement(By.css('#stdbody > tr:nth-child(9) > td:nth-child(1)')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + const elementExportIcon = await driver.findElement(By.css('#stdbody > tr:nth-child(9) > .text-center:nth-child(2) img')); + const elementMoreInfoIconTooltip = await driver.findElement(By.css('#stdbody > tr:nth-child(9) > td:nth-child(4) > a')).getAttribute('title'); + const elementViewIcon = await driver.findElement(By.css('tr:nth-child(9) > .text-center:nth-child(5) img')); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Washington') { + console.log("Passed: Dashboard - My Standards Washington text matched as expected"); + } else { + throw new Error(`Expected: Dashboard - My Standards text: "Washington"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - My Standards Washington text font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Washington text font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14.3px') { + console.log('Passed: Dashboard - My Standards Washington text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Washington text font-size "14.3px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(33, 37, 41, 1)') { + console.log('Passed: Dashboard - My Standards Washington text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Washington text color: "rgba(33, 37, 41, 1)"; Actual: "${elementColor}"`); + } + + //export icon + if (elementExportIcon) { + console.log('Passed: Dashboard - My Standards Washington - Export icon is present'); + } else { + errors.push('Expected: Dashboard - My Standards Washington - Export icon not found'); + } + + //more info icon tool-tip + if (elementMoreInfoIconTooltip === 'View Detail Information') { + console.log('Passed: Dashboard - My Standards Washington icon tool-tip text matched as expected'); + } else { + errors.push(`Expected: ashboard - My Standards Washington: "View Detail Information"; Actual: "${elementMoreInfoIconTooltip}"`); + } + + //view icon + if (elementViewIcon) { + console.log('Passed: Dashboard - My Standards Washington - View icon is present'); + } else { + errors.push('Expected: Dashboard - My Standards Washington - View icon not found'); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //NEXT ACTION + { + description: 'Dashboard - Click Other Available Standards tab', + action: async () => { + await driver.findElement(By.css('#availstd-tab')).click(); + console.log('----->| NEXT ACTION: Clicked Other Available Standards tab'); + + //Wait until the element exists in the DOM + const instructionText = await driver.wait( + until.elementLocated(By.css('p:nth-child(1)')), + 30000 + ); + + //Wait until it becomes visible + await driver.wait( + until.elementIsVisible(instructionText), + 30000 + ); + } + }, + + //Dashboard - My Standards Widget title + { + description: 'Validate Dashboard Semantic Standards Comparison Widget title text, color, and size', + action: async () => { + const multipleChecks = 'Dashboard Semantic Standards Comparison Widget title'; + const element = await driver.findElement(By.css('#mystd-tab')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'My Standards') { + console.log('Passed: Dashboard - Semantic Standards Comparison Widget title matched as expected'); + } else { + errors.push(`Expected: Dashboard - "Semantic Standards Comparison"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - Semantic Standards Comparison Widget title text font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - Semantic Standards Comparison Widget title font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '15px') { + console.log('Passed: Dashboard - Semantic Standards Comparison Widget title text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - Semantic Standards Comparison Widget title text font-size "15px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(182, 186, 181, 1)') { + console.log('Passed: Dashboard - Semantic Standards Comparison Widget title text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - Semantic Standards Comparison Widget title text color "rgba(182, 186, 181, 1)"; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - Other Available Stndards tab title (active) + { + description: 'Validate Dashboard - Other Available Stndards tab title text, color, and size', + action: async () => { + const multipleChecks = 'Other Available Stndards tab title'; + const element = await driver.findElement(By.css('#availstd-tab')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Other Available Standards') { + console.log('Passed: Dashboard - Other Available Standards tab title matched as expected'); + } else { + errors.push(`Expected: Dashboard - "Other Available Standards"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - Other Available Standards tab title text font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards tab title font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '15px') { + console.log('Passed: Dashboard - Other Available Standards tab title text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards tab title text font-size "15px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Dashboard - Other Available Standards tab title text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards tab title text color "rgba(40, 39, 90, 1)"'; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - Other Available Stndards tab title + { + description: 'Validate Dashboard - Other Available Stndards tab title text, color, and size', + action: async () => { + const multipleChecks = 'Other Available Stndards tab title'; + const element = await driver.findElement(By.css('p:nth-child(1)')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'The following standards are also available to clients. If you would like access to any of these standards sets, please Contact Us.') { + console.log('Passed: Dashboard - Other Available Standards description text matched as expected'); + } else { + errors.push(`Expected: Dashboard - "The following standards are also available to clients. If you would like access to any of these standards sets, please Contact Us."; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - Other Available Standards description text font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards description text font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '13px') { + console.log('Passed: Dashboard - Other Available Standards tab title text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards tab title text font-size "13px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Dashboard - Other Available Standards tab title text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards tab title text color "rgba(40, 39, 90, 1)"'; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - Other Available Standards dropdown + { + description: 'Validate Dashboard - Other Available Standards dropdown list and value', + action: async () => { + const multipleChecks = 'Other Available Standards'; + const elementDropdown = await driver.findElement(By.css('#defstdparent')); + const selectedOption = await elementDropdown.findElement(By.css('option:checked')); + + const elementText = await selectedOption.getText(); + const elementFont = await selectedOption.getCssValue('font-family'); + const elementSize = await selectedOption.getCssValue('font-size'); + const elementColor = await selectedOption.getCssValue('color'); + + const options = await elementDropdown.findElements(By.css('option')); + + //Track all errors + const errors = []; + + //text + if (elementText === 'United States Standards') { + console.log('Passed: Dashboard - Other Available Standards dropdown value matched as expected'); + } else { + throw new Error(`Expected: Dashboard - Other Available Standards dropdown value - "United States Standards"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - Other Available Standards dropdown value font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards dropdown value font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '13px') { + console.log('Passed: Dashboard - Other Available Standards dropdown value font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards dropdown value font-size "13px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Dashboard - Other Available Standards dropdown value color matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards dropdown value color: "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`); + } + + const expected = [ + 'ACT', + 'ACTFL', + 'AQA', + 'Archived Standards', + 'Australia', + 'Brazil', + 'Cambridge IGCSE', + 'Cambridge International AS & A Level', + 'Cambridge Secondary', + 'Canada', + 'Common Core Standards', + 'Edexcel', + 'England', + 'Finland', + 'India', + 'India NCERT (Archived)', + 'International Standards', + 'Ireland (Archived)', + 'Mexico', + 'National Standards', + 'New Zealand', + 'OCR', + 'Puerto Rico 2014', + 'Saudi Arabia', + 'Supplemental Standards', + 'Taiwan (Additional)', + 'Thailand (Additional)', + 'United Arab Emirates', + 'United States Standards' + ]; + + const actual = []; + + for (const opt of options) { + const text = (await opt.getText()).trim(); + actual.push(text); + } + + if (JSON.stringify(actual) === JSON.stringify(expected)) { + console.log('Passed: Dashboard - Other Available Standards dropdown list matched as expected'); + } else { + throw new Error(`Expected: Dashboard - Other Available Standards dropdown list: ${JSON.stringify(expected)}, Actual: ${JSON.stringify(actual)}`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - Other Available Standards Organization column title + { + description: 'Validate Dashboard - Other Available Standards Organization column title, text, and font size', + action: async () => { + const multiple = 'Other Available Standards Organization column title'; + const element = await driver.findElement(By.css('.table:nth-child(3) th:nth-child(1)')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Organization') { + console.log('Passed: Dashboard - Other Available Standards Organization column title matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards "Organization" column title; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - Other Available Standards Organization column title font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards Organization column title font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14px') { + console.log('Passed: Dashboard - Other Available Standards Organization column title text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards Organization column title text font-size "14px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(94, 105, 116, 1)') { + console.log('Passed: Dashboard - Other Available Standards Organization column title text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards Organization column title text color "rgba(94, 105, 116, 1)"'; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - Other Available Organization column title + { + description: 'Validate Dashboard - Other Available Standards More Info column title, text, and font size', + action: async () => { + const multipleChecks = 'Other Available Organization column title'; + const element = await driver.findElement(By.css('.table:nth-child(3) > thead .text-center')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'More Info') { + console.log('Passed: Dashboard - Other Available Standards More Info column title matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards "More Info" column title; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - Other Available Standards More Info column title font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards More Info column title font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14px') { + console.log('Passed: Dashboard - Other Available Standards More Info column title text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards More Info column title text font-size "14px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(94, 105, 116, 1)') { + console.log('Passed: Dashboard - Other Available Standards More Info column title text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards More Info column title text color "rgba(94, 105, 116, 1)"'; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - Other Available Standards - Alaska + { + description: 'Validate Dashboard - Other Available Standards - Alaska', + action: async () => { + const multipleChecks = 'Other Available Standards - Alaska'; + const element = await driver.findElement(By.css('#defstdbody > tr:nth-child(1) > td:nth-child(1)')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + const elementMoreInfoIconTooltip = await driver.findElement(By.css('#defstdbody > tr:nth-child(1) > td.text-center > a')).getAttribute('title'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Alaska') { + console.log('Passed: Dashboard - Other Available Standards Alaska column title matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards "Alaska" column title; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - Other Available Standards Alaska column title font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards Alaska column title font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14.3px') { + console.log('Passed: Dashboard - Other Available Standards Alaska column title text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards Alaska column title text font-size "14.3px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(33, 37, 41, 1)') { + console.log('Passed: Dashboard - Other Available Standards Alaska column title text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards Alaska column title text color "rgba(33, 37, 41, 1)"'; Actual: "${elementColor}"`); + } + + //more info icon tool-tip + if (elementMoreInfoIconTooltip === 'View Detail Information') { + console.log('Passed: Dashboard - Other Available Standards Alaska icon tool-tip text matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards Alaska: "View Detail Information"; Actual: "${elementMoreInfoIconTooltip}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - Other Available Standards - Arkansas + { + description: 'Validate Dashboard - Other Available Standards - Arkansas', + action: async () => { + const multipleChecks = 'Other Available Standards - Arkansas'; + const element = await driver.findElement(By.css('#defstdbody > tr:nth-child(2) > td:nth-child(1)')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + const elementMoreInfoIconTooltip = await driver.findElement(By.css('#defstdbody > tr:nth-child(2) > td.text-center > a')).getAttribute('title'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Arkansas') { + console.log('Passed: Dashboard - Other Available Standards Arkansas column title matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards "Arkansas" column title; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - Other Available Standards Arkansas column title font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards Arkansas column title font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14.3px') { + console.log('Passed: Dashboard - Other Available Standards Arkansas column title text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards Arkansas column title text font-size "14.3px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(33, 37, 41, 1)') { + console.log('Passed: Dashboard - Other Available Standards Arkansas column title text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards Arkansas column title text color "rgba(33, 37, 41, 1)"'; Actual: "${elementColor}"`); + } + + //more info icon tool-tip + if (elementMoreInfoIconTooltip === 'View Detail Information') { + console.log('Passed: Dashboard - Other Available Standards Arkansas icon tool-tip text matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards Arkansas: "View Detail Information"; Actual: "${elementMoreInfoIconTooltip}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - Other Available Standards - Colorado + { + description: 'Validate Dashboard - Other Available Standards - Colorado', + action: async () => { + const multipleChecks = 'Other Available Standards - Colorado'; + const element = await driver.findElement(By.css('#defstdbody > tr:nth-child(3) > td:nth-child(1)')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + const elementMoreInfoIconTooltip = await driver.findElement(By.css('#defstdbody > tr:nth-child(3) > td.text-center > a')).getAttribute('title'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Colorado') { + console.log('Passed: Dashboard - Other Available Standards Colorado column title matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards "Colorado" column title; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - Other Available Standards Colorado column title font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards Colorado column title font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14.3px') { + console.log('Passed: Dashboard - Other Available Standards Colorado column title text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards Colorado column title text font-size "14.3px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(33, 37, 41, 1)') { + console.log('Passed: Dashboard - Other Available Standards Colorado column title text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards Colorado column title text color "rgba(33, 37, 41, 1)"'; Actual: "${elementColor}"`); + } + + //more info icon tool-tip + if (elementMoreInfoIconTooltip === 'View Detail Information') { + console.log('Passed: Dashboard - Other Available Standards Colorado icon tool-tip text matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards Colorado: "View Detail Information"; Actual: "${elementMoreInfoIconTooltip}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - Other Available Standards - Connecticut + { + description: 'Validate Dashboard - Other Available Standards - Connecticut', + action: async () => { + const multipleChecks = 'Other Available Standards - Connecticut'; + const element = await driver.findElement(By.css('#defstdbody > tr:nth-child(4) > td:nth-child(1)')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + const elementMoreInfoIconTooltip = await driver.findElement(By.css('#defstdbody > tr:nth-child(4) > td.text-center > a')).getAttribute('title'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Connecticut') { + console.log('Passed: Dashboard - Other Available Standards Connecticut column title matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards "Connecticut" column title; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - Other Available Standards Connecticut column title font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards Connecticut column title font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14.3px') { + console.log('Passed: Dashboard - Other Available Standards Connecticut column title text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards Connecticut column title text font-size "14.3px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(33, 37, 41, 1)') { + console.log('Passed: Dashboard - Other Available Standards Connecticut column title text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards Connecticut column title text color "rgba(33, 37, 41, 1)"'; Actual: "${elementColor}"`); + } + + //more info icon tool-tip + if (elementMoreInfoIconTooltip === 'View Detail Information') { + console.log('Passed: Dashboard - Other Available Standards Connecticut icon tool-tip text matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards Connecticut: "View Detail Information"; Actual: "${elementMoreInfoIconTooltip}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - Other Available Standards - Delaware + { + description: 'Validate Dashboard - Other Available Standards - Delaware', + action: async () => { + const multipleChecks = 'Other Available Standards - Delaware'; + const element = await driver.findElement(By.css('#defstdbody > tr:nth-child(5) > td:nth-child(1)')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + const elementMoreInfoIconTooltip = await driver.findElement(By.css('#defstdbody > tr:nth-child(5) > td.text-center > a')).getAttribute('title'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Delaware') { + console.log('Passed: Dashboard - Other Available Standards Delaware column title matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards "Delaware" column title; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - Other Available Standards Delaware column title font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards Delaware column title font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14.3px') { + console.log('Passed: Dashboard - Other Available Standards Delaware column title text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards Delaware column title text font-size "14.3px"; Actual: "${elementSize}"`); + } + + //more info icon tool-tip + if (elementMoreInfoIconTooltip === 'View Detail Information') { + console.log('Passed: Dashboard - Other Available Standards Delaware icon tool-tip text matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards Delaware: "View Detail Information"; Actual: "${elementMoreInfoIconTooltip}"`); + } + + //color + if (elementColor === 'rgba(33, 37, 41, 1)') { + console.log('Passed: Dashboard - Other Available Standards Delaware column title text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards Delaware column title text color "rgba(33, 37, 41, 1)"'; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //NEXT ACTION + { + description: 'Dashboard - Click My Standards tab', + action: async () => { + await driver.findElement(By.css('#mystd-tab')).click(); + console.log('----->| NEXT ACTION: Clicked My Standards tab'); + + //Wait until the element exists in the DOM + const myStandardsDropdown = await driver.wait( + until.elementLocated(By.css('#stdparent')), + 30000 + ); + + //Wait until it becomes visible + await driver.wait( + until.elementIsVisible(myStandardsDropdown), + 30000 + ); + } + }, + + //Dashboard - My Standards Widget title (active) + { + description: 'Validate Dashboard Semantic Standards Comparison Widget title text, color, and size', + action: async () => { + const multipleChecks = 'My Standards Widget title (active)'; + const element = await driver.findElement(By.css('#mystd-tab')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'My Standards') { + console.log('Passed: Dashboard - Semantic Standards Comparison Widget title matched as expected'); + } else { + errors.push(`Expected: Dashboard - "Semantic Standards Comparison"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - Semantic Standards Comparison Widget title font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - Semantic Standards Comparison Widget title font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '15px') { + console.log('Passed: Dashboard - Semantic Standards Comparison Widget title text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - Semantic Standards Comparison Widget title text font-size "15px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Dashboard - Semantic Standards Comparison Widget title text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - Semantic Standards Comparison Widget title text color "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - Other Available Stndards tab title + { + description: 'Validate Dashboard - Other Available Stndards tab title text, color, and size', + action: async () => { + const multipleChecks = 'Other Available Stndards tab title'; + const element = await driver.findElement(By.css('#availstd-tab')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Other Available Standards') { + console.log('Passed: Dashboard - Other Available Standards tab title matched as expected'); + } else { + errors.push(`Expected: Dashboard - "Other Available Standards"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - Other Available Standards tab title font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards tab title font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '15px') { + console.log('Passed: Dashboard - Other Available Standards tab title text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards tab title text font-size "15px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(182, 186, 181, 1)') { + console.log('Passed: Dashboard - Other Available Standards tab title text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - Other Available Standards tab title text color "rgba(182, 186, 181, 1)"'; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards dropdown + { + description: 'Validate Dashboard - My Standards dropdown list and value', + action: async () => { + const multipleChecks = 'My Standards dropdown list'; + const elementDropdown = await driver.findElement(By.css('#stdparent')); + const selectedOption = await elementDropdown.findElement(By.css('option:checked')); + + const elementText = await selectedOption.getText(); + const elementFont = await selectedOption.getCssValue('font-family'); + const elementSize = await selectedOption.getCssValue('font-size'); + const elementColor = await selectedOption.getCssValue('color'); + + const options = await elementDropdown.findElements(By.css('option')); + + //Track all errors + const errors = []; + + //text + if (elementText === 'United States Standards') { + console.log('Passed: Dashboard - My Standards dropdown text matched as expected'); + } else { + throw new Error(`Expected: Dashboard - My Standards: "United States Standards"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - My Standards dropdown font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards dropdown font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '13px') { + console.log('Passed: Dashboard - My Standards dropdown font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards dropdown font-size "13px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Dashboard - My Standards dropdown color matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards dropdown color: "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`); + } + + const expected = [ + 'ACTFL', + 'Australia', + 'California', + 'Canada', + 'Common Core Standards', + 'Creating Org', + 'Demo Client Standards', + 'Demo Standards', + 'Imports', + 'New Folder', + 'QA Client Test Frameworks', + 'United States Standards', + 'WIDA' + ]; + + const actual = []; + + for (const opt of options) { + const text = (await opt.getText()).trim(); + actual.push(text); + } + + if (JSON.stringify(actual) === JSON.stringify(expected)) { + console.log('Passed: Dashboard - My Standards Dropdown list matched as expected'); + } else { + throw new Error(`Expected: Dashboard - My Standards Dropdown list: ${JSON.stringify(expected)}, Actual: ${JSON.stringify(actual)}`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards Organization column title + { + description: 'Validate Dashboard - My Standards Organization column title, text, and font size', + action: async () => { + const multipleChecks = 'My Standards Organization column title' + const element = await driver.findElement(By.css('.table:nth-child(2) th:nth-child(1)')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Organization') { + console.log('Passed: Dashboard - My Standards Organization column title matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards "Organization" column title; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - My Standards Organization column title font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Organization column title font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14px') { + console.log('Passed: Dashboard - My Standards Organization column title text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Organization column title text font-size "14px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(94, 105, 116, 1)') { + console.log('Passed: Dashboard - My Standards Organization column title text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Organization column title text color "rgba(94, 105, 116, 1)"'; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards Export column title + { + description: 'Validate Dashboard - My Standards Export column title, text, and font size', + action: async () => { + const multipleChecks = 'My Standards Export column title'; + const element = await driver.findElement(By.css('.table:nth-child(2) > thead .text-center:nth-child(2)')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Export') { + console.log('Passed: Dashboard - My Standards Export column title matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards "Export" column title; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - My Standards Export column title font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Export column title font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14px') { + console.log('Passed: Dashboard - My Standards Export column title text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Export column title text font-size "14px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(94, 105, 116, 1)') { + console.log('Passed: Dashboard - My Standards Export column title text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Export column title text color "rgba(94, 105, 116, 1)"'; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards Manage column title + { + description: 'Validate Dashboard - My Standards Manage column title, text, and font size', + action: async () => { + const multipleChecks = 'My Standards Manage column title'; + const element = await driver.findElement(By.css('.text-center:nth-child(3)')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Manage') { + console.log('Passed: Dashboard - My Standards Manage column title matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards "Manage" column title; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - My Standards Manage column title font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Manage column title font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14px') { + console.log('Passed: Dashboard - My Standards Manage column title text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Manage column title text font-size "14px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(94, 105, 116, 1)') { + console.log('Passed: Dashboard - My Standards Manage column title text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Manage column title text color "rgba(94, 105, 116, 1)"'; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards More Info column title, + { + description: 'Validate Dashboard - My Standards More Info column title, text, and font size', + action: async () => { + const multipleChecks = 'My Standards More Info column title'; + const element = await driver.findElement(By.css('.table-sm > thead .text-center:nth-child(4)')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'More Info') { + console.log('Passed: Dashboard - My Standards More Info column title matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards "More Info" column title; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - My Standards More Info column title font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards More Info column title font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14px') { + console.log('Passed: Dashboard - My Standards More Info column title text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards More Info column title text font-size "14px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(94, 105, 116, 1)') { + console.log('Passed: Dashboard - My Standards More Info column title text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards More Info column title text color "rgba(94, 105, 116, 1)"'; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards View column title + { + description: 'Validate Dashboard - My Standards View column title, text, and font size', + action: async () => { + const multipleChecks = 'My Standards View column title'; + const element = await driver.findElement(By.css('thead .text-center:nth-child(5)')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'View') { + console.log('Passed: Dashboard - My Standards View column title matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards "View" column title; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - My Standards View column title font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards View column title font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14px') { + console.log('Passed: Dashboard - My Standards View column title text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards View column title text font-size "14px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(94, 105, 116, 1)') { + console.log('Passed: Dashboard - My Standards View column title text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards View column title text color "rgba(94, 105, 116, 1)"'; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards = Alabama + { + description: 'Validate Dashboard - My Standards Organization = Alabama Standards text', + action: async () => { + const multipleChecks = 'My Standards Organization - Alabama'; + const element = await driver.findElement(By.css('#stdbody > tr:nth-child(1) > td:nth-child(1)')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + const elementExportIcon = await driver.findElement(By.css('#stdbody > tr:nth-child(1) > .text-center:nth-child(2) img')); + const elementMoreInfoIconTooltip = await driver.findElement(By.css('#stdbody > tr:nth-child(1) > td:nth-child(4) > a')).getAttribute('title'); + const elementViewIcon = await driver.findElement(By.css('tr:nth-child(1) > .text-center:nth-child(5) img')); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Alabama') { + console.log("Passed: Dashboard - My Standards Alabama text matched as expected"); + } else { + throw new Error(`Expected: Dashboard - My Standards text: "Alabama"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - My Standards Alabama text font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Alabama text font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14.3px') { + console.log('Passed: Dashboard - My Standards Alabama text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Alabama text font-size "14.3px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(33, 37, 41, 1)') { + console.log('Passed: Dashboard - My Standards Alabama text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Alabama text color: "rgba(33, 37, 41, 1)"; Actual: "${elementColor}"`); + } + + //export icon + if (elementExportIcon) { + console.log('Passed: Dashboard - My Standards Alabama - Export icon is present'); + } else { + errors.push('Expected: Dashboard - My Standards Alabama - Export icon not found'); + } + + //more info icon tool-tip + if (elementMoreInfoIconTooltip === 'View Detail Information') { + console.log('Passed: Dashboard - My Standards Alabama icon tool-tip text matched as expected'); + } else { + errors.push(`Expected: ashboard - My Standards Alabama: "View Detail Information"; Actual: "${elementMoreInfoIconTooltip}"`); + } + + //view icon + if (elementViewIcon) { + console.log('Passed: Dashboard - My Standards Alabama - View icon is present'); + } else { + errors.push('Expected: Dashboard - My Standards Alabama - View icon not found'); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards = Arizona + { + description: 'Validate Dashboard - My Standards Organization = Arizona Standards text', + action: async () => { + const multipleChecks = 'My Standards Organization - Arizona'; + const element = await driver.findElement(By.css('#stdbody > tr:nth-child(2) > td:nth-child(1)')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + const elementExportIcon = await driver.findElement(By.css('#stdbody > tr:nth-child(2) > .text-center:nth-child(2) img')); + const elementMoreInfoIconTooltip = await driver.findElement(By.css('#stdbody > tr:nth-child(2) > td:nth-child(4) > a')).getAttribute('title'); + const elementViewIcon = await driver.findElement(By.css('tr:nth-child(2) > .text-center:nth-child(5) img')); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Arizona') { + console.log("Passed: Dashboard - My Standards Arizona text matched as expected"); + } else { + throw new Error(`Expected: Dashboard - My Standards text: "Arizona"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - My Standards Arizona text font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Arizona text font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14.3px') { + console.log('Passed: Dashboard - My Standards Arizona text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Arizona text font-size "14.3px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(33, 37, 41, 1)') { + console.log('Passed: Dashboard - My Standards Arizona text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Arizona text color: "rgba(33, 37, 41, 1)"; Actual: "${elementColor}"`); + } + + //export icon + if (elementExportIcon) { + console.log('Passed: Dashboard - My Standards Arizona - Export icon is present'); + } else { + errors.push('Expected: Dashboard - My Standards Arizona - Export icon not found'); + } + + //more info icon tool-tip + if (elementMoreInfoIconTooltip === 'View Detail Information') { + console.log('Passed: Dashboard - My Standards Arizona icon tool-tip text matched as expected'); + } else { + errors.push(`Expected: ashboard - My Standards Arizona: "View Detail Information"; Actual: "${elementMoreInfoIconTooltip}"`); + } + + //view icon + if (elementViewIcon) { + console.log('Passed: Dashboard - My Standards Arizona - View icon is present'); + } else { + errors.push('Expected: Dashboard - My Standards Arizona - View icon not found'); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards = California + { + description: 'Validate Dashboard - My Standards Organization = California Standards text', + action: async () => { + const multipleChecks = 'My Standards Organization - California'; + const element = await driver.findElement(By.css('#stdbody > tr:nth-child(3) > td:nth-child(1)')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + const elementExportIcon = await driver.findElement(By.css('#stdbody > tr:nth-child(3) > .text-center:nth-child(2) img')); + const elementMoreInfoIconTooltip = await driver.findElement(By.css('#stdbody > tr:nth-child(3) > td:nth-child(4) > a')).getAttribute('title'); + const elementViewIcon = await driver.findElement(By.css('tr:nth-child(3) > .text-center:nth-child(5) img')); + + //Track all errors + const errors = []; + + //text + if (elementText === 'California') { + console.log("Passed: Dashboard - My Standards California text matched as expected"); + } else { + throw new Error(`Expected: Dashboard - My Standards text: "California"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - My Standards California text font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards California text font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14.3px') { + console.log('Passed: Dashboard - My Standards California text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards California text font-size "14.3px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(33, 37, 41, 1)') { + console.log('Passed: Dashboard - My Standards California text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards California text color: "rgba(33, 37, 41, 1)"; Actual: "${elementColor}"`); + } + + //export icon + if (elementExportIcon) { + console.log('Passed: Dashboard - My Standards California - Export icon is present'); + } else { + errors.push('Expected: Dashboard - My Standards California - Export icon not found'); + } + + //more info icon tool-tip + if (elementMoreInfoIconTooltip === 'View Detail Information') { + console.log('Passed: Dashboard - My Standards California icon tool-tip text matched as expected'); + } else { + errors.push(`Expected: ashboard - My Standards California: "View Detail Information"; Actual: "${elementMoreInfoIconTooltip}"`); + } + + //view icon + if (elementViewIcon) { + console.log('Passed: Dashboard - My Standards California - View icon is present'); + } else { + errors.push('Expected: Dashboard - My Standards California - View icon not found'); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards = Florida + { + description: 'Validate Dashboard - My Standards Organization = Florida Standards text', + action: async () => { + const multipleChecks = 'My Standards Organization - Florida'; + const element = await driver.findElement(By.css('#stdbody > tr:nth-child(4) > td:nth-child(1)')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + const elementExportIcon = await driver.findElement(By.css('#stdbody > tr:nth-child(4) > .text-center:nth-child(2) img')); + const elementMoreInfoIconTooltip = await driver.findElement(By.css('#stdbody > tr:nth-child(4) > td:nth-child(4) > a')).getAttribute('title'); + const elementViewIcon = await driver.findElement(By.css('tr:nth-child(4) > .text-center:nth-child(5) img')); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Florida') { + console.log("Passed: Dashboard - My Standards Florida text matched as expected"); + } else { + throw new Error(`Expected: Dashboard - My Standards text: "Florida"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: Dashboard - My Standards Florida text font-family matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Florida text font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14.3px') { + console.log('Passed: Dashboard - My Standards Florida text font-size matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Florida text font-size "14.3px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(33, 37, 41, 1)') { + console.log('Passed: Dashboard - My Standards Florida text color matched as expected'); + } else { + errors.push(`Expected: Dashboard - My Standards Florida text color: "rgba(33, 37, 41, 1)"; Actual: "${elementColor}"`); + } + + //export icon + if (elementExportIcon) { + console.log('Passed: Dashboard - My Standards Florida - Export icon is present'); + } else { + errors.push('Expected: Dashboard - My Standards Florida - Export icon not found'); + } + + //more info icon tool-tip + if (elementMoreInfoIconTooltip === 'View Detail Information') { + console.log('Passed: Dashboard - My Standards Florida icon tool-tip text matched as expected'); + } else { + errors.push(`Expected: ashboard - My Standards Florida: "View Detail Information"; Actual: "${elementMoreInfoIconTooltip}"`); + } + + //view icon + if (elementViewIcon) { + console.log('Passed: Dashboard - My Standards Florida - View icon is present'); + } else { + errors.push('Expected: Dashboard - My Standards Florida - View icon not found'); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //NEXT ACTION + { + description: 'Dashboard - Click Alabama Export icon', + action: async () => { + await driver.findElement(By.css('#stdbody > tr:nth-child(1) > .text-center:nth-child(2) img')).click(); + console.log('----->| NEXT ACTION: Clicked Alabama Export icon'); + + //Wait until the modal title is located AND visible + await driver.wait(async () => { + try { + const element = await driver.findElement(By.css('.modal-lg .modal-title')); + return await element.isDisplayed(); + } catch (e) { + return false; //Element not ready yet, keep waiting + } + }, 20000, 'Modal did not become visible within 20 seconds'); + + console.log('Passed: DIV - Loaded successfully'); + } + }, + + //EXPORT STANDARD DIV + //DIV - Export Standards title + { + description: 'Validate DIV - Export Standards title text, color, and size', + action: async () => { + const multipleChecks = 'DIV - Export Standards title'; + const element = await driver.findElement(By.css('.modal-lg .modal-title')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Export Standards') { + console.log('Passed: DIV - Export Standards title matched as expected'); + } else { + errors.push(`Expected: DIV - "Export Standards"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: DIV - Export Standards title text font-family matched as expected'); + } else { + errors.push(`Expected: DIV - Export Standards title text font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '18px') { + console.log('Passed: DIV - Export Standards title text font-size matched as expected'); + } else { + errors.push(`Expected: DIV - Export Standards title text font-size "18px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: DIV - Export Standards title text color matched as expected'); + } else { + errors.push(`Expected: DIV - Export Standards title text color "rgba(40, 39, 90, 1)"'; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - Alabama sub-title + { + description: 'Validate DIV - Alabama sub-title text, color, and size', + action: async () => { + const multipleChecks = 'DIV - Alabama sub-title'; + const element = await driver.findElement(By.css('p > b')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Alabama') { + console.log('Passed: DIV - Alabama sub-title matched as expected'); + } else { + errors.push(`Expected: DIV - sub-title "Alabama"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: DIV - Alabama sub-title text font-family matched as expected'); + } else { + errors.push(`Expected: DIV - Alabama sub-title text font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '13px') { + console.log('Passed: DIV - Alabama sub-title text font-size matched as expected'); + } else { + errors.push(`Expected: DIV - Alabama sub-title text font-size "13px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: DIV - Alabama sub-title text color matched as expected'); + } else { + errors.push(`Expected: DIV - Alabama sub-title text color "rgba(40, 39, 90, 1)"'; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - Alabama Standards Subject label + { + description: 'Validate DIV - Alabama Standards Subject label text, color, and size', + action: async () => { + const multipleChecks = 'DIV - Alabama Standards Subject label'; + const element = await driver.findElement(By.css('.form-row:nth-child(2) > .form-group:nth-child(1) > label')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Subject') { + console.log('Passed: DIV - Alabama Standards Subject label matched as expected'); + } else { + errors.push(`Expected: DIV - "Subject" label; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: DIV - Alabama Standards Subject label text font-family matched as expected'); + } else { + errors.push(`Expected: DIV - Alabama Standards Subject label text font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '15px') { + console.log('Passed: DIV - Alabama Standards Subject label text font-size matched as expected'); + } else { + errors.push(`Expected: DIV - Alabama Standards Subject label text font-size "15px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: DIV - Alabama Standards Subject label text color matched as expected'); + } else { + errors.push(`Expected: DIV - Alabama Standards Subject label text color "rgba(40, 39, 90, 1)"'; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - Subject dropdown {custom-select} + { + description: 'Validate DIV - Subject dropdown list and value', + action: async () => { + const multipleChecks = 'DIV - Subject dropdown'; + const elementDropdown = await driver.findElement(By.css('#exsubject')); + const selectedOption = await elementDropdown.findElement(By.css('option:checked')); + + const elementText = await selectedOption.getText(); + const elementFont = await selectedOption.getCssValue('font-family'); + const elementSize = await selectedOption.getCssValue('font-size'); + const elementColor = await selectedOption.getCssValue('color'); + + const options = await elementDropdown.findElements(By.css('option')); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Choose a subject') { + console.log('Passed: DIV - Subject dropdown text matched as expected'); + } else { + throw new Error(`Expected: DIV - Subject: "Choose a subject"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: DIV - Subject dropdown font-family matched as expected'); + } else { + errors.push(`Expected: DIV - Subject dropdown font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '13px') { + console.log('Passed: DIV - Subject dropdown font-size matched as expected'); + } else { + errors.push(`Expected: DIV - Subject dropdown font-size "13px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: DIV - Subject dropdown color matched as expected'); + } else { + errors.push(`Expected: DIV - Subject dropdown color: "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`); + } + + const expectedList = [ + 'Choose a subject', + 'Health and PE', + 'Language Arts', + 'Mathematics', + 'Science', + 'Social Studies', + 'Technology Education' + ]; + + const actual = []; + + for (const opt of options) { + const text = (await opt.getText()).trim(); + actual.push(text); + } + + if (JSON.stringify(actual) === JSON.stringify(expectedList)) { + console.log('Passed: DIV - Subject Dropdown list matched as expected'); + } else { + errors.push(`Expected: DIV - Subject Dropdown list: ${JSON.stringify(expectedList)}, Actual: ${JSON.stringify(actual)}`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - Alabama Standards Format label + { + description: 'Validate DIV - Alabama Standards Format label text, color, and size', + action: async () => { + const multipleChecks = 'DIV - Alabama Standards Format label'; + const element = await driver.findElement(By.css('.form-row:nth-child(2) > .form-group:nth-child(2) > label')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Format') { + console.log('Passed: DIV - Alabama Standards Format label matched as expected'); + } else { + errors.push(`Expected: DIV - "Format" label; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: DIV - Alabama Standards Format label font-family matched as expected'); + } else { + errors.push(`Expected: DIV - Alabama Standards Format label font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '15px') { + console.log('Passed: DIV - Alabama Standards Format label text font-size matched as expected'); + } else { + errors.push(`Expected: DIV - Alabama Standards Format label text font-size "15px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: DIV - Alabama Standards Format label text color matched as expected'); + } else { + errors.push(`Expected: DIV - Alabama Standards Format label text color "rgba(40, 39, 90, 1)"'; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - Format dropdown + { + description: 'Validate DIV - Format dropdown list and value', + action: async () => { + const multipleChecks = 'DIV - Format dropdown'; + const elementDropdown = await driver.findElement(By.css('#exformat')); + const selectedOption = await elementDropdown.findElement(By.css('option:checked')); + + const elementText = await selectedOption.getText(); + const elementFont = await selectedOption.getCssValue('font-family'); + const elementSize = await selectedOption.getCssValue('font-size'); + const elementColor = await selectedOption.getCssValue('color'); + + const options = await elementDropdown.findElements(By.css('option')); + + //Track all errors + const errors = []; + + //text + if (elementText === 'CSV') { + console.log('Passed: DIV - Format dropdown text matched as expected'); + } else { + throw new Error(`Expected: DIV - Format: "CSV"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: DIV - Format dropdown font-family matched as expected'); + } else { + errors.push(`Expected: DIV - Format dropdown font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '13px') { + console.log('Passed: DIV - Format dropdown font-size matched as expected'); + } else { + errors.push(`Expected: DIV - Format dropdown font-size "13px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: DIV - Format dropdown color matched as expected'); + } else { + errors.push(`Expected: DIV - Format dropdown color: "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`); + } + + const expectedList = [ + 'CSV', + 'JSON' + ]; + + const actual = []; + + for (const opt of options) { + const text = (await opt.getText()).trim(); + actual.push(text); + } + + if (JSON.stringify(actual) === JSON.stringify(expectedList)) { + console.log('Passed: DIV - Format Dropdown list matched as expected'); + } else { + errors.push(`Expected: DIV - Format Dropdown list: ${JSON.stringify(expectedList)}, Actual: ${JSON.stringify(actual)}`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - Grades label + { + description: 'Validate DIV - Grades label text, color, and size', + action: async () => { + const multipleChecks = 'DIV - Grades label'; + const element = await driver.findElement(By.css('.col-md-12:nth-child(1) > label')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Grades') { + console.log('Passed: DIV - Grades label matched as expected'); + } else { + errors.push(`Expected: DIV - "Grades" label; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: DIV - Grades label font-family matched as expected'); + } else { + errors.push(`Expected: DIV - Grades label font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '15px') { + console.log('Passed: DIV - Grades label text font-size matched as expected'); + } else { + errors.push(`Expected: DIV - Grades label text font-size "15px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: DIV - Grades label text color matched as expected'); + } else { + errors.push(`Expected: DIV - Grades label text color "rgba(40, 39, 90, 1)"'; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - Grades dropdown + { + description: 'Validate DIV - Grades dropdown list and value', + action: async () => { + const multipleChecks = 'DIV - Grades dropdown'; + const elementDropdown = await driver.findElement(By.css('#exgrades')); + + const elementText = await elementDropdown.getText(); + const elementFont = await elementDropdown.getCssValue('font-family'); + const elementSize = await elementDropdown.getCssValue('font-size'); + const elementColor = await elementDropdown.getCssValue('color'); + + const options = await elementDropdown.findElements(By.css('option')); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Please select a subject first') { + console.log('Passed: DIV - Grades dropdown text matched as expected'); + } else { + throw new Error(`Expected: DIV - Grades: "Please select a subject first"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: DIV - Grades dropdown font-family matched as expected'); + } else { + errors.push(`Expected: DIV - Grades dropdown font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14px') { + console.log('Passed: DIV - Grades dropdown font-size matched as expected'); + } else { + errors.push(`Expected: DIV - Grades dropdown font-size "14px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: DIV - Grades dropdown color matched as expected'); + } else { + errors.push(`Expected: DIV - Grades dropdown color: "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`); + } + + const expectedList = [ + 'Please select a subject first' + ]; + + const actual = []; + + for (const opt of options) { + const text = (await opt.getText()).trim(); + actual.push(text); + } + + if (JSON.stringify(actual) === JSON.stringify(expectedList)) { + console.log('Passed: DIV - Grades Dropdown list matched as expected'); + } else { + errors.push(`Expected: DIV - Grades Dropdown list: ${JSON.stringify(expectedList)}, Actual: ${JSON.stringify(actual)}`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - Download button + { + description: 'Validate DIV - Download button icon, text, and color', + action: async () => { + const multipleChecks = 'DIV - Download button'; + const elementIcon = await driver.findElement(By.css('#exsubmit > .fa')); + const element = await driver.findElement(By.css('#exsubmit')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + const elementButtonColor = await element.getCssValue('background-color'); + + //Track all errors + const errors = []; + + //icon + if (elementIcon) { + console.log('Passed: DIV - Download button icon is present'); + } else { + errors.push('DIV - Download button icon was not found'); + } + + //text + if (elementText === 'Download') { + console.log('Passed: DIV - Download button text matched as expected'); + } else { + errors.push(`Expected: DIV - Button text: "Download"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: DIV - Download button text font-family matched as expected'); + } else { + errors.push(`Expected: DIV - Download button text font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '16px') { + console.log('Passed: DIV - Download button text font-size matched as expected'); + } else { + errors.push(`Expected: DIV - Download button text font-size "16px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(255, 255, 255, 1)') { + console.log('Passed: DIV - Download button text color matched as expected'); + } else { + errors.push(`Expected: DIV - Download button text color: "rgba(255, 255, 255, 1)"; Actual: "${elementColor}"`); + } + + //button color + if (elementButtonColor === 'rgba(48, 200, 172, 1)') { + console.log('Passed: DIV - Download button background color matched as expected'); + } else { + errors.push(`Expected: DIV - Download button background color: "rgba(48, 200, 172, 1)"; Actual: "${elementButtonColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - Close button + { + description: 'Validate DIV - Close button text, style, font, and color', + action: async () => { + const multipleChecks = 'DIV - Close button'; + const element = await driver.findElement(By.css('#modalclose')); + + //Get text, font, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + const elementButtonColor = await element.getCssValue('background-color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Close') { + console.log('Passed: DIV - Close button text matched as expected'); + } else { + errors.push(`Expected: DIV - Button text: "Close"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: DIV - Close button text font-family matched as expected'); + } else { + errors.push(`Expected: DIV - Close button text font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '16px') { + console.log('Passed: DIV - Close button text font-size matched as expected'); + } else { + errors.push(`Expected: DIV - Close button text font-size "16px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: DIV - Close button text color matched as expected'); + } else { + errors.push(`Expected: DIV - Close button text color: "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`); + } + + //button color + if (elementButtonColor === 'rgba(0, 0, 0, 0)') { + console.log('Passed: DIV - Close button background color matched as expected'); + } else { + errors.push(`Expected: DIV - Close button background color: "rgba(0, 0, 0, 0)"; Actual: "${elementButtonColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //NEXT ACTION + { + description: 'DIV - Click Export button', + action: async () => { + await driver.findElement(By.css('#exsubmit')).click(); + console.log('----->| NEXT ACTION: Clicked Export button'); + + //Wait until the modal title is located AND visible + await driver.wait(async () => { + try { + const element = await driver.findElement(By.css('#metawarn > b')); + return await element.isDisplayed(); + } catch (e) { + return false; //Element not ready yet, keep waiting + } + }, 20000, 'Validation text not visible within 20 seconds'); + + console.log('Passed: DIV - Validation message appeared'); + } + }, + + //DIV - Validation + { + description: 'Validate DIV - Validation text, color, and size', + action: async () => { + const element = await driver.findElement(By.css('#metawarn > b')); + + //Get text, color, and size + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color') + + //Track all errors + const errors = []; + + //text + if (elementText === 'A subject and at least one grade must be selected.') { + console.log('Passed: DIV - Validation text matched as expected'); + } else { + errors.push(`Expected: DIV - Validation text: "A subject and at least one grade must be selected."; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: DIV - Validation text font-family matched as expected'); + } else { + errors.push(`Expected: DIV - Validation text font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '13px') { + console.log('Passed: DIV - Validation text font-size matched as expected'); + } else { + errors.push(`Expected: DIV - Validation text font-size "13px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(220, 53, 69, 1)') { + console.log('Passed: DIV - Validation text color matched as expected'); + } else { + errors.push(`Expected: DIV - Validation text color: "rgba(220, 53, 69, 1)"; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift('Multiple validation checks did not pass'); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //NEXT ACTION + { + description: 'Select subject and grade', + action: async () => { + //Select "Mathematics" from dropdown + await driver.findElement(By.css('#exsubject')).click(); + await driver.sleep(2000); + await driver.findElement(By.css('#exsubject > option:nth-child(4)')).click(); + console.log('----->| NEXT ACTION: Selected Subject - Mathematics'); + + //Wait for the X clear icon (Select2 uses this class) + const clearGradesIcon = await driver.wait( + until.elementLocated(By.css('#exgrades + span .select2-selection__clear')), + 20000 + ); + + //Wait until visible + await driver.wait( + until.elementIsVisible(clearGradesIcon), + 20000 + ); + + //Click to clear grades + await clearGradesIcon.click(); + await driver.sleep(1000); + console.log('----->| NEXT ACTION: Clicked Grades X clear icon'); + + await driver.findElement(By.xpath("//li[contains(text(), '9')]")).click(); + await driver.sleep(1000); + + await driver.findElement(By.xpath("//li[contains(text(), '10')]")).click(); + await driver.sleep(1000); + + await driver.findElement(By.xpath("//li[contains(text(), '11')]")).click(); + await driver.sleep(1000); + + await driver.findElement(By.xpath("//li[contains(text(), '12')]")).click(); + await driver.sleep(1000); + + //Click away from dropdown list + await driver.findElement(By.css('#exform > div:nth-child(3) > div > span')).click(); + await driver.sleep(1000); + + console.log('----->| NEXT ACTION: Selected grades: 9, 10, 11, and 12'); + }, + }, + + //DIV - Grade 9 + { + description: 'Validate DIV - Grade 9', + action: async () => { + const multipleChecks = 'DIV - Grade 9'; + const elementIconToolTip = await driver.findElement(By.css('#select2-exgrades-container > li:nth-child(1) > button')).getAttribute('title'); + const element = await driver.findElement(By.css('#select2-exgrades-container > li:nth-child(1)')); + + const elementText = await element.getText(); + const elementToolTip = await element.getAttribute('title'); + + //Track all errors + const errors = []; + + //icon tool-tip + if (elementIconToolTip === 'Remove item') { + console.log('Passed: DIV - Grade 9 icon tool-tip text matched as expected'); + } else { + errors.push(`Expected: DIV - Grade 9 icon tool-tip text: "Remove item"; Actual: "${elementIconToolTip}"`); + } + + //text + if (elementText.includes('9')) { + console.log('Passed: DIV - Grades selection included "9" text matched as expected'); + } else { + throw new Error(`Expected: DIV - Grades selection: "9"; Actual: "${elementText}"`); + } + + //tool-tip + if (elementToolTip === '9') { + console.log('Passed: DIV - Grade 9 tool-tip text matched as expected'); + } else { + errors.push(`Expected: DIV - Grade 9 tool-tip text: "9"; Actual: "${elementToolTip}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - Grade 10 + { + description: 'Validate DIV - Grade 10', + action: async () => { + const multipleChecks = 'DIV - Grade 10'; + const elementIconToolTip = await driver.findElement(By.css('#select2-exgrades-container > li:nth-child(2) > button')).getAttribute('title'); + const element = await driver.findElement(By.css('#select2-exgrades-container > li:nth-child(2)')); + + const elementText = await element.getText(); + const elementToolTip = await element.getAttribute('title'); + + //Track all errors + const errors = []; + + //icon tool-tip + if (elementIconToolTip === 'Remove item') { + console.log('Passed: DIV - Grade 10 icon tool-tip text matched as expected'); + } else { + errors.push(`Expected: DIV - Grade 10 icon tool-tip text: "Remove item"; Actual: "${elementIconToolTip}"`); + } + + //text + if (elementText.includes('10')) { + console.log('Passed: DIV - Grades selection included "10" text matched as expected'); + } else { + throw new Error(`Expected: DIV - Grades selection: "10"; Actual: "${elementText}"`); + } + + //tool-tip + if (elementToolTip === '10') { + console.log('Passed: DIV - Grade 10 tool-tip text matched as expected'); + } else { + errors.push(`Expected: DIV - Grade 10 tool-tip text: "9"; Actual: "${elementToolTip}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - Grade 11 + { + description: 'Validate DIV - Grade 11', + action: async () => { + const multipleChecks = 'DIV - Grade 11'; + const elementIconToolTip = await driver.findElement(By.css('#select2-exgrades-container > li:nth-child(3) > button')).getAttribute('title'); + const element = await driver.findElement(By.css('#select2-exgrades-container > li:nth-child(3)')); + + const elementText = await element.getText(); + const elementToolTip = await element.getAttribute('title'); + + //Track all errors + const errors = []; + + //icon tool-tip + if (elementIconToolTip === 'Remove item') { + console.log('Passed: DIV - Grade 11 icon tool-tip text matched as expected'); + } else { + errors.push(`Expected: DIV - Grade 11 icon tool-tip text: "Remove item"; Actual: "${elementIconToolTip}"`); + } + + //text + if (elementText.includes('11')) { + console.log('Passed: DIV - Grades selection included "11" text matched as expected'); + } else { + throw new Error(`Expected: DIV - Grades selection: "11"; Actual: "${elementText}"`); + } + + //tool-tip + if (elementToolTip === '11') { + console.log('Passed: DIV - Grade 11 tool-tip text matched as expected'); + } else { + errors.push(`Expected: DIV - Grade 11 tool-tip text: "9"; Actual: "${elementToolTip}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - Grade 12 + { + description: 'Validate DIV - Grade 12', + action: async () => { + const multipleChecks = 'DIV - Grade 12'; + const elementIconToolTip = await driver.findElement(By.css('#select2-exgrades-container > li:nth-child(4) > button')).getAttribute('title'); + const element = await driver.findElement(By.css('#select2-exgrades-container > li:nth-child(4)')); + + const elementText = await element.getText(); + const elementToolTip = await element.getAttribute('title'); + + //Track all errors + const errors = []; + + //icon tool-tip + if (elementIconToolTip === 'Remove item') { + console.log('Passed: DIV - Grade 12 icon tool-tip text matched as expected'); + } else { + errors.push(`Expected: DIV - Grade 12 icon tool-tip text: "Remove item"; Actual: "${elementIconToolTip}"`); + } + + //text + if (elementText.includes('12')) { + console.log('Passed: DIV - Grades selection included "12" text matched as expected'); + } else { + throw new Error(`Expected: DIV - Grades selection: "12"; Actual: "${elementText}"`); + } + + //tool-tip + if (elementToolTip === '12') { + console.log('Passed: DIV - Grade 12 tool-tip text matched as expected'); + } else { + errors.push(`Expected: DIV - Grade 12 tool-tip text: "9"; Actual: "${elementToolTip}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //NEXT ACTION + { + description: 'DIV - Click Export button then Close DIV', + action: async () => { + const multipleChecks = 'DIV - Processing status'; + + const errors = []; + + //Capture styles immediately via executeScript BEFORE clicking + //This sets up a MutationObserver to catch the spinner the moment it appears + await driver.executeScript(` + window._spinnerStyles = null; + const observer = new MutationObserver(() => { + const el = document.querySelector('#modalspin strong'); + if (el) { + const style = window.getComputedStyle(el); + const spinDiv = document.querySelector('#modalspin'); + const spinStyle = window.getComputedStyle(spinDiv); + if (spinStyle.display !== 'none') { + window._spinnerStyles = { + text: el.textContent.trim(), + fontFamily: style.getPropertyValue('font-family'), + fontSize: style.getPropertyValue('font-size'), + color: style.getPropertyValue('color') + }; + observer.disconnect(); + } + } + }); + observer.observe(document.querySelector('#modalspin'), { + attributes: true, + attributeFilter: ['style'] + }); + `); + + //Now click Export + await driver.findElement(By.css('#exsubmit')).click(); + console.log('----->| NEXT ACTION: Clicked Export button'); + + //Wait for MutationObserver to capture the styles + await driver.wait(async () => { + const captured = await driver.executeScript(`return window._spinnerStyles !== null;`); + return captured; + }, 15000, 'Processing spinner styles were not captured within 15 seconds'); + + //Get the captured styles + const styles = await driver.executeScript(`return window._spinnerStyles;`); + //console.log('----->| DEBUG captured styles:', JSON.stringify(styles)); + + //text + if (styles.text === 'Processing...') { + console.log('Passed: DIV - Status text matched as expected'); + } else { + errors.push(`Expected: DIV - Status text: "Processing..."; Actual: "${styles.text}"`); + } + + //font + if (styles.fontFamily === 'Poppins, sans-serif') { + console.log('Passed: DIV - Processing... status text font-family matched as expected'); + } else { + errors.push(`Expected: DIV - Processing... status text font-family "Poppins, sans-serif"; Actual: "${styles.fontFamily}"`); + } + + //size + if (styles.fontSize === '23.4px') { + console.log('Passed: DIV - Processing... status text font-size matched as expected'); + } else { + errors.push(`Expected: DIV - Processing... status text font-size "23.4px"; Actual: "${styles.fontSize}"`); + } + + //color + if (styles.color === 'rgb(40, 39, 90)') { + console.log('Passed: DIV - Processing... status text color matched as expected'); + } else { + errors.push(`Expected: DIV - Processing... status text color "rgb(40, 39, 90)"; Actual: "${styles.color}"`); + } + + //Wait until processing is complete + await driver.wait(async () => { + try { + const spinDiv = await driver.findElement(By.css('#modalspin')); + return !(await spinDiv.isDisplayed()); + } catch (e) { + return true; + } + }, 30000, 'Processing... Status did not disappear within 30 seconds'); + console.log('Passed: Processing... Status is no longer visible as expected'); + + await driver.findElement(By.css('#modalclose')).click(); + console.log('----->| NEXT ACTION: Clicked Close button'); + + //Wait for page to load completely + await driver.wait(async () => { + const readyState = await driver.executeScript('return document.readyState'); + return readyState === 'complete'; + }, 20000, 'ExACT Dashboard did not fully load within 60 seconds'); + console.log('Passed: ExACT Dashboard loaded successfully'); + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //NEXT ACTION + { + description: 'Dashboard - Click Alabama More Info icon', + action: async () => { + await driver.findElement(By.css('#stdbody > tr:nth-child(1) > .text-center:nth-child(4) img')).click(); + console.log('----->| NEXT ACTION: Clicked Alabama More Info icon'); + + //Wait until the modal title is located AND visible + await driver.wait(async () => { + try { + const element = await driver.findElement(By.css('.modal-lg .modal-title')); + return await element.isDisplayed(); + } catch (e) { + return false; //Element not ready yet, keep waiting + } + }, 20000, 'Modal did not become visible within 20 seconds'); + + console.log('Passed: DIV - Loaded successfully'); + } + }, + + //Alabama Courses of Study DIV + //DIV - Alabama Courses of Study title + { + description: 'Validate DIV - Alabama Courses of Study title text, color, and size', + action: async () => { + const multipleChecks = 'DIV - Alabama Courses of Study title'; + const element = await driver.findElement(By.css('.modal-lg .modal-title')); + + //Get text, font, size, and color + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color') + + //Track all errors + const errors = []; + + //text + if (elementText === 'Alabama Courses of Study') { + console.log('Passed: DIV - Alabama Courses of Study title matched as expected'); + } else { + errors.push(`Expected: DIV - "Alabama Courses of Study"; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: DIV - Alabama Courses of Study title font-family matched as expected'); + } else { + errors.push(`Expected: DIV - Alabama Courses of Study title font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '18px') { + console.log('Passed: DIV - Alabama Courses of Study title text font-size matched as expected'); + } else { + errors.push(`Expected: DIV - Alabama Courses of Study title text font-size "18px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: DIV - Alabama Courses of Study title text color matched as expected'); + } else { + errors.push(`Expected: DIV - Alabama Courses of Study title text color "rgba(40, 39, 90, 1)"'; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - More Info Alabama sub-text + { + description: 'Validate DIV - More Info Alabma sub-text, color, and size', + action: async () => { + const multipleChecks = 'DIV - Alabama sut-text'; + const element = await driver.findElement(By.css('.modal-body > .notenabled')); + + //Get text, font, size, and color + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color') + + //Track all errors + const errors = []; + + //text + if (elementText === '*Not enabled in Profile. If you would like access to any of these standards sets, please Contact Us.') { + console.log('Passed: DIV - More Info Arizona sub-text matched as expected'); + } else { + errors.push(`Expected: DIV - sub-text "*Not enabled in Profile. If you would like access to any of these standards sets, please Contact Us."; Actual: "${elementText}"`); + } + + //font + if (elementFont === "Poppins, sans-serif") { + console.log('Passed: DIV - More Info Arizona sub-text font-family matched as expected'); + } else { + errors.push(`Expected: DIV - More Info Arizona sub-text font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '11.7px') { + console.log('Passed: DIV - More Info Arizona sub-text text font-size matched as expected'); + } else { + errors.push(`Expected: DIV - More Info Arizona sub-text text font-size "11.7px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(119, 119, 119, 1)') { + console.log('Passed: DIV - More Info Arizona sub-text color matched as expected'); + } else { + errors.push(`Expected: DIV - More Info Arizona sub-text text color "rgba(119, 119, 119, 1)"'; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - More Info Alabama Contact Us link + { + description: 'Validate DIV - More Info Alabama Contact Us link text, color, and size', + action: async () => { + const multipleChecks = 'DIV - Alabama Courses of Study Contact Us link'; + const element = await driver.findElement(By.linkText('Contact Us')); + + //Get text, font, size, color, url + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + const elementURL = await element.getAttribute('href'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Contact Us') { + console.log('Passed: DIV - More Info Alabama sub-text matched as expected'); + } else { + errors.push(`Expected: DIV - More Info Alabama sub-text "Contact Us"; Actual: "${elementText}"`); + } + + //font + if (elementFont === 'Poppins, sans-serif') { + console.log('Passed: DIV - More Info Alabama sub-text font-family matched as expected'); + } else { + errors.push(`Expected: DIV - More Info Alabama sub-text font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '11.7px') { + console.log('Passed: DIV - More Info Alabama Contact Us link text font-size matched as expected'); + } else { + errors.push(`Expected: DIV - More Info Alabama Contact Us link text font-size "11.7px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(48, 200, 172, 1)') { + console.log('Passed: DIV - More Info Alabama Contact Us link text color matched as expected'); + } else { + errors.push(`Expected: DIV - More Info Alabama Contact Us link text color "rgba(48, 200, 172, 1)"'; Actual: "${elementColor}"`); + } + + //url + if (elementURL === 'https://edgate.com/contact-us') { + console.log('Passed: DIV - More Info Alabama Contact Us URL link matched as expected'); + } else { + errors.push(`Expected: DIV - More Info Alabama Contact Us URL: "https://edgate.com/contact-us"; Actual: "${elementURL}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - More Info Alabama Subject column title + { + description: 'Validate DIV - More Info Alabama Subject column title text, color, and size', + action: async () => { + const multipleChecks = 'DIV - Alabama Courses of Study column title'; + const element = await driver.findElement(By.css('#myModal > div > div > div.modal-body > table > thead > tr > th:nth-child(1)')); + + //Get text, font, size, and color + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color') + + //Track all errors + const errors = []; + + //text + if (elementText === 'Subject') { + console.log('Passed: DIV - More Info Arizona Subject column title text matched as expected'); + } else { + errors.push(`Expected: DIV - Arizona column title "Subject"; Actual: "${elementText}"`); + } + + //font + if (elementFont === 'Poppins, sans-serif') { + console.log('Passed: DIV - More Info Arizona Subject column title font-family matched as expected'); + } else { + errors.push(`Expected: DIV - More Info Arizona Subject column title font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14px') { + console.log('Passed: DIV - More Info Arizona Subject column title text font-size matched as expected'); + } else { + errors.push(`Expected: DIV - More Info Arizona Subject column title text font-size "14px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(94, 105, 116, 1)') { + console.log('Passed: DIV - More Info Arizona Subject column title text color matched as expected'); + } else { + errors.push(`Expected: DIV - More Info Arizona Subject column title text color "rgba(94, 105, 116, 1)"'; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - More Info Alabama Adopted column title + { + description: 'Validate DIV - More Info Alabama Adopted column title text, color, and size', + action: async () => { + const multipleChecks = 'DIV - Alabama Courses of Study Adopted column title'; + const element = await driver.findElement(By.css('#myModal > div > div > div.modal-body > table > thead > tr > th:nth-child(2)')); + + //Get text, font, size, and color + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color') + + //Track all errors + const errors = []; + + //text + if (elementText === 'Adopted') { + console.log('Passed: DIV - More Info Arizona Adopted column title text matched as expected'); + } else { + errors.push(`Expected: DIV - Arizona column title "Adopted"; Actual: "${elementText}"`); + } + + //font + if (elementFont === 'Poppins, sans-serif') { + console.log('Passed: DIV - More Info Arizona Adopted column title font-family matched as expected'); + } else { + errors.push(`Expected: DIV - More Info Arizona Adopted column title font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14px') { + console.log('Passed: DIV - More Info Arizona Adopted column title text font-size matched as expected'); + } else { + errors.push(`Expected: DIV - More Info Arizona Adopted column title text font-size "14px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(94, 105, 116, 1)') { + console.log('Passed: DIV - More Info Arizona Adopted column title text color matched as expected'); + } else { + errors.push(`Expected: DIV - More Info Arizona Adopted column title text color "rgba(94, 105, 116, 1)"'; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - More Info Alabama Grades column title + { + description: 'Validate DIV - More Info Alabama Grades column title text, color, and size', + action: async () => { + const multipleChecks = 'DIV - Alabama Courses of Study Grades column title'; + const element = await driver.findElement(By.css('#myModal > div > div > div.modal-body > table > thead > tr > th:nth-child(3)')); + + //Get text, font, size, and color + const elementText = await element.getText(''); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color') + + //Track all errors + const errors = []; + + //text + if (elementText === 'Grades') { + console.log('Passed: DIV - More Info Arizona Grades column title text matched as expected'); + } else { + errors.push(`Expected: DIV - Arizona column title "Grades"; Actual: "${elementText}"`); + } + + //font + if (elementFont === 'Poppins, sans-serif') { + console.log('Passed: DIV - More Info Arizona Grades column title font-family matched as expected'); + } else { + errors.push(`Expected: DIV - More Info Arizona Grades column title font-family "Poppins, sans-serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '14px') { + console.log('Passed: DIV - More Info Arizona Grades column title text font-size matched as expected'); + } else { + errors.push(`Expected: DIV - More Info Arizona Grades column title text font-size "14px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(94, 105, 116, 1)') { + console.log('Passed: DIV - More Info Arizona Grades column title text color matched as expected'); + } else { + errors.push(`Expected: DIV - More Info Arizona Grades column title text color "rgba(94, 105, 116, 1)"'; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - More Info Alabama Row 1 label + { + description: 'Validate DIV - More Info Alabama Row 1 label text, font, color, and size', + action: async () => { + const multipleChecks = 'DIV - More Info Alabama Row 1 label'; + + const checks = [ + //Subject + { + selector: '.text-success:nth-child(1) > td:nth-child(1)', + label: 'Health and PE', + expected: { + text: 'Health and PE', + font: 'Poppins, sans-serif', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + }, + + //Adopted + { + selector: '.text-success:nth-child(1) > td:nth-child(2)', + label: '2019', + expected: { + text: '2019', + font: 'Poppins, sans-serif', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + }, + + //All Grades list + { + selector: '.text-success:nth-child(1) > td:nth-child(3)', + label: 'Grades List', + expected: { + text: 'K, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12', + font: 'Poppins, sans-serif', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + } + ]; + + const allErrors = []; + + async function validateCell({ selector, label, expected }) { + const element = await driver.findElement(By.css(selector)); + + const actualText = await element.getText(); + const actualFont = await element.getCssValue('font-family'); + const actualSize = await element.getCssValue('font-size'); + const actualColor = await element.getCssValue('color'); + + const errors = []; + + //text + if (actualText === expected.text) { + console.log(`Passed: DIV - More Info Alabama Row 1 ${label} label text matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 1 "${expected.text}"; Actual: "${actualText}"`); + } + + //font + if (actualFont === expected.font) { + console.log(`Passed: DIV - More Info Alabama Row 1 ${label} label text font-family matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 1 "${expected.font}"; Actual: "${actualFont}"`); + } + + //size + if (actualSize === expected.size) { + console.log(`Passed: DIV - More Info Alabama Row 1 ${label} label text font-size matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 1 ${label} label text font-size "${expected.size}"; Actual: "${actualSize}"`); + } + + //color + if (actualColor === expected.color) { + console.log(`Passed: DIV - More Info Alabama Row 1 ${label} label text color matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 1 ${label} label text color "${expected.color}"; Actual: "${actualColor}"`); + } + + return errors; + } + + for (const check of checks) { + const errs = await validateCell(check); + allErrors.push(...errs); + } + + if (allErrors.length > 0) { + if (allErrors.length > 1) allErrors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + throw new Error(allErrors.join('\n')); + } + } + }, + + //DIV - More Info Alabama Row 2 label + { + description: 'Validate DIV - More Info Alabama Row 2 label text, font, color, and size', + action: async () => { + const multipleChecks = 'DIV - More Info Alabama Row 2 label'; + + const checks = [ + //Subject + { + selector: '.text-success:nth-child(2) > td:nth-child(1)', + label: 'Language Arts', + expected: { + text: 'Language Arts', + font: 'Poppins, sans-serif', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + }, + + //Adopted + { + selector: '.text-success:nth-child(2) > td:nth-child(2)', + label: '2021/Effective 2022', + expected: { + text: '2021/Effective 2022', + font: 'Poppins, sans-serif', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + }, + + //All Grades list + { + selector: '.text-success:nth-child(2) > td:nth-child(3)', + label: 'Grades List', + expected: { + text: 'K, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12', + font: 'Poppins, sans-serif', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + } + ]; + + const allErrors = []; + + async function validateCell({ selector, label, expected }) { + const element = await driver.findElement(By.css(selector)); + + const actualText = await element.getText(); + const actualFont = await element.getCssValue('font-family'); + const actualSize = await element.getCssValue('font-size'); + const actualColor = await element.getCssValue('color'); + + const errors = []; + + //text + if (actualText === expected.text) { + console.log(`Passed: DIV - More Info Alabama Row 2 ${label} label text matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 2 "${expected.text}"; Actual: "${actualText}"`); + } + + //font + if (actualFont === expected.font) { + console.log(`Passed: DIV - More Info Alabama Row 2 ${label} label text font matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 2 "${expected.font}"; Actual: "${actualFont}"`); + } + + //size + if (actualSize === expected.size) { + console.log(`Passed: DIV - More Info Alabama Row 2 ${label} label text font-size matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 2 ${label} label text font-size "${expected.size}"; Actual: "${actualSize}"`); + } + + //color + if (actualColor === expected.color) { + console.log(`Passed: DIV - More Info Alabama Row 2 ${label} label text color matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 2 ${label} label text color "${expected.color}"; Actual: "${actualColor}"`); + } + + return errors; + } + + for (const check of checks) { + const errs = await validateCell(check); + allErrors.push(...errs); + } + + if (allErrors.length > 0) { + if (allErrors.length > 1) allErrors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + throw new Error(allErrors.join('\n')); + } + } + }, + + //DIV - More Info Alabama Row 3 label + { + description: 'Validate DIV - More Info Alabama Row 3 label text, color, and font size', + action: async () => { + const multipleChecks = 'DIV - More Info Alabama Row 3 label'; + + const checks = [ + //Subject + { + selector: '.text-success:nth-child(3) > td:nth-child(1)', + label: 'Mathematics', + expected: { + text: 'Mathematics', + font: 'Poppins, sans-serif', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + }, + + //Adopted + { + selector: '.text-success:nth-child(3) > td:nth-child(2)', + label: '2019/Impl. 2020', + expected: { + text: '2019/Impl. 2020', + font: 'Poppins, sans-serif', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + }, + + //All Grades list + { + selector: '.text-success:nth-child(3) > td:nth-child(3)', + label: 'Grades List', + expected: { + text: 'K, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12', + font: 'Poppins, sans-serif', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + } + ]; + + const allErrors = []; + + async function validateCell({ selector, label, expected }) { + const element = await driver.findElement(By.css(selector)); + + const actualText = await element.getText(); + const actualFont = await element.getCssValue('font-family'); + const actualSize = await element.getCssValue('font-size'); + const actualColor = await element.getCssValue('color'); + + const errors = []; + + //text + if (actualText === expected.text) { + console.log(`Passed: DIV - More Info Alabama Row 3 ${label} label text matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 3 "${expected.text}"; Actual: "${actualText}"`); + } + + //font + if (actualFont === expected.font) { + console.log(`Passed: DIV - More Info Alabama Row 3 ${label} label text font matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 3 "${expected.font}"; Actual: "${actualFont}"`); + } + + //size + if (actualSize === expected.size) { + console.log(`Passed: DIV - More Info Alabama Row 3 ${label} label text font-size matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 3 ${label} label text font-size "${expected.size}"; Actual: "${actualSize}"`); + } + + //color + if (actualColor === expected.color) { + console.log(`Passed: DIV - More Info Alabama Row 3 ${label} label text color matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 3 ${label} label text color "${expected.color}"; Actual: "${actualColor}"`); + } + + return errors; + } + + for (const check of checks) { + const errs = await validateCell(check); + allErrors.push(...errs); + } + + if (allErrors.length > 0) { + if (allErrors.length > 1) allErrors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + throw new Error(allErrors.join('\n')); + } + } + }, + + //DIV - More Info Alabama Row 4 label + { + description: 'Validate DIV - More Info Alabama Row 4 label text, color, and font size', + action: async () => { + const multipleChecks = 'DIV - More Info Alabama Row 4 label'; + + const checks = [ + //Subject + { + selector: '.text-success:nth-child(4) > td:nth-child(1)', + label: 'Science', + expected: { + text: 'Science', + font: 'Poppins, sans-serif', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + }, + + //Adopted + { + selector: '.text-success:nth-child(4) > td:nth-child(2)', + label: '2023', + expected: { + text: '2023', + font: 'Poppins, sans-serif', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + }, + + //All Grades list + { + selector: '.text-success:nth-child(4) > td:nth-child(3)', + label: 'Grades List', + expected: { + text: 'K, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12', + font: 'Poppins, sans-serif', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + } + ]; + + const allErrors = []; + + async function validateCell({ selector, label, expected }) { + const element = await driver.findElement(By.css(selector)); + + const actualText = await element.getText(); + const actualFont = await element.getCssValue('font-family'); + const actualSize = await element.getCssValue('font-size'); + const actualColor = await element.getCssValue('color'); + + const errors = []; + + //text + if (actualText === expected.text) { + console.log(`Passed: DIV - More Info Alabama Row 4 ${label} label text matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 4 "${expected.text}"; Actual: "${actualText}"`); + } + + //font + if (actualFont === expected.font) { + console.log(`Passed: DIV - More Info Alabama Row 4 ${label} label text font matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 4 "${expected.font}"; Actual: "${actualFont}"`); + } + + //size + if (actualSize === expected.size) { + console.log(`Passed: DIV - More Info Alabama Row 4 ${label} label text font-size matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 4 ${label} label text font-size "${expected.size}"; Actual: "${actualSize}"`); + } + + //color + if (actualColor === expected.color) { + console.log(`Passed: DIV - More Info Alabama Row 4 ${label} label text color matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 4 ${label} label text color "${expected.color}"; Actual: "${actualColor}"`); + } + + return errors; + } + + for (const check of checks) { + const errs = await validateCell(check); + allErrors.push(...errs); + } + + if (allErrors.length > 0) { + if (allErrors.length > 1) allErrors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + throw new Error(allErrors.join('\n')); + } + } + }, + + //DIV - More Info Alabama Row 5 label + { + description: 'Validate DIV - More Info Alabama Row 5 label text, color, and font size', + action: async () => { + const multipleChecks = 'DIV - More Info Alabama Row 5 label'; + + const checks = [ + //Subject + { + selector: '.text-success:nth-child(5) > td:nth-child(1)', + label: 'Social Studies', + expected: { + text: 'Social Studies', + font: 'Poppins, sans-serif', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + }, + + //Adopted + { + selector: '.text-success:nth-child(5) > td:nth-child(2)', + label: '2024', + expected: { + text: '2024', + font: 'Poppins, sans-serif', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + }, + + //All Grades list + { + selector: '.text-success:nth-child(5) > td:nth-child(3)', + label: 'Grades List', + expected: { + text: 'K, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12', + font: 'Poppins, sans-serif', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + } + ]; + + const allErrors = []; + + async function validateCell({ selector, label, expected }) { + const element = await driver.findElement(By.css(selector)); + + const actualText = await element.getText(); + const actualFont = await element.getCssValue('font-family'); + const actualSize = await element.getCssValue('font-size'); + const actualColor = await element.getCssValue('color'); + + const errors = []; + + //text + if (actualText === expected.text) { + console.log(`Passed: DIV - More Info Alabama Row 5 ${label} label text matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 5 "${expected.text}"; Actual: "${actualText}"`); + } + + //font + if (actualFont === expected.font) { + console.log(`Passed: DIV - More Info Alabama Row 5 ${label} label text font matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 5 "${expected.font}"; Actual: "${actualFont}"`); + } + + //size + if (actualSize === expected.size) { + console.log(`Passed: DIV - More Info Alabama Row 5 ${label} label text font-size matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 5 ${label} label text font-size "${expected.size}"; Actual: "${actualSize}"`); + } + + //color + if (actualColor === expected.color) { + console.log(`Passed: DIV - More Info Alabama Row 5 ${label} label text color matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 5 ${label} label text color "${expected.color}"; Actual: "${actualColor}"`); + } + + return errors; + } + + for (const check of checks) { + const errs = await validateCell(check); + allErrors.push(...errs); + } + + if (allErrors.length > 0) { + if (allErrors.length > 1) allErrors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + throw new Error(allErrors.join('\n')); + } + } + }, + + //DIV - More Info Alabama Row 6 label + { + description: 'Validate DIV - More Info Alabama Row 6 label text, color, and font size', + action: async () => { + const multipleChecks = 'DIV - More Info Alabama Row 6 label'; + + const checks = [ + //Subject + { + selector: '.text-success:nth-child(6) > td:nth-child(1)', + label: 'Technology Education', + expected: { + text: 'Technology Education', + font: 'Poppins, sans-serif', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + }, + + //Adopted + { + selector: '.text-success:nth-child(6) > td:nth-child(2)', + label: '2025', + expected: { + text: '2025', + font: 'Poppins, sans-serif', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + }, + + //All Grades list + { + selector: '.text-success:nth-child(6) > td:nth-child(3)', + label: 'Grades List', + expected: { + text: 'K, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12', + font: 'Poppins, sans-serif', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + } + ]; + + const allErrors = []; + + async function validateCell({ selector, label, expected }) { + const element = await driver.findElement(By.css(selector)); + + const actualText = await element.getText(); + const actualFont = await element.getCssValue('font-family'); + const actualSize = await element.getCssValue('font-size'); + const actualColor = await element.getCssValue('color'); + + const errors = []; + + //text + if (actualText === expected.text) { + console.log(`Passed: DIV - More Info Alabama Row 6 ${label} label text matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 6 "${expected.text}"; Actual: "${actualText}"`); + } + + //font + if (actualFont === expected.font) { + console.log(`Passed: DIV - More Info Alabama Row 6 ${label} label text font matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 6 "${expected.font}"; Actual: "${actualFont}"`); + } + + //size + if (actualSize === expected.size) { + console.log(`Passed: DIV - More Info Alabama Row 6 ${label} label text font-size matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 6 ${label} label text font-size "${expected.size}"; Actual: "${actualSize}"`); + } + + //color + if (actualColor === expected.color) { + console.log(`Passed: DIV - More Info Alabama Row 6 ${label} label text color matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 6 ${label} label text color "${expected.color}"; Actual: "${actualColor}"`); + } + + return errors; + } + + for (const check of checks) { + const errs = await validateCell(check); + allErrors.push(...errs); + } + + if (allErrors.length > 0) { + if (allErrors.length > 1) allErrors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + throw new Error(allErrors.join('\n')); + } + } + }, + + //DIV - More Info Alabama Row 7 label + { + description: 'Validate DIV - More Info Alabama Row 7 label text, color, and font size', + action: async () => { + const multipleChecks = 'DIV - More Info Alabama Row 7 label'; + + const checks = [ + //Subject + { + selector: '.notenabled:nth-child(7) > td:nth-child(1)', + label: 'Arts Education*', + expected: { + text: 'Arts Education*', + font: 'Poppins, sans-serif', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + + //Adopted + { + selector: '.notenabled:nth-child(7) > td:nth-child(2)', + label: '2024', + expected: { + text: '2024', + font: 'Poppins, sans-serif', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + + //Grades + { + selector: '.notenabled:nth-child(7) > td:nth-child(3)', + label: 'Grades List', + expected: { + text: 'K, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12', + font: 'Poppins, sans-serif', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + } + ]; + + const allErrors = []; + + async function validateCell({ selector, label, expected }) { + const element = await driver.findElement(By.css(selector)); + + const actualText = await element.getText(); + const actualFont = await element.getCssValue('font-family'); + const actualSize = await element.getCssValue('font-size'); + const actualColor = await element.getCssValue('color'); + + const errors = []; + + //text + if (actualText === expected.text) { + console.log(`Passed: DIV - More Info Alabama Row 7 ${label} label text matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 7 "${expected.text}"; Actual: "${actualText}"`); + } + + //font + if (actualFont === expected.font) { + console.log(`Passed: DIV - More Info Alabama Row 7 ${label} label text font matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 7 "${expected.font}"; Actual: "${actualFont}"`); + } + + //size + if (actualSize === expected.size) { + console.log(`Passed: DIV - More Info Alabama Row 7 ${label} label text font-size matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 7 ${label} label text font-size "${expected.size}"; Actual: "${actualSize}"`); + } + + //color + if (actualColor === expected.color) { + console.log(`Passed: DIV - More Info Alabama Row 7 ${label} label text color matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 7 ${label} label text color "${expected.color}"; Actual: "${actualColor}"`); + } + + return errors; + } + + for (const check of checks) { + const errs = await validateCell(check); + allErrors.push(...errs); + } + + if (allErrors.length > 0) { + if (allErrors.length > 1) allErrors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + throw new Error(allErrors.join('\n')); + } + } + }, + + //DIV - More Info Alabama Row 8 label + { + description: 'Validate DIV - More Info Alabama Row 8 label text, color, and font size', + action: async () => { + const multipleChecks = 'DIV - More Info Alabama Row 8 label'; + + const checks = [ + //Subject + { + selector: '.notenabled:nth-child(8) > td:nth-child(1)', + label: 'Career Development*', + expected: { + text: 'Career Development*', + font: 'Poppins, sans-serif', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + + //Adopted + { + selector: '.notenabled:nth-child(8) > td:nth-child(2)', + label: '2016', + expected: { + text: '2016', + font: 'Poppins, sans-serif', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + + //All Grades list + { + selector: '.notenabled:nth-child(8) > td:nth-child(3)', + label: 'Grades List', + expected: { + text: '9, 10, 11, 12', + font: 'Poppins, sans-serif', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + } + ]; + + const allErrors = []; + + async function validateCell({ selector, label, expected }) { + const element = await driver.findElement(By.css(selector)); + + const actualText = await element.getText(); + const actualFont = await element.getCssValue('font-family'); + const actualSize = await element.getCssValue('font-size'); + const actualColor = await element.getCssValue('color'); + + const errors = []; + + //text + if (actualText === expected.text) { + console.log(`Passed: DIV - More Info Alabama Row 8 ${label} label text matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 8 "${expected.text}"; Actual: "${actualText}"`); + } + + //font + if (actualFont === expected.font) { + console.log(`Passed: DIV - More Info Alabama Row 8 ${label} label text font matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 8 "${expected.font}"; Actual: "${actualFont}"`); + } + + //size + if (actualSize === expected.size) { + console.log(`Passed: DIV - More Info Alabama Row 8 ${label} label text font-size matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 8 ${label} label text font-size "${expected.size}"; Actual: "${actualSize}"`); + } + + //color + if (actualColor === expected.color) { + console.log(`Passed: DIV - More Info Alabama Row 8 ${label} label text color matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 8 ${label} label text color "${expected.color}"; Actual: "${actualColor}"`); + } + + return errors; + } + + for (const check of checks) { + const errs = await validateCell(check); + allErrors.push(...errs); + } + + if (allErrors.length > 0) { + if (allErrors.length > 1) allErrors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + throw new Error(allErrors.join('\n')); + } + } + }, + + //DIV - More Info Alabama Row 9 label text + { + description: 'Validate DIV - More Info Alabama Row 9 label text, color, and font size', + action: async () => { + const multipleChecks = 'DIV - More Info Alabama Row 9 label'; + + const checks = [ + //Subject + { + selector: '.notenabled:nth-child(9) > td:nth-child(1)', + label: 'Early Childhood Education*', + expected: { + text: 'Early Childhood Education*', + font: 'Poppins, sans-serif', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + + //Adopted + { + selector: '.notenabled:nth-child(9) > td:nth-child(2)', + label: '2023', + expected: { + text: '2023', + font: 'Poppins, sans-serif', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + + //Ages 3-5* + { + selector: '.notenabled:nth-child(9) .notenabled', + label: 'Ages 3-5*', + expected: { + text: 'Ages 3-5*', + font: 'Poppins, sans-serif', + color: 'rgba(119, 119, 119, 1)', + size: '11.583px' + } + }, + + //All Grades list 1 + { + selector: '.notenabled:nth-child(2)', + label: 'Ages Birth to 12 months*', + expected: { + text: 'Ages Birth to 12 months*', + font: 'Poppins, sans-serif', + color: 'rgba(119, 119, 119, 1)', + size: '11.583px' + } + }, + + //All Grades list 2 + { + selector: '.notenabled:nth-child(3)', + label: 'Ages 13 to 24 months*', + expected: { + text: 'Ages 13 to 24 months*', + font: 'Poppins, sans-serif', + color: 'rgba(119, 119, 119, 1)', + size: '11.583px' + } + }, + + //All Grades list 3 + { + selector: '.notenabled:nth-child(4)', + label: 'Ages 25 to 36 months*', + expected: { + text: 'Ages 25 to 36 months*', + font: 'Poppins, sans-serif', + color: 'rgba(119, 119, 119, 1)', + size: '11.583px' + } + } + ]; + + const allErrors = []; + + async function validateCell({ selector, label, expected }) { + const element = await driver.findElement(By.css(selector)); + + const actualText = await element.getText(); + const actualFont = await element.getCssValue('font-family'); + const actualSize = await element.getCssValue('font-size'); + const actualColor = await element.getCssValue('color'); + + const errors = []; + + //text + if (actualText === expected.text) { + console.log(`Passed: DIV - More Info Alabama Row 9 ${label} label text matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 9 "${expected.text}"; Actual: "${actualText}"`); + } + + //font + if (actualFont === expected.font) { + console.log(`Passed: DIV - More Info Alabama Row 9 ${label} label text font matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 9 "${expected.font}"; Actual: "${actualFont}"`); + } + + //size + if (actualSize === expected.size) { + console.log(`Passed: DIV - More Info Alabama Row 9 ${label} label text font-size matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 9 ${label} label text font-size "${expected.size}"; Actual: "${actualSize}"`); + } + + //color + if (actualColor === expected.color) { + console.log(`Passed: DIV - More Info Alabama Row 9 ${label} label text color matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 9 ${label} label text color "${expected.color}"; Actual: "${actualColor}"`); + } + + return errors; + } + + for (const check of checks) { + const errs = await validateCell(check); + allErrors.push(...errs); + } + + if (allErrors.length > 0) { + if (allErrors.length > 1) allErrors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + throw new Error(allErrors.join('\n')); + } + } + }, + + //DIV - More Info Alabama Row 10 label text + { + description: 'Validate DIV - More Info Alabama Row 10 label text, color, and font size', + action: async () => { + const multipleChecks = 'DIV - More Info Alabama Row 10 label'; + + const checks = [ + //Subject + { + selector: '.notenabled:nth-child(10) > td:nth-child(1)', + label: 'English Language Learners*', + expected: { + text: 'English Language Learners*', + font: 'Poppins, sans-serif', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + + //Adopted + { + selector: '.notenabled:nth-child(10) > td:nth-child(2)', + label: '2020', + expected: { + text: '2020', + font: 'Poppins, sans-serif', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + + //All Grades list + { + selector: '.notenabled:nth-child(10) > td:nth-child(3)', + label: 'Grades List', + expected: { + text: 'K, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12', + font: 'Poppins, sans-serif', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + } + ]; + + const allErrors = []; + + async function validateCell({ selector, label, expected }) { + const element = await driver.findElement(By.css(selector)); + + const actualText = await element.getText(); + const actualFont = await element.getCssValue('font-family'); + const actualSize = await element.getCssValue('font-size'); + const actualColor = await element.getCssValue('color'); + + const errors = []; + + //text + if (actualText === expected.text) { + console.log(`Passed: DIV - More Info Alabama Row 10 ${label} label text matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 10 "${expected.text}"; Actual: "${actualText}"`); + } + + //font + if (actualFont === expected.font) { + console.log(`Passed: DIV - More Info Alabama Row 10 ${label} label text font matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 10 "${expected.font}"; Actual: "${actualFont}"`); + } + + //size + if (actualSize === expected.size) { + console.log(`Passed: DIV - More Info Alabama Row 10 ${label} label text font-size matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 10 ${label} label text font-size "${expected.size}"; Actual: "${actualSize}"`); + } + + //color + if (actualColor === expected.color) { + console.log(`Passed: DIV - More Info Alabama Row 10 ${label} label text color matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 10 ${label} label text color "${expected.color}"; Actual: "${actualColor}"`); + } + + return errors; + } + + for (const check of checks) { + const errs = await validateCell(check); + allErrors.push(...errs); + } + + if (allErrors.length > 0) { + if (allErrors.length > 1) allErrors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + throw new Error(allErrors.join('\n')); + } + } + }, + + //DIV - More Info Alabama Row 11 label + { + description: 'Validate DIV - More Info Alabama Row 11 label text, color, and font size', + action: async () => { + const multipleChecks = 'DIV - More Info Alabama Row 11 label'; + + const checks = [ + //Subject + { + selector: '.notenabled:nth-child(11) > td:nth-child(1)', + label: 'Social and Emotional Learning*', + expected: { + text: 'Social and Emotional Learning*', + font: 'Poppins, sans-serif', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + + //Adopted + { + selector: '.notenabled:nth-child(11) > td:nth-child(2)', + label: '2013', + expected: { + text: '2013', + font: 'Poppins, sans-serif', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + + //Pre K* + { + selector: '.notenabled:nth-child(11) .notenabled', + label: 'Pre K*', + expected: { + text: 'Pre K*', + font: 'Poppins, sans-serif', + color: 'rgba(119, 119, 119, 1)', + size: '11.583px' + } + } + ]; + + const allErrors = []; + + async function validateCell({ selector, label, expected }) { + const element = await driver.findElement(By.css(selector)); + + const actualText = await element.getText(); + const actualFont = await element.getCssValue('font-family'); + const actualSize = await element.getCssValue('font-size'); + const actualColor = await element.getCssValue('color'); + + const errors = []; + + //text + if (actualText === expected.text) { + console.log(`Passed: DIV - More Info Alabama Row 11 ${label} label text matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 11 "${expected.text}"; Actual: "${actualText}"`); + } + + //font + if (actualFont === expected.font) { + console.log(`Passed: DIV - More Info Alabama Row 11 ${label} label text font matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 11 "${expected.font}"; Actual: "${actualFont}"`); + } + + //size + if (actualSize === expected.size) { + console.log(`Passed: DIV - More Info Alabama Row 11 ${label} label text font-size matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 11 ${label} label text font-size "${expected.size}"; Actual: "${actualSize}"`); + } + + //color + if (actualColor === expected.color) { + console.log(`Passed: DIV - More Info Alabama Row 11 ${label} label text color matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 11 ${label} label text color "${expected.color}"; Actual: "${actualColor}"`); + } + + return errors; + } + + for (const check of checks) { + const errs = await validateCell(check); + allErrors.push(...errs); + } + + if (allErrors.length > 0) { + if (allErrors.length > 1) allErrors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + throw new Error(allErrors.join('\n')); + } + } + }, + + //DIV - More Info Alabama Row 12 label text + { + description: 'Validate DIV - More Info Alabama Row 12 label text, color, and font size', + action: async () => { + const multipleChecks = 'DIV - More Info Alabama Row 12 label'; + + const checks = [ + //Subject + { + selector: '.notenabled:nth-child(12) > td:nth-child(1)', + label: 'World Languages*', + expected: { + text: 'World Languages*', + font: 'Poppins, sans-serif', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + + //Adopted + { + selector: '.notenabled:nth-child(12) > td:nth-child(2)', + label: '2017', + expected: { + text: '2017', + font: 'Poppins, sans-serif', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + + //All Grades list + { + selector: '.notenabled:nth-child(12) > td:nth-child(3)', + label: 'Grades List', + expected: { + text: 'K, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12', + font: 'Poppins, sans-serif', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + } + ]; + + const allErrors = []; + + async function validateCell({ selector, label, expected }) { + const element = await driver.findElement(By.css(selector)); + + const actualText = await element.getText(); + const actualFont = await element.getCssValue('font-family'); + const actualSize = await element.getCssValue('font-size'); + const actualColor = await element.getCssValue('color'); + + const errors = []; + + //text + if (actualText === expected.text) { + console.log(`Passed: DIV - More Info Alabama Row 10 ${label} label text matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 10 "${expected.text}"; Actual: "${actualText}"`); + } + + //font + if (actualFont === expected.font) { + console.log(`Passed: DIV - More Info Alabama Row 10 ${label} label text font matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 10 "${expected.font}"; Actual: "${actualFont}"`); + } + + //size + if (actualSize === expected.size) { + console.log(`Passed: DIV - More Info Alabama Row 10 ${label} label text font-size matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 10 ${label} label text font-size "${expected.size}"; Actual: "${actualSize}"`); + } + + //color + if (actualColor === expected.color) { + console.log(`Passed: DIV - More Info Alabama Row 10 ${label} label text color matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Alabama Row 10 ${label} label text color "${expected.color}"; Actual: "${actualColor}"`); + } + + return errors; + } + + for (const check of checks) { + const errs = await validateCell(check); + allErrors.push(...errs); + } + + if (allErrors.length > 0) { + if (allErrors.length > 1) allErrors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + throw new Error(allErrors.join('\n')); + } + } + }, + + //NEXT ACTION + { + description: 'Dashboard - Click DIV X icon', + action: async () => { + await driver.findElement(By.css('.modal-lg .modal-header span')).click(); + console.log('----->| NEXT ACTION: Clicked DIV X icon'); + + //Wait for page to load completely + await driver.wait(async () => { + const readyState = await driver.executeScript('return document.readyState'); + return readyState === 'complete'; + }, 20000, 'ExACT Dashboard did not fully load within 60 seconds'); + console.log('Passed: ExACT Dashboard loaded successfully'); + } + }, + + //NEXT ACTION + { + description: 'Dashboard - Click Alabama View icon', + action: async () => { + await driver.findElement(By.css('tr:nth-child(1) > .text-center:nth-child(5) img')).click(); + console.log('----->| NEXT ACTION: Clicked Alabama View icon'); + + //Wait for page readyState + await driver.wait(async () => { + const readyState = await driver.executeScript('return document.readyState'); + return readyState === 'complete'; + }, 30000, 'Browse standards page did not fully load within 30 seconds'); + + //Wait until the modal title is located AND visible + await driver.wait(async () => { + try { + const element = await driver.findElement(By.linkText('Content')); + return await element.isDisplayed(); + } catch (e) { + return false; //Element not ready yet, keep waiting + } + }, 20000, 'Content tab did not become visible within 20 seconds'); + + console.log('Passed: Content tab loaded successfully'); + } + }, + + //Content tab title + { + description: 'Validate Content tab title text, size, and color', + action: async () => { + const multipleChecks = 'Content tab title'; + const element = await driver.findElement(By.linkText('Content')); + + //Get text, font, size, and color + const elementText = await element.getText(); + const elementTextFont = await element.getCssValue('font-family'); + const elementTextSize = await element.getCssValue('font-size'); + const elementTextColor = await element.getCssValue('color'); + const elementButtonColor = await element.getCssValue('background-color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Content') { + console.log('Passed: Content tab title text matched as expected'); + } else { + errors.push(`Expected: "Content"; Actual: "${elementText}"`); + } + + //font + if (elementTextFont === 'Poppins, sans-serif') { + console.log('Passed: Content tab title font-family matched as expected'); + } else { + errors.push(`Expected: Content tab title font-family "Poppins, sans-serif"; Actual: ${elementTextFont}`); + } + + //size + if (elementTextSize === '15px') { + console.log('Passed: Content tab title text font-size matched as expected'); + } else { + errors.push(`Expected: Content tab title text font-size "15px"; Actual: "${elementTextSize}"`); + } + + //color + if (elementTextColor === 'rgba(182, 186, 181, 1)') { + console.log('Passed: Content tab title text color matched as expected'); + } else { + errors.push(`Expected: Content tab title text color: "rgba(182, 186, 181, 1)"; Actual: "${elementTextColor}"`); + } + + //button color + if (elementButtonColor === 'rgba(0, 0, 0, 0)') { + console.log('Passed: Content tab background color matched as expected'); + } else { + errors.push(`Expected: Content tab background color: "rgba(0, 0, 0, 0)"; Actual: "${elementButtonColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Standards tab tab title (active) + { + description: 'Validate Standards tab title text, size, and color', + action: async () => { + const multipleChecks = 'By Standard tab title'; + const element = await driver.findElement(By.linkText('Standards')); + + //Get text, font, size, and color + const elementText = await element.getText(); + const elementTextFont = await element.getCssValue('font-family'); + const elementTextSize = await element.getCssValue('font-size'); + const elementTextColor = await element.getCssValue('color'); + const elementButtonColor = await element.getCssValue('background-color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Standards') { + console.log('Passed: Standards tab title text matched as expected'); + } else { + errors.push(`Expected: "Standards"; Actual: "${elementText}"`); + } + + //font + if (elementTextFont === 'Poppins, sans-serif') { + console.log('Passed: Standards tab title font-family matched as expected'); + } else { + errors.push(`Expected: Standards tab title font-family "Poppins, sans-serif"; Actual: ${elementTextFont}`); + } + + //size + if (elementTextSize === '15px') { + console.log('Passed: Standards tab title text font-size matched as expected'); + } else { + errors.push(`Expected: Standards tab title text font-size "15px"; Actual: "${elementTextSize}"`); + } + + //color + if (elementTextColor === 'rgba(255, 255, 255, 1)') { + console.log('Passed: Standards tab title text color matched as expected'); + } else { + errors.push(`Expected: Standards tab title text color: "rgba(255, 255, 255, 1)"; Actual: "${elementTextColor}"`); + } + + //button color + if (elementButtonColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Standards tab background color matched as expected'); + } else { + errors.push(`Expected: Standards tab background color: "rgba(40, 39, 90, 1)"; Actual: "${elementButtonColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //AutoAlign tab title + { + description: 'Validate AutoAlign tab title text, size, and color', + action: async () => { + const multipleChecks = 'AutoAlign tab title'; + const element = await driver.findElement(By.linkText('AutoAlign')); + + //Get text, font, size, and color + const elementText = await element.getText(); + const elementTextFont = await element.getCssValue('font-family'); + const elementTextSize = await element.getCssValue('font-size'); + const elementTextColor = await element.getCssValue('color'); + const elementButtonColor = await element.getCssValue('background-color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'AutoAlign') { + console.log('Passed: AutoAlign tab title text matched as expected'); + } else { + errors.push(`Expected: "AutoAlign"; Actual: "${elementText}"`); + } + + //font + if (elementTextFont === 'Poppins, sans-serif') { + console.log('Passed: AutoAlign tab title font-family matched as expected'); + } else { + errors.push(`Expected: AutoAlign tab title font-family "DM Serif Display, serif"; Actual: ${elementTextFont}`); + } + + //size + if (elementTextSize === '15px') { + console.log('Passed: AutoAlign tab title text font-size matched as expected'); + } else { + errors.push(`Expected: AutoAlign tab title text font-size "15px"; Actual: "${elementTextSize}"`); + } + + //color + if (elementTextColor === 'rgba(182, 186, 181, 1)') { + console.log('Passed: AutoAlign tab title text color matched as expected'); + } else { + errors.push(`Expected: AutoAlign tab title text color: "rgba(182, 186, 181, 1)"; Actual: "${elementTextColor}"`); + } + + //button color + if (elementButtonColor === 'rgba(0, 0, 0, 0)') { + console.log('Passed: AutoAlign tab background color matched as expected'); + } else { + errors.push(`Expected: AutoAlign tab background color: "rgba(0, 0, 0, 0)"; Actual: "${elementButtonColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Browse - Browse standards sub-title + { + description: 'Validate Browse - Browse standards sub-title text, color, and size', + action: async () => { + const multipleChecks = 'Browse sub-title'; + const element = await driver.findElement(By.css('#std .fom-title')); + + //Get text, font, size, and color + const elementText = await element.getText(); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Browse standards') { + console.log("Passed: Browse page - Browse standards sub-title matched as expected"); + } else { + errors.push(`Expected: "Browse standards" sub-title; Actual: "${elementText}"`); + } + + //font + if (elementFont === 'Poppins, sans-serif') { + console.log('Passed: Browse page - Browse standards sub-title font-family matched as expected'); + } else { + errors.push(`Expected: Browse page - Browse standards sub-title font-family "DM Serif Display, serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '13px') { + console.log('Passed: Browse page - Browse standards sub-title text font-size matched as expected'); + } else { + errors.push(`Expected: Browse page - Browse standards sub-title text font-size "13px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Browse page - Browse standards sub-title text color matched as expected'); + } else { + errors.push(`Expected: Browse page - Browse standards sub-title text color "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Standards label + { + description: 'Validate Standards label text, font, size, and color', + action: async () => { + const multipleChecks = 'Standards label'; + const element = await driver.findElement(By.css('#browse-standards > .form-group:nth-child(1) > .col-sm-12')); + + //Get text, font, size, and color + const elementText = await element.getText(); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Standards') { + console.log("Passed: Standards label matched as expected"); + } else { + errors.push(`Expected: "Standards" label; Actual: "${elementText}"`); + } + + //font + if (elementFont === 'Poppins, sans-serif') { + console.log('Passed: Standards label font-family matched as expected'); + } else { + errors.push(`Expected: Standards label font-family "DM Serif Display, serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '13px') { + console.log('Passed: Standards label text font-size matched as expected'); + } else { + errors.push(`Expected: Standards label text font-size "13px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Standards label text color matched as expected'); + } else { + errors.push(`Expected: Standards label text color "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Standards dropdown + { + description: 'Validate Standards dropdown list and value', + action: async () => { + const multipleChecks = 'Standards Dropdown List'; + const select = await driver.findElement(By.css('#stdselect')); + + //Get text, font, size, and color + const selectedOption = await select.findElement(By.css('option:checked')); + const elementText = await selectedOption.getText(); + const elementFont = await selectedOption.getCssValue('font-family'); + const elementSize = await selectedOption.getCssValue('font-size'); + const elementColor = await selectedOption.getCssValue('color'); + + //text + if (elementText === 'Alabama') { + console.log("Passed: Alabama default option matched as expected"); + } else { + errors.push(`Expected option: "Alabama"; Actual: "${elementText}"`); + } + + //font + if (elementFont === 'Poppins, sans-serif') { + console.log('Passed: Alabama default text font-family matched as expected'); + } else { + errors.push(`Expected: Alabama default text font-family "DM Serif Display, serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '13px') { + console.log('Passed: Alabama default text font-size matched as expected'); + } else { + errors.push(`Expected: Alabama default text font-size "13px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Alabama default text color matched as expected'); + } else { + errors.push(`Expected: Alabama default text color "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`); + } + + const options = await select.findElements(By.css('option')); + const expectedList = [ + 'Select standards', + 'Alabama', + 'Arizona', + 'California', + 'Florida', + 'Georgia', + 'Illinois', + 'New York', + 'Texas', + 'Washington', + 'Common Core State Standards', + 'Alberta Standards', + 'Ontario Curriculum', + 'Australian Curriculum (ACARA) v8', + 'New South Wales', + 'NCSSFL-ACTFL CAN-DO STATEMENTS', + 'WIDA Consortium (2020)', + '5th Grade Import ECS-2732', + 'Imported Framework Updated', + 'NewTicket', + 'ECS-2933 Testing On Prod', + 'Widget Test', + 'ecs31444', + 'California Mathematics 1997', + 'Georgia Archived Language Arts QA', + 'Georgia Current Language Arts QA', + 'Georgia Future Language Arts QA', + 'create group test', + 'IMport Test', + 'Georgia WL Import' + ]; + const actual = []; + + //Track all errors + const errors = []; + + for (const opt of options) { + const text = (await opt.getText()).trim(); + actual.push(text); + } + + if (JSON.stringify(actual) === JSON.stringify(expectedList)) { + console.log('Passed: Standards Dropdown list matched as expected'); + } else { + errors.push(`Expected: Standards Dropdown list: ${JSON.stringify(expectedList)}, Actual: ${JSON.stringify(actual)}`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Standards Display label + { + description: 'Validate Standards Display label text, font, size, and color', + action: async () => { + const multipleChecks = 'Standards Display label'; + const element = await driver.findElement(By.css('.form-group:nth-child(2) > .col-sm-2')); + + //Get text, font, size, and color + const elementText = await element.getText(); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Standards Display') { + console.log("Passed: Standards Display label text matched as expected"); + } else { + errors.push(`Expected: ""Standards Display" label text; Actual: "${elementText}"`); + } + + //font + if (elementFont === 'Poppins, sans-serif') { + console.log('Passed: Standards Display label font-family matched as expected'); + } else { + errors.push(`Expected: Standards Display label font-family "DM Serif Display, serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '13px') { + console.log('Passed: Standards Display label text font-size matched as expected'); + } else { + errors.push(`Expected: Standards Display label text font-size "13px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Standards Display label text color matched as expected'); + } else { + errors.push(`Expected: Standards Display label text color "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //All radio option + { + description: 'Validate All radio option text, font, size, and color', + action: async () => { + const multipleChecks = 'All radio option'; + const elementOption = await driver.findElement(By.css('#gap1')).getAttribute('checked'); + const element = await driver.findElement(By.css('.form-check:nth-child(1) > .form-check-label')); + + //Get text, font, size, and color + const elementText = await element.getText(); + const elementTextFont = await element.getCssValue('font-family'); + const elementTextSize = await element.getCssValue('font-size'); + const elementTextColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //icon + if (elementOption === 'true') { + console.log('Passed: All radio option selected as expected'); + } else { + throw new Error(`All radio option value was not selected; Actual: "${elementOption}"`); + } + + //text + if (elementText === 'All') { + console.log('Passed: All radio label text matched as expected'); + } else { + errors.push(`Expected: "All" radio label text; Actual: "${elementText}"`); + } + + //font-family + if (elementTextFont === 'Poppins, sans-serif') { + console.log('Passed: All radio label font matched as expected'); + } else { + errors.push(`Expected: All radio label font "DM Serif Display, serif"; Actual: ${elementTextFont}`); + } + + //font size + if (elementTextSize === '13px') { + console.log('Passed: All radio label text font-size matched as expected'); + } else { + errors.push(`Expected: All radio label text font-size "13px"; Actual: "${elementTextSize}"`); + } + + //text color + if (elementTextColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: All radio label text color matched as expected'); + } else { + errors.push(`Expected: All radio label text color: "rgba(40, 39, 90, 1)"; Actual: "${elementTextColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Correlated Only radio option + { + description: 'Validate Correlated Only radio option text, font, size, and color', + action: async () => { + const multipleChecks = 'Correlated Only radio option'; + const elementOption = await driver.findElement(By.css('#gap2')); + const element = await driver.findElement(By.css('.form-check:nth-child(2) > .form-check-label')); + + //Get text, font, size, and color + const elementText = await element.getText(); + const elementTextFont = await element.getCssValue('font-family'); + const elementTextSize = await element.getCssValue('font-size'); + const elementTextColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //icon + if (elementOption) { + console.log('Passed: Correlated Only radio option is present'); + } else { + throw new Error(`Correlated Only radio option was not found; Actual: "${elementOption}"`); + } + + //text + if (elementText === 'Correlated Only') { + console.log('Passed: Correlated Only radio label text matched as expected'); + } else { + errors.push(`Expected: "Correlated Only" radio label text; Actual: "${elementText}"`); + } + + //font-family + if (elementTextFont === 'Poppins, sans-serif') { + console.log('Passed: Correlated Only radio label font matched as expected'); + } else { + errors.push(`Expected: Correlated Only radio label font "DM Serif Display, serif"; Actual: ${elementTextFont}`); + } + + //font size + if (elementTextSize === '13px') { + console.log('Passed: Correlated Only radio label text font-size matched as expected'); + } else { + errors.push(`Expected: Correlated Only radio label text font-size "13px"; Actual: "${elementTextSize}"`); + } + + //text color + if (elementTextColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Correlated Only radio label text color matched as expected'); + } else { + errors.push(`Expected: Correlated Only radio label text color: "rgba(40, 39, 90, 1)"; Actual: "${elementTextColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Uncorrelated Only radio option + { + description: 'Validate Uncorrelated Only radio option text, font, size, and color', + action: async () => { + const multipleChecks = 'Uncorrelated Only radio option'; + const elementOption = await driver.findElement(By.css('#gap3')); + const element = await driver.findElement(By.css('.form-check:nth-child(3) > .form-check-label')); + + //Get text, font, size, and color + const elementText = await element.getText(); + const elementTextFont = await element.getCssValue('font-family'); + const elementTextSize = await element.getCssValue('font-size'); + const elementTextColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //icon + if (elementOption) { + console.log('Passed: Uncorrelated Only radio option is present'); + } else { + throw new Error(`Uncorrelated Only radio option was not found; Actual: "${elementOption}"`); + } + + //text + if (elementText === 'Uncorrelated Only') { + console.log('Passed: Uncorrelated Only radio label text matched as expected'); + } else { + errors.push(`Expected: "Uncorrelated Only" radio label text; Actual: "${elementText}"`); + } + + //font-family + if (elementTextFont === 'Poppins, sans-serif') { + console.log('Passed: Uncorrelated Only radio label font matched as expected'); + } else { + errors.push(`Expected: Uncorrelated Only radio label font "DM Serif Display, serif"; Actual: ${elementTextFont}`); + } + + //font size + if (elementTextSize === '13px') { + console.log('Passed: Uncorrelated Only radio label text font-size matched as expected'); + } else { + errors.push(`Expected: Uncorrelated Only radio label text font-size "13px"; Actual: "${elementTextSize}"`); + } + + //text color + if (elementTextColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Uncorrelated Only radio label text color matched as expected'); + } else { + errors.push(`Expected: Uncorrelated Only radio label text color: "rgba(40, 39, 90, 1)"; Actual: "${elementTextColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Subject label + { + description: 'Validate Subject label text, font, size, and color', + action: async () => { + const multipleChecks = 'Subject label'; + const element = await driver.findElement(By.css('.hideSubject > .col-form-label')); + + //Get text, font, size, and color + const elementText = await element.getText(); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Subject') { + console.log("Passed: Subject label text matched as expected"); + } else { + errors.push(`Expected: "Subject" label text; Actual: "${elementText}"`); + } + + //font + if (elementFont === 'Poppins, sans-serif') { + console.log('Passed: Subject label font-family matched as expected'); + } else { + errors.push(`Expected: Subject label font-family "DM Serif Display, serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '13px') { + console.log('Passed: Subject label text font-size matched as expected'); + } else { + errors.push(`Expected: Subject label text font-size "13px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Subject label text color matched as expected'); + } else { + errors.push(`Expected: Subject label text color "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Subject dropdown + { + description: 'Validate Subject dropdown list and value', + action: async () => { + const multipleChecks = 'Subject Dropdown List'; + const select = await driver.findElement(By.css('#selectSubjects')); + + //Get text, font, size, and color + const selectedOption = await select.findElement(By.css('option:checked')); + const elementText = await selectedOption.getText(); + const elementFont = await selectedOption.getCssValue('font-family'); + const elementSize = await selectedOption.getCssValue('font-size'); + const elementColor = await selectedOption.getCssValue('color'); + + //text + if (elementText === 'Select a subject') { + console.log("Passed: Select a subject default option matched as expected"); + } else { + errors.push(`Expected option: "Select a subject"; Actual: "${elementText}"`); + } + + //font + if (elementFont === 'Poppins, sans-serif') { + console.log('Passed: Select a subject default text font-family matched as expected'); + } else { + errors.push(`Expected: Select a subject default text font-family "DM Serif Display, serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '13px') { + console.log('Passed: Select a subject default text font-size matched as expected'); + } else { + errors.push(`Expected: Select a subject default text font-size "13px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Select a subject default text color matched as expected'); + } else { + errors.push(`Expected: Select a subject default text color "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`); + } + + const options = await select.findElements(By.css('option')); + const expectedList = [ + 'Select a subject', + 'Health and PE', + 'Language Arts', + "Mathematics", + "Science", + "Social Studies", + "Technology Education" + ]; + const actual = []; + + //Track all errors + const errors = []; + + for (const opt of options) { + const text = (await opt.getText()).trim(); + actual.push(text); + } + + if (JSON.stringify(actual) === JSON.stringify(expectedList)) { + console.log('Passed: Subject Dropdown list matched as expected'); + } else { + errors.push(`Expected: Subject Dropdown list: ${JSON.stringify(expectedList)}, Actual: ${JSON.stringify(actual)}`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Grade label and dropdown + { + description: 'Validate Grade label and dropdown are hidden', + action: async () => { + const multipleChecks = 'Grade label and dropdown are hidden'; + const errors = []; + + const visibility = await driver.executeScript(` + const hideGradeDiv = document.querySelector('.hideGrade'); + if (!hideGradeDiv) return { found: false }; + const style = window.getComputedStyle(hideGradeDiv); + return { + found: true, + hidden: style.display === 'none', + display: style.display + }; + `); + //console.log('----->| DEBUG hideGrade visibility:', JSON.stringify(visibility)); + + //Both label and dropdown are inside the same hideGrade div + //so we only need to check the parent container once + if (visibility.found && visibility.hidden) { + console.log('Passed: Grade label is hidden as expected'); + console.log('Passed: Grade dropdown is hidden as expected'); + } else { + errors.push(`Expected: Grade label and dropdown to be hidden; Actual: display="${visibility.display}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + throw new Error(errors.join('\n')); + } + } + }, + + //Show Correlations From label + { + description: 'Validate Show Correlations From label text, font, size, and color', + action: async () => { + const multipleChecks = 'Show Correlations From label'; + const element = await driver.findElement(By.css('.form-group:nth-child(3) > .col-form-label')); + + //Get text, font, size, and color + const elementText = await element.getText(); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Show Correlations From') { + console.log("Passed: Show Correlations From label text matched as expected"); + } else { + errors.push(`Expected: "Show Correlations From" label text; Actual: "${elementText}"`); + } + + //font + if (elementFont === 'Poppins, sans-serif') { + console.log('Passed: Show Correlations From label font-family matched as expected'); + } else { + errors.push(`Expected: Show Correlations From label font-family "DM Serif Display, serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '13px') { + console.log('Passed: Show Correlations From label text font-size matched as expected'); + } else { + errors.push(`Expected: Show Correlations From label text font-size "13px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Show Correlations From label text color matched as expected'); + } else { + errors.push(`Expected: Show Correlations From label text color "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Show Correlations From dropdown value + { + description: 'Validate Show Correlations From dropdown value', + action: async () => { + const multipleChecks = 'Show Correlations From dropdown value'; + + //Locate and validate selected (collapsed) value + const dropdownButton = await driver.findElement( + By.css('button.multiselect.dropdown-toggle') + ); + + const selectedOption = await driver.findElement(By.css('#browse-standards > div:nth-child(3) > div > div > div:nth-child(3) > div > div > button > span')); + + //Get text, font, size, and color + const elementText = await selectedOption.getText(''); + const elementFont = await selectedOption.getCssValue('font-family'); + const elementSize = await selectedOption.getCssValue('font-size'); + const elementColor = await selectedOption.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'All Content Sets') { + console.log("Passed: All Content Sets default option matched as expected"); + } else { + errors.push(`Expected option: "All Content Sets"; Actual: "${elementText}"`); + } + + //font + if (elementFont === 'Poppins, sans-serif') { + console.log('Passed: All Content Sets default text font-family matched as expected'); + } else { + errors.push(`Expected: All Content Sets default text font-family "DM Serif Display, serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '16px') { + console.log('Passed: All Content Sets default text font-size matched as expected'); + } else { + errors.push(`Expected: All Content Sets default text font-size "16px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(33, 37, 41, 1)') { + console.log('Passed: All Content Sets default text color matched as expected'); + } else { + errors.push(`Expected: All Content Sets default text color "rgba(33, 37, 41, 1)"; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Term Search label + { + description: 'Validate Term Search label text, font, size, and color', + action: async () => { + const multipleChecks = 'Term Search label'; + const element = await driver.findElement(By.css('.form-group:nth-child(7) > .col-sm-2')); + + //Get text, font, size, and color + const elementText = await element.getText(); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Term Search') { + console.log("Passed: Term Search label text matched as expected"); + } else { + errors.push(`Expected: "Term Search" label text; Actual: "${elementText}"`); + } + + //font + if (elementFont === 'Poppins, sans-serif') { + console.log('Passed: Term Search label font-family matched as expected'); + } else { + errors.push(`Expected: Term Search label font-family "DM Serif Display, serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '13px') { + console.log('Passed: Term Search label text font-size matched as expected'); + } else { + errors.push(`Expected: Term Search label text font-size "13px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Term Search label text color matched as expected'); + } else { + errors.push(`Expected: Term Search label text color "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Term Search placeholder + { + description: 'Validate Term Search placeholder', + action: async () => { + const elementPlaceholder = await driver.findElement(By.css('#searchTerm')).getAttribute('placeholder'); + + if (elementPlaceholder === '') { + console.log('Passed: Term Search "blank" placeholder text matched as expected'); + } else { + throw new Error(`Expected: Term Search "blank" placeholder text; Actual: "${elementPlaceholder}"`); + } + } + }, + + //Include Related Standards checkbox + { + description: 'Validate Include Related Standards checkbox', + action: async () => { + const elementType = await driver.findElement(By.css('#doRel')).getAttribute('type'); + + if (elementType === 'checkbox') { + console.log('Passed: Include Related Standards checkbox type matched as expected'); + } else { + throw new Error(`Include Related Standards checkbox type did not match; Actual: "${elementType}"`); + } + } + }, + + //Include Related Standards label + { + description: 'Validate Include Related Standards label text, font, size, and color', + action: async () => { + const multipleChecks = 'Include Related Standards label'; + const element = await driver.findElement(By.css('.col-sm-offset-2 > label')); + + //Get text, font, size, and color + const elementText = await element.getText(); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Include Related Standards') { + console.log("Passed: Include Related Standards label text matched as expected"); + } else { + errors.push(`Expected: "Include Related Standards" label text; Actual: "${elementText}"`); + } + + //font + if (elementFont === 'Poppins, sans-serif') { + console.log('Passed: Include Related Standards label font-family matched as expected'); + } else { + errors.push(`Expected: Include Related Standards label font-family "DM Serif Display, serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '13px') { + console.log('Passed: Include Related Standards label text font-size matched as expected'); + } else { + errors.push(`Expected: Include Related Standards label text font-size "13px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Include Related Standards label text color matched as expected'); + } else { + errors.push(`Expected: Include Related Standards label text color "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Search button + { + description: 'Validate Search button text, size, and color', + action: async () => { + const multipleChecks = 'Search button'; + const element = await driver.findElement(By.css('#stdsubmit')); + + //Get text, font, size, and color + const elementText = await element.getAttribute('value'); + const elementTextFont = await element.getCssValue('font-family'); + const elementTextSize = await element.getCssValue('font-size'); + const elementTextColor = await element.getCssValue('color'); + const elementButtonColor = await element.getCssValue('background-color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Search') { + console.log('Passed: Search button text matched as expected'); + } else { + errors.push(`Expected: "Search"; Actual: "${elementText}"`); + } + + //font + if (elementTextFont === 'Poppins, sans-serif') { + console.log('Passed: Search button text font-family matched as expected'); + } else { + errors.push(`Expected: Search button text font-family "Poppins, sans-serif"; Actual: ${elementTextFont}`); + } + + //size + if (elementTextSize === '16px') { + console.log('Passed: Search button text font-size matched as expected'); + } else { + errors.push(`Expected: Search button text font-size "16px"; Actual: "${elementTextSize}"`); + } + + //color + if (elementTextColor === 'rgba(255, 255, 255, 1)') { + console.log('Passed: Search button text color matched as expected'); + } else { + errors.push(`Expected: Search button text color: "rgba(255, 255, 255, 1)"; Actual: "${elementTextColor}"`); + } + + //button color + if (elementButtonColor === 'rgba(48, 200, 172, 1)') { + console.log('Passed: Search button background color matched as expected'); + } else { + errors.push(`Expected: Search button background color: "rgba(48, 200, 172, 1)"; Actual: "${elementButtonColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //NEXT ACTION + { + description: 'Validate alert message', + action: async () => { + const multipleChecks = 'Validate alert message'; + const errors = []; + + //Click delete button + const element = await driver.findElement(By.css('#stdsubmit')).click(); + await driver.sleep(5000); + console.log('----->| NEXT ACTION: Clicked Search button'); + + //Wait for confirm dialog to appear + const alert = await driver.wait(until.alertIsPresent(), 5000); + console.log('----->| NEXT ACTION: Alert dialog appeared as expected'); + + //Get alert text + const alertText = await alert.getText(); + + //Validate alert message text + const expectedText = 'You must select a subject'; + if (alertText === expectedText) { + console.log('Passed: Alert dialog text matched as expected'); + } else { + errors.push(`Expected: "${expectedText}"; Actual: "${alertText}"`); + } + + //Throw summary before dismissing if errors found + if (errors.length > 0) { + await alert.dismiss(); //Cancel the delete if validation failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + throw new Error(errors.join('\n')); + } + + //Accept the alert (click OK) to proceed with deletion + await alert.accept(); + console.log('----->| NEXT ACTION: Clicked alert message OK button'); + await driver.sleep(2000); + } + }, + + //NEXT ACTION + { + description: 'Click Subject dropdown', + action: async () => { + //Select "Mathematics" from dropdown + const subjectDropdown = await driver.findElement(By.css('#selectSubjects')); + const mathematicsOption = await driver.findElement(By.css('#selectSubjects > option:nth-child(4)')); + + await subjectDropdown.click(); + await driver.sleep(2000); + + await mathematicsOption.click(); + await driver.sleep(2000); + console.log('----->| NEXT ACTION: Selected Subject - Mathematics'); + + //Click away to close dropdown + await driver.findElement(By.css('#browse-standards > .form-group:nth-child(1)')).click(); + + //Wait for the dashboard container to exist in DOM + await driver.wait( + until.elementLocated(By.css('#selectGrade')), + 30000, + 'Grade dropdown did not appear within 30 seconds' + ); + + //Wait for it to be visible + await driver.wait(async () => { + try { + const gradeDropdown = await driver.findElement(By.css('#selectGrade')); + return await gradeDropdown.isDisplayed(); + } catch (e) { + return false; + } + }, 30000, 'Grade dropdown did not become visible within 30 seconds'); + }, + }, + + //Grade label + { + description: 'Validate Grade label text, font, size, and color', + action: async () => { + const multipleChecks = 'Grade label'; + const element = await driver.findElement(By.css('.hideGrade > .col-form-label')); + + //Get text, font, size, and color + const elementText = await element.getText(); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Grade') { + console.log("Passed: Grade label text matched as expected"); + } else { + errors.push(`Expected: "Grade" label text; Actual: "${elementText}"`); + } + + //font + if (elementFont === 'Poppins, sans-serif') { + console.log('Passed: Grade label font-family matched as expected'); + } else { + errors.push(`Expected: Grade label font-family "DM Serif Display, serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '13px') { + console.log('Passed: Grade label text font-size matched as expected'); + } else { + errors.push(`Expected: Grade label text font-size "13px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Grade label text color matched as expected'); + } else { + errors.push(`Expected: Grade label text color "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Grade dropdown + { + description: 'Validate Grade dropdown list and value', + action: async () => { + const multipleChecks = 'Grade Dropdown List'; + const select = await driver.findElement(By.css('#selectGrade')); + + //Get text, font, size, and color + const selectedOption = await select.findElement(By.css('option:checked')); + const elementText = await selectedOption.getText(); + const elementFont = await selectedOption.getCssValue('font-family'); + const elementSize = await selectedOption.getCssValue('font-size'); + const elementColor = await selectedOption.getCssValue('color'); + + //text + if (elementText === 'Select a grade') { + console.log("Passed: Select a grade default option matched as expected"); + } else { + errors.push(`Expected option: "Select a grade"; Actual: "${elementText}"`); + } + + //font + if (elementFont === 'Poppins, sans-serif') { + console.log('Passed: Select a grade default text font-family matched as expected'); + } else { + errors.push(`Expected: Select a grade default text font-family "DM Serif Display, serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '13px') { + console.log('Passed: Select a grade default text font-size matched as expected'); + } else { + errors.push(`Expected: Select a grade default text font-size "13px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Select a grade default text color matched as expected'); + } else { + errors.push(`Expected: Select a grade default text color "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`); + } + + const options = await select.findElements(By.css('option')); + const expectedList = [ + 'Select a grade', + 'K', + '1', + '2', + '3', + '4', + '5', + '6', + '7', + '8', + '9', + '10', + '11', + '12' + ]; + const actual = []; + + //Track all errors + const errors = []; + + for (const opt of options) { + const text = (await opt.getText()).trim(); + actual.push(text); + } + + if (JSON.stringify(actual) === JSON.stringify(expectedList)) { + console.log('Passed: Grade Dropdown list matched as expected'); + } else { + errors.push(`Expected: Grade Dropdown list: ${JSON.stringify(expectedList)}, Actual: ${JSON.stringify(actual)}`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //NEXT ACTION + { + description: 'Validate alert message', + action: async () => { + const multipleChecks = 'Validate alert message'; + const errors = []; + + //Click delete button + const element = await driver.findElement(By.css('#stdsubmit')).click(); + await driver.sleep(5000); + console.log('----->| NEXT ACTION: Clicked Search button'); + + //Wait for confirm dialog to appear + const alert = await driver.wait(until.alertIsPresent(), 5000); + console.log('----->| NEXT ACTION: Alert dialog appeared as expected'); + + //Get alert text + const alertText = await alert.getText(); + + //Validate alert message text + const expectedText = 'You must select a grade'; + if (alertText === expectedText) { + console.log('Passed: Alert dialog text matched as expected'); + } else { + errors.push(`Expected: "${expectedText}"; Actual: "${alertText}"`); + } + + //Throw summary before dismissing if errors found + if (errors.length > 0) { + await alert.dismiss(); //Cancel the delete if validation failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + throw new Error(errors.join('\n')); + } + + //Accept the alert (click OK) to proceed with deletion + await alert.accept(); + console.log('----->| NEXT ACTION: Clicked alert message OK button'); + await driver.sleep(2000); + } + }, + + //NEXT ACTION + { + description: 'Select grade', + action: async () => { + //Select "9" from dropdown + await driver.findElement(By.css('#selectGrade')).click(); + await driver.sleep(2000); + await driver.findElement(By.css('#selectGrade > option:nth-child(11)')).click(); + + console.log('----->| NEXT ACTION: Selected grade: 9'); + }, + }, + + //Show Correlations From dropdown + { + description: 'Validate Show Correlations From dropdown list and value', + action: async () => { + const multipleChecks = 'Show Correlations From dropdown list'; + + //Locate and validate selected (collapsed) value + const dropdownButton = await driver.findElement( + By.css('button.multiselect.dropdown-toggle') + ); + + const selectedOption = await driver.findElement(By.css('#browse-standards > div:nth-child(3) > div > div > div:nth-child(3) > div > div > button > span')); + + //Get text, font, size, and color + const elementText = await selectedOption.getText(''); + const elementFont = await selectedOption.getCssValue('font-family'); + const elementSize = await selectedOption.getCssValue('font-size'); + const elementColor = await selectedOption.getCssValue('color'); + + //text + if (elementText === 'All Content Sets') { + console.log("Passed: All Content Sets default option matched as expected"); + } else { + errors.push(`Expected option: "All Content Sets"; Actual: "${elementText}"`); + } + + //font + if (elementFont === 'Poppins, sans-serif') { + console.log('Passed: All Content Sets default text font-family matched as expected'); + } else { + errors.push(`Expected: All Content Sets default text font-family "DM Serif Display, serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '16px') { + console.log('Passed: All Content Sets default text font-size matched as expected'); + } else { + errors.push(`Expected: All Content Sets default text font-size "16px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(33, 37, 41, 1)') { + console.log('Passed: All Content Sets default text color matched as expected'); + } else { + errors.push(`Expected: All Content Sets default text color "rgba(33, 37, 41, 1)"; Actual: "${elementColor}"`); + } + + //Open dropdown + await driver.findElement(By.css('.col-sm-12 .multiselect-selected-text')).click(); + await driver.sleep(2000); + console.log('----->| NEXT ACTION: Clicked Show Correlations From dropdown'); + + //Wait for dropdown list to become visible + const dropdownMenu = await driver.wait( + until.elementLocated(By.css('ul.multiselect-container.dropdown-menu.show')), + 10000 + ); + + await driver.wait( + until.elementIsVisible(dropdownMenu), + 10000 + ); + + //Now safely get option labels + const optionLabels = await dropdownMenu.findElements( + By.css('li label.checkbox') + ); + + //Extract list values + const actualOptions = []; + for (const label of optionLabels) { + const text = (await label.getText()).trim(); + if (text) { + actualOptions.push(text); + } + } + + const expectedOptions = [ + 'Select all', + 'US History III', + 'English I', + 'Algebra', + 'Biology', + 'Copy Move Delete Test 1', + 'Copy Move Delete Test 2', + 'Import Align - Concept Based 1', + 'Import Align - Concept Based 2', + 'Import Align - Direct Align 1', + 'Import Align - Direct Align 2', + 'Math Alignment Import Test', + 'create me', + 'Illustrative Math Test 1', + 'Illustrative Math Test 2', + 'Khan URL test', + 'seesaw test', + 'ECS-3037 On Prod TC2', + 'ECS-3037 On Prod TC1', + 'webinar test', + 'Review Screen Open', + 'New One For Agust Post Night', + 'Post NIght July26', + 'create import test' + ]; + + //Track all errors + const errors = []; + + //Length validation + if (actualOptions.length !== expectedOptions.length) { + errors.push( + `Expected option count ${expectedOptions.length}; Actual ${actualOptions.length}` + ); + } + + //Value-by-value validation + expectedOptions.forEach((expected, i) => { + if (actualOptions[i] !== expected) { + errors.push( + `Index ${i}: Expected "${expected}", Actual "${actualOptions[i]}"` + ); + } + }); + + //Select "Algebra" from dropdown + //Runs even if validation above already failed — errors are thrown after this, + //so log order does not reflect when the failing check actually ran + await driver.findElement(By.css('.show > li:nth-child(5) input')).click(); + await driver.sleep(2000); + + console.log('----->| NEXT ACTION: Selected correlation: Algebra'); + + //Click away to close dropdown using executeScript to bypass interception + await driver.executeScript(` + document.querySelector('.col-sm-12 .multiselect-selected-text').click(); + `); + await driver.sleep(2000); + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Related Standards options + { + description: 'Validate Include Related Standards options are hidden', + action: async () => { + const multipleChecks = 'Include Related Standards labels and dropdowns are hidden'; + const errors = []; + + const visibility = await driver.executeScript(` + const elementRelStdnt = document.querySelector('#relsel'); + if (!elementRelStdnt) return { found: false }; + const style = window.getComputedStyle(elementRelStdnt); + return { + found: true, + hidden: style.display === 'none', + display: style.display + }; + `); + //console.log('----->| DEBUG RelStdnt visibility:', JSON.stringify(visibility)); + + //Both label and dropdown are inside the same hideGrade div + //so we only need to check the parent container once + if (visibility.found && visibility.hidden) { + console.log('Passed: Related Standards dropdown is hidden as expected'); + console.log('Passed: Best Match dropdown is hidden as expected'); + } else { + errors.push(`Expected: Related Standards and Best Match dropdowns to be hidden; Actual: display="${visibility.display}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + throw new Error(errors.join('\n')); + } + } + }, + + //NEXT ACTION + { + description: 'Select Include Related Standards checkbox', + action: async () => { + await driver.findElement(By.css('#doRel')).click(); + await driver.sleep(2000); + console.log('----->| NEXT ACTION: Clicked Include Related Standards checkbox'); + + //Wait until the modal title is located AND visible + await driver.wait(async () => { + try { + const element = await driver.findElement(By.css('.col-auto .multiselect-selected-text')); + return await element.isDisplayed(); + } catch (e) { + return false; //Element not ready yet, keep waiting + } + }, 20000, 'Related Standards dropdown did not become visible within 20 seconds'); + + console.log('Passed: Related Standards dropdown loaded successfully'); + } + }, + + //NEXT ACTION + { + description: 'Validate alert message', + action: async () => { + const multipleChecks = 'Validate alert message'; + const errors = []; + + //Click delete button + const element = await driver.findElement(By.css('#stdsubmit')).click(); + await driver.sleep(5000); + console.log('----->| NEXT ACTION: Clicked Search button'); + + //Wait for confirm dialog to appear + const alert = await driver.wait(until.alertIsPresent(), 5000); + console.log('----->| NEXT ACTION: Alert dialog appeared as expected'); + + //Get alert text + const alertText = await alert.getText(); + + //Validate alert message text + const expectedText = 'You must select at least one set of related standards'; + if (alertText === expectedText) { + console.log('Passed: Alert dialog text matched as expected'); + } else { + errors.push(`Expected: "${expectedText}"; Actual: "${alertText}"`); + } + + //Throw summary before dismissing if errors found + if (errors.length > 0) { + await alert.dismiss(); //Cancel the delete if validation failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + throw new Error(errors.join('\n')); + } + + //Accept the alert (click OK) to proceed with deletion + await alert.accept(); + console.log('----->| NEXT ACTION: Clicked alert message OK button'); + await driver.sleep(2000); + } + }, + + //Related Standards dropdown + { + description: 'Validate Related Standards dropdown list and value', + action: async () => { + const multipleChecks = 'Related Standards dropdown list'; + + //Locate and validate selected (collapsed) value + const dropdownButton = await driver.findElement( + By.css('.col-auto .multiselect-selected-text') + ); + + //Open dropdown - use the element directly, not findElement again + await dropdownButton.click(); + await driver.sleep(2000); + console.log('----->| NEXT ACTION: Clicked Related Standards dropdown'); + + //Track all errors + const errors = []; + + //Get text, font, size, and color + const elementText = await dropdownButton.getText(); + const elementFont = await dropdownButton.getCssValue('font-family'); + const elementSize = await dropdownButton.getCssValue('font-size'); + const elementColor = await dropdownButton.getCssValue('color'); + + //text + if (elementText === 'None Selected') { + console.log("Passed: None Selected default option matched as expected"); + } else { + errors.push(`Expected option: "None Selected"; Actual: "${elementText}"`); + } + + //font + if (elementFont === 'Poppins, sans-serif') { + console.log('Passed: None Selected default text font-family matched as expected'); + } else { + errors.push(`Expected: None Selected default text font-family "DM Serif Display, serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '16px') { + console.log('Passed: None Selected default text font-size matched as expected'); + } else { + errors.push(`Expected: None Selected default text font-size "16px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(33, 37, 41, 1)') { + console.log('Passed: None Selected default text color matched as expected'); + } else { + errors.push(`Expected: None Selected default text color "rgba(33, 37, 41, 1)"; Actual: "${elementColor}"`); + } + + //Wait for dropdown list to become visible + const dropdownMenu = await driver.wait( + until.elementLocated(By.css('ul.multiselect-container.dropdown-menu.show')), + 10000 + ); + + await driver.wait( + until.elementIsVisible(dropdownMenu), + 10000 + ); + + //Now safely get option labels + const optionLabels = await dropdownMenu.findElements( + By.css('li label.checkbox') + ); + + //Extract list values + const actualOptions = []; + for (const label of optionLabels) { + const text = (await label.getText()).trim(); + if (text) { + actualOptions.push(text); + } + } + + const expectedOptions = [ + 'Select all', + 'Alabama', + 'Arizona', + 'California', + 'Florida', + 'Georgia', + 'Illinois', + 'New York', + 'Texas', + 'Washington', + 'Common Core State Standards', + 'Alberta Standards', + 'Ontario Curriculum', + 'Australian Curriculum (ACARA) v8', + 'New South Wales', + 'NCSSFL-ACTFL CAN-DO STATEMENTS', + 'WIDA Consortium (2020)', + '5th Grade Import ECS-2732', + 'Imported Framework Updated', + 'NewTicket', + 'ECS-2933 Testing On Prod', + 'Widget Test', + 'ecs31444', + 'California Mathematics 1997', + 'Georgia Archived Language Arts QA', + 'Georgia Current Language Arts QA', + 'Georgia Future Language Arts QA', + 'create group test', + 'IMport Test', + 'Georgia WL Import' + ]; + + //Length validation + if (actualOptions.length !== expectedOptions.length) { + errors.push( + `Expected option count ${expectedOptions.length}; Actual ${actualOptions.length}` + ); + } + + //Value-by-value validation + expectedOptions.forEach((expected, i) => { + if (actualOptions[i] !== expected) { + errors.push( + `Index ${i}: Expected "${expected}", Actual "${actualOptions[i]}"` + ); + } + }); + + //Select "Washington" from dropdown + await driver.findElement(By.css('.show > li:nth-child(12) input')).click(); + await driver.sleep(2000); + + //Select "Common Core State Standards" from dropdown + await driver.findElement(By.css('.show > li:nth-child(14) input')).click(); + await driver.sleep(2000); + + //Select "California Mathematics 1997" from dropdown + await driver.findElement(By.css('.show > li:nth-child(34) input')).click(); + await driver.sleep(2000); + + console.log('----->| NEXT ACTION: Selected Related Standards: Washington, Common Core State Standards, California Mathematics 1997'); + + //Click away to close dropdown using executeScript to bypass interception + await driver.executeScript(` + document.querySelector('.col-auto .multiselect-selected-text').click(); + `); + await driver.sleep(2000); + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Selected Related Standards dropdown value + { + description: 'Validate Show Correlations From dropdown value', + action: async () => { + const multipleChecks = 'Show Correlations From dropdown value'; + const selectedOption = await driver.findElement(By.css('.col-auto .multiselect-selected-text')); + + //Get text, font, size, and color + const elementText = await selectedOption.getText(''); + const elementFont = await selectedOption.getCssValue('font-family'); + const elementSize = await selectedOption.getCssValue('font-size'); + const elementColor = await selectedOption.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'Washington , Common Core State Standards , California Mathematics 1997') { + console.log("Passed: Selected Content Sets dropdown options matched as expected"); + } else { + errors.push(`Expected option: "Washington , Common Core State Standards , California Mathematics 1997"; Actual: "${elementText}"`); + } + + //font + if (elementFont === 'Poppins, sans-serif') { + console.log('Passed: Selected Content Sets dropdown text font-family matched as expected'); + } else { + errors.push(`Expected: Selected Content Sets dropdown text font-family "DM Serif Display, serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '16px') { + console.log('Passed: Selected Content Sets dropdown text font-size matched as expected'); + } else { + errors.push(`Expected: Selected Content Sets dropdown text font-size "16px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(33, 37, 41, 1)') { + console.log('Passed: Selected Content Sets dropdown text color matched as expected'); + } else { + errors.push(`Expected: Selected Content Sets dropdown text color "rgba(33, 37, 41, 1)"; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //based on + { + description: 'Validate based on label text, font, size, and color', + action: async () => { + const multipleChecks = 'based on label'; + const element = await driver.findElement(By.css('.col-auto:nth-child(2)')); + + //Get text, font, size, and color + const elementText = await element.getText(); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === 'based on') { + console.log("Passed: based on label text matched as expected"); + } else { + errors.push(`Expected: "based on" label text; Actual: "${elementText}"`); + } + + //font + if (elementFont === 'Poppins, sans-serif') { + console.log('Passed: based on label font-family matched as expected'); + } else { + errors.push(`Expected: based on label font-family "DM Serif Display, serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '13px') { + console.log('Passed: based on label text font-size matched as expected'); + } else { + errors.push(`Expected: based on label text font-size "13px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: based on label text color matched as expected'); + } else { + errors.push(`Expected: based on label text color "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //best match dropdown + { + description: 'Validate best match dropdown list and value', + action: async () => { + const multipleChecks = 'best match Dropdown List'; + const select = await driver.findElement(By.css('.custom-select')); + + //Get text, font, size, and color + const selectedOption = await select.findElement(By.css('option:checked')); + const elementText = await selectedOption.getText(); + const elementFont = await selectedOption.getCssValue('font-family'); + const elementSize = await selectedOption.getCssValue('font-size'); + const elementColor = await selectedOption.getCssValue('color'); + + //text + if (elementText === 'best match') { + console.log("Passed: best match default option matched as expected"); + } else { + errors.push(`Expected option: "best match"; Actual: "${elementText}"`); + } + + //font + if (elementFont === 'Poppins, sans-serif') { + console.log('Passed: best match default text font-family matched as expected'); + } else { + errors.push(`Expected: best match default text font-family "DM Serif Display, serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '13px') { + console.log('Passed: best match default text font-size matched as expected'); + } else { + errors.push(`Expected: best match default text font-size "13px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: best match default text color matched as expected'); + } else { + errors.push(`Expected: best match default text color "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`); + } + + const options = await select.findElements(By.css('option')); + const expectedList = [ + 'best match', + 'similar text', + 'like concepts' + ]; + const actual = []; + + //Track all errors + const errors = []; + + for (const opt of options) { + const text = (await opt.getText()).trim(); + actual.push(text); + } + + if (JSON.stringify(actual) === JSON.stringify(expectedList)) { + console.log('Passed: best match Dropdown list matched as expected'); + } else { + errors.push(`Expected: best match Dropdown list: ${JSON.stringify(expectedList)}, Actual: ${JSON.stringify(actual)}`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Include Related Standards info icon | SPECIAL CASE {title data-original-title} + { + description: 'Validate info icon', + action: async () => { + const multipleChecks = 'info icon'; + const errors = []; + + //Get both text and styles in one executeScript call + const result = await driver.executeScript(` + const el = document.querySelector('[data-toggle="tooltip"][data-placement="right"]'); + if (!el) return null; + const style = window.getComputedStyle(el); + return { + tooltipText: el.getAttribute('data-original-title'), + fontFamily: style.getPropertyValue('font-family'), + fontSize: style.getPropertyValue('font-size'), + color: style.getPropertyValue('color'), + backgroundColor: style.getPropertyValue('background-color') + }; + `); + //console.log('----->| DEBUG result:', JSON.stringify(result)); + + //text + if (result.tooltipText === '"best match" uses a combination of similar text and like concepts') { + console.log('Passed: Tooltip text matched as expected'); + } else { + errors.push(`Expected: Tooltip text: '"best match" uses a combination of similar text and like concepts'; Actual: "${result.tooltipText}"`); + } + + //font + if (result.fontFamily === 'Poppins, sans-serif') { + console.log('Passed: Info icon text font-family matched as expected'); + } else { + errors.push(`Expected: Info icon font-family "Poppins, sans-serif"; Actual: "${result.fontFamily}"`); + } + + //size + if (result.fontSize === '13px') { + console.log('Passed: Info icon text font-size matched as expected'); + } else { + errors.push(`Expected: Info icon font-size "13px"; Actual: "${result.fontSize}"`); + } + + //color + if (result.color === 'rgb(40, 39, 90)') { + console.log('Passed: Info icon text color matched as expected'); + } else { + errors.push(`Expected: Info icon color rgb(40, 39, 90)"; Actual: "${result.color}"`); + } + + //background-color + if (result.backgroundColor === 'rgba(0, 0, 0, 0)') { + console.log('Passed: Info icon background-color matched as expected'); + } else { + errors.push(`Expected: Info icon background-color "rgba(0, 0, 0, 0)"; Actual: "${result.backgroundColor}"`); + } + + //Throw summary if any validation failed + if (errors.length > 0) { + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + throw new Error(errors.join('\n')); + } + } + }, + + //note + { + description: 'Validate note text, font, size, and color', + action: async () => { + const multipleChecks = 'note label'; + const element = await driver.findElement(By.css('em')); + + //Get text, font, size, and color + const elementText = await element.getText(); + const elementFont = await element.getCssValue('font-family'); + const elementSize = await element.getCssValue('font-size'); + const elementColor = await element.getCssValue('color'); + + //Track all errors + const errors = []; + + //text + if (elementText === '** note - including related standards may cause increased page load times') { + console.log("Passed: ** note text matched as expected"); + } else { + errors.push(`Expected: "** note - including related standards may cause increased page load times" label text; Actual: "${elementText}"`); + } + + //font + if (elementFont === 'Poppins, sans-serif') { + console.log('Passed: ** note text font-family matched as expected'); + } else { + errors.push(`Expected: ** note text font-family "DM Serif Display, serif"; Actual: ${elementFont}`); + } + + //size + if (elementSize === '10.4px') { + console.log('Passed: ** note text font-size matched as expected'); + } else { + errors.push(`Expected: **n ote text font-size "10.4px"; Actual: "${elementSize}"`); + } + + //color + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: ** note text color matched as expected'); + } else { + errors.push(`Expected: ** note text color "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`); + errors.push(message) + } + + //Throw summary if any validation failed + if (errors.length > 0) { + //Add summary line only when multiple checks failed + if (errors.length > 1) { + errors.unshift(`${multipleChecks} - Multiple validation checks did not pass`); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //NEXT ACTION + { + description: 'Click Search button', + action: async () => { + await driver.findElement(By.css('#stdsubmit')).click(); + console.log('----->| NEXT ACTION: Clicked Search button'); + + //Wait for page to load completely + await driver.wait(async () => { + const readyState = await driver.executeScript('return document.readyState'); + return readyState === 'complete'; + }, 30000, 'Standards search page did not fully load within 30 seconds'); + console.log('Passed: Standards Search Page loaded successfully'); + + //Wait until the modal title is located AND visible + await driver.wait(async () => { + try { + const element = await driver.findElement(By.css('.breadcrumb-item:nth-child(2)')); + return await element.isDisplayed(); + } catch (e) { + return false; //Element not ready yet, keep waiting + } + }, 20000, 'Standards breadcrumb label did not become visible within 20 seconds'); + + console.log('Passed: Standards breadcrumb label loaded successfully'); + } + }, + + ...myStandardsSearch_AlignedContent(driver), + +]; + +const logStep = (worksheet, stepDescription, status, stepIndex, timestamp, screenshotPath) => { + const json_data = XLSX.utils.sheet_to_json(worksheet, { header: 1 }); + json_data.push([stepIndex, stepDescription, status, timestamp, screenshotPath]); + return XLSX.utils.aoa_to_sheet(json_data); +}; + +const takeScreenshot = async (driver, stepIndex, stepDescription) => { + const screenshot = await driver.takeScreenshot(); + + const dir = path.join('screenshots', 'dashboardMyStandardsResults'); + + const screenshotFileName = `step_${stepIndex}_${stepDescription.replace(/\s+/g, '_')}.png`; + const screenshotPath = path.join(dir, screenshotFileName); + fs.writeFileSync(screenshotPath, screenshot, 'base64'); + return screenshotPath; +}; + +const resultsFile = path.join('results', 'dashboardMyStandards.xlsx'); + +const clearOldResults = () => { + //Remove old screenshots + const screenshotDir = path.join('screenshots', 'dashboardMyStandards'); + if (fs.existsSync(screenshotDir)) { + fs.rmSync(screenshotDir, { recursive: true, force: true }); + } + fs.mkdirSync(screenshotDir, { recursive: true }); + + //Remove old Excel file + if (fs.existsSync(resultsFile)) { + fs.unlinkSync(resultsFile); + } + fs.mkdirSync('results', { recursive: true }); +}; + +try { + //Initialize workbook and worksheet + clearOldResults(); + + //Initialize workbook and worksheet + workbook = XLSX.utils.book_new(); + worksheet = XLSX.utils.aoa_to_sheet([ + ['Step Number', 'Step Description', 'Status', 'Timestamp', 'Screenshot'] + ]); + XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); + + //Log test start time + worksheet = logStep(worksheet, 'Test Start', 'Started', '', startTime, ''); + + let allStepsPassed = true; + + const failedSteps = []; //Track failed steps + + for (const step of steps) { + const stepIndex = steps.indexOf(step) + 1; + const timestamp = new Date().toISOString(); + + try { + await step.action(); + + //Log a successful step with no screenshot + worksheet = logStep( + worksheet, + step.description, + 'Passed', + stepIndex, + timestamp, + null //No screenshot for passed steps + ); + + } catch (error) { + const screenshotPath = await takeScreenshot( + driver, + stepIndex, + `${step.description}_Failed` + ); + + worksheet = logStep( + worksheet, + step.description, + 'Failed', + stepIndex, + timestamp, + screenshotPath + ); + + console.error(`Step ${stepIndex} FAILED: ${error.message}`); + failedSteps.push(`Step ${stepIndex}: ${step.description} - ${error.message}`); //Track failed step + testStatus = 'Failed'; + allStepsPassed = false; + } + } + + if (allStepsPassed) { + console.log('------------->| THE END |<-------------'); + console.log('PASSED: DASHBOARD - My Standards Widget(dashboardMyStandards); All test steps completed successfully'); + testStatus = 'Passed'; + } else { + console.log('------------->| THE END |<-------------'); + console.log('FAILED: DASHBOARD - My Standards Widget(dashboardMyStandards); One or more test steps failed'); + console.log('FAILED STEPS:'); + failedSteps.forEach(step => console.error(` ✗ ${step}`)); + testStatus = 'Failed'; + } + + //Log test end time + const endTime = new Date().toISOString(); + worksheet = logStep(worksheet, 'Test End', testStatus, '', endTime, ''); + + //Write the updated worksheet back to the workbook and save it + workbook.Sheets['Sheet1'] = worksheet; + XLSX.writeFile(workbook, resultsFile); +} finally { + await driver.quit(); +} + })(); +} + +export default dashboardMyStandards;