From c4d68d5a13de8929def81f568de8fc7264dc9127 Mon Sep 17 00:00:00 2001 From: jhuerta Date: Tue, 7 Apr 2026 15:12:05 -0700 Subject: [PATCH] Added My Standards widget --- tests/ExACT_dashboardMyStandards.js | 4850 +++++++++++++++++++++++++++ 1 file changed, 4850 insertions(+) create mode 100644 tests/ExACT_dashboardMyStandards.js diff --git a/tests/ExACT_dashboardMyStandards.js b/tests/ExACT_dashboardMyStandards.js new file mode 100644 index 0000000..75426cb --- /dev/null +++ b/tests/ExACT_dashboardMyStandards.js @@ -0,0 +1,4850 @@ +import { Builder, By, Key, until } from 'selenium-webdriver'; +import fs from 'fs'; +import XLSX from 'xlsx'; +import path from 'path'; + +const ExACT_dashboardMyStandards = (req, res) => { + res.send('

ExACT Automated Test Script - Dashboard - My Standards Widget(ExACT_dashboardMyStandards): Initiated

'); + (async function example() { + let driver = await new Builder().forBrowser('chrome').build(); + let testStatus = 'Failed'; + let workbook; + let worksheet; + const startTime = new Date().toISOString(); + +const steps = [ + { description: 'Navigate to ExACT Landing Page', action: async () => await driver.navigate().to('https://stage.edgate.com/exact/login.php') }, + { description: 'Expand browser', action: async () => await driver.manage().window().maximize() }, + + //LOGIN + { + description: 'Login with valid credentials', + action: async () => { + + console.log('---------------->| BEGIN |<----------------'); + console.log('---------->| MY STANDARDS WIDGET|<---------'); + + 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(); + + //Wait until the element exists in the DOM + const appliedFiltersLabel = await driver.wait( + until.elementLocated(By.css('.applied-filter-sec > label')), + 30000 + ); + + //Wait until it becomes visible + await driver.wait( + until.elementIsVisible(appliedFiltersLabel), + 30000 + ); + + //Wait for page to load completely + await driver.wait(async () => { + const readyState = await driver.executeScript('return document.readyState'); + return readyState === 'complete'; + }, 30000, 'Dashboard - Correlation Dashboard Page did not fully load within 30 seconds'); + console.log('Passed: Dashboard - Correlation Dashboard Page loaded successfully'); + } + }, + + //Dashboard - Page title, text, and font size + { + description: 'Validate Dashboard - National Standards page title text, color, and size', + action: async () => { + const element = await driver.findElement(By.css('.e-heading')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text = + if (elementText === 'Correlation Dashboard') { + console.log("Passed: Dashboard - Correlation Dashboard page title matched as expected"); + } else { + const message = `Expected: Dashboard - "Correlation Dashboard" page title; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -navy blue + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Dashboard - Page title text color matched as expected'); + } else { + const message = `Expected: Dashboard - Page title text color "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '32px') { + console.log('Passed: Dashboard - Page title text font-size matched as expected'); + } else { + const message = `Expected: Dashboard - Page title text font-size "32px"; Actual: "${elementSize}"`; + 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('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 element = await driver.findElement(By.css('#mystd-tab')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text + if (elementText === 'My Standards') { + console.log('Passed: Dashboard - Semantic Standards Comparison Widget title matched as expected'); + } else { + const message = `Expected: Dashboard - "Semantic Standards Comparison"; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -navy blue + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Dashboard - Semantic Standards Comparison Widget title text color matched as expected'); + } else { + const message = `Expected: Dashboard - Semantic Standards Comparison Widget title text color "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '15px') { + console.log('Passed: Dashboard - Semantic Standards Comparison Widget title text font-size matched as expected'); + } else { + const message = `Expected: Dashboard - Semantic Standards Comparison Widget title text font-size "15px"; Actual: "${elementSize}"`; + 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('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, text, and font size (dimmed) + { + description: 'Validate Dashboard - Other Available Stndards tab title text, color, and size', + action: async () => { + const element = await driver.findElement(By.css('#availstd-tab')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text + if (elementText === 'Other Available Standards') { + console.log('Passed: Dashboard - Other Available Standards tab title matched as expected'); + } else { + const message = `Expected: Dashboard - "Other Available Standards"; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -gray (dimmed) + if (elementColor === 'rgba(182, 186, 181, 1)') { + console.log('Passed: Dashboard - Other Available Standards tab title text color matched as expected'); + } else { + const message = `Expected: Dashboard - Other Available Standards tab title text color "rgba(182, 186, 181, 1)"'; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '15px') { + console.log('Passed: Dashboard - Other Available Standards tab title text font-size matched as expected'); + } else { + const message = `Expected: Dashboard - Other Available Standards tab title text font-size "15px"; Actual: "${elementSize}"`; + 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('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 dropdown = await driver.findElement(By.css('#stdparent')); + const dropdownValue = await dropdown.getAttribute('value'); + const options = await dropdown.findElements(By.css('option')); + const expectedList = [ + 'Adding a New Org to test with', + 'Archived Standards', + 'Australia Standards', + 'Canada Standards', + 'Common Core Standards', + 'Demo Standards', + 'ECS-2732 Testing Frame II', + 'Future Standards', + 'Org To Delete', + 'QA Client Test Frameworks', + 'United States Standards' + ]; + const actual = []; + + //Track all errors + const errors = []; + + if (dropdownValue === '154828031') { + console.log("Passed: Dashboard - My Standards dropdown value matched as expected"); + } else { + const message = `Expected: Dashboard - My Standards dropdown value - "United States Standards"; Actual: "${dropdownValue}"`; + errors.push(message); + } + + for (const opt of options) { + const text = (await opt.getText()).trim(); + actual.push(text); + } + + if (JSON.stringify(actual) === JSON.stringify(expectedList)) { + console.log('Passed: Dashboard - My Standards Dropdown list matched as expected'); + } else { + const message = `Expected: Dashboard My Standards Dropdown list: ${JSON.stringify(expectedList)}, Actual: ${JSON.stringify(actual)}`; + 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('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, text, and font size + { + description: 'Validate Dashboard - My Standards Organization column title, text, and font size', + action: async () => { + const element = await driver.findElement(By.css('.table:nth-child(2) th:nth-child(1)')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text + if (elementText === 'Organization') { + console.log('Passed: Dashboard - My Standards Organization column title matched as expected'); + } else { + const message = `Expected: Dashboard - My Standards "Organization" column title; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -dark gray + if (elementColor === 'rgba(94, 105, 116, 1)') { + console.log('Passed: Dashboard - My Standards Organization column title text color matched as expected'); + } else { + const message = `Expected: Dashboard - My Standards Organization column title text color "rgba(94, 105, 116, 1)"'; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '14px') { + console.log('Passed: Dashboard - My Standards Organization column title text font-size matched as expected'); + } else { + const message = `Expected: Dashboard - My Standards Organization column title text font-size "14px"; Actual: "${elementSize}"`; + 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('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, text, and font size + { + description: 'Validate Dashboard - My Standards Export column title, text, and font size', + action: async () => { + const element = await driver.findElement(By.css('.table:nth-child(2) > thead .text-center:nth-child(2)')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text + if (elementText === 'Export') { + console.log('Passed: Dashboard - My Standards Export column title matched as expected'); + } else { + const message = `Expected: Dashboard - My Standards "Export" column title; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -dark gray + if (elementColor === 'rgba(94, 105, 116, 1)') { + console.log('Passed: Dashboard - My Standards Export column title text color matched as expected'); + } else { + const message = `Expected: Dashboard - My Standards Export column title text color "rgba(94, 105, 116, 1)"'; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '14px') { + console.log('Passed: Dashboard - My Standards Export column title text font-size matched as expected'); + } else { + const message = `Expected: Dashboard - My Standards Export column title text font-size "14px"; Actual: "${elementSize}"`; + 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('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, text, and font size + { + description: 'Validate Dashboard - My Standards Manage column title, text, and font size', + action: async () => { + const element = await driver.findElement(By.css('.text-center:nth-child(3)')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text + if (elementText === 'Manage') { + console.log('Passed: Dashboard - My Standards Manage column title matched as expected'); + } else { + const message = `Expected: Dashboard - My Standards "Manage" column title; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -dark gray + if (elementColor === 'rgba(94, 105, 116, 1)') { + console.log('Passed: Dashboard - My Standards Manage column title text color matched as expected'); + } else { + const message = `Expected: Dashboard - My Standards Manage column title text color "rgba(94, 105, 116, 1)"'; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '14px') { + console.log('Passed: Dashboard - My Standards Manage column title text font-size matched as expected'); + } else { + const message = `Expected: Dashboard - My Standards Manage column title text font-size "14px"; Actual: "${elementSize}"`; + 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('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, text, and font size + { + description: 'Validate Dashboard - My Standards More Info column title, text, and font size', + action: async () => { + const element = await driver.findElement(By.css('.table-sm > thead .text-center:nth-child(4)')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text + if (elementText === 'More Info') { + console.log('Passed: Dashboard - My Standards More Info column title matched as expected'); + } else { + const message = `Expected: Dashboard - My Standards "More Info" column title; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -dark gray + if (elementColor === 'rgba(94, 105, 116, 1)') { + console.log('Passed: Dashboard - My Standards More Info column title text color matched as expected'); + } else { + const message = `Expected: Dashboard - My Standards More Info column title text color "rgba(94, 105, 116, 1)"'; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '14px') { + console.log('Passed: Dashboard - My Standards More Info column title text font-size matched as expected'); + } else { + const message = `Expected: Dashboard - My Standards More Info column title text font-size "14px"; Actual: "${elementSize}"`; + 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('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, text, and font size + { + description: 'Validate Dashboard - My Standards View column title, text, and font size', + action: async () => { + const element = await driver.findElement(By.css('thead .text-center:nth-child(5)')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text + if (elementText === 'View') { + console.log('Passed: Dashboard - My Standards View column title matched as expected'); + } else { + const message = `Expected: Dashboard - My Standards "View" column title; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -dark gray + if (elementColor === 'rgba(94, 105, 116, 1)') { + console.log('Passed: Dashboard - My Standards View column title text color matched as expected'); + } else { + const message = `Expected: Dashboard - My Standards View column title text color "rgba(94, 105, 116, 1)"'; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '14px') { + console.log('Passed: Dashboard - My Standards View column title text font-size matched as expected'); + } else { + const message = `Expected: Dashboard - My Standards View column title text font-size "14px"; Actual: "${elementSize}"`; + 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('Multiple validation checks did not pass'); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards Organization = Alabama Standards text + { + description: 'Validate Dashboard - My Standards Organization = Alabama Standards text', + action: async () => { + const elementText = await driver.findElement(By.css('#stdbody > tr:nth-child(1) > td:nth-child(1)')).getText(); + + if (elementText === 'Alabama Standards') { + console.log("Passed: Dashboard - My Standards Alabama Standadrds text matched as expected"); + } else { + throw new Error(`Expected: Dashboard - My Standards Alabama Standadrds text "Alabama Standards"; Actual: "${elementText}"`); + } + } + }, + + //Dashboard - My Standards Alabama - Export icon + { + description: 'Verify Dashboard - My Standards Alabama - Export icon is present', + action: async () => { + const expectedIcon = await driver.wait(until.elementLocated(By.css('#stdbody > tr:nth-child(1) > .text-center:nth-child(2) img')), 5000).catch(() => false); + + if (!expectedIcon) { + throw new Error('Expected: Dashboard - My Standards Alabama - Export icon not found'); + } + console.log('Passed: Dashboard - My Standards Alabama - Export icon is present'); + } + }, + + //Dashboard - My Standards Alabama - More Info icon and title text + { + description: 'Verify Dashboard - My Standards Alabama - More Info icon and title text is present', + action: async () => { + const element = await driver.wait(until.elementLocated(By.css('#stdbody > tr:nth-child(1) > td:nth-child(4) > a')), 5000).catch(() => false); + + //Get title text + const elementTitleText = await element.getAttribute('title'); + + //Track all errors + const errors = []; + + if (!element) { + throw new Error('Expected: Dashboard - My Standards Alabama - More Info icon not found'); + } + console.log('Passed: Dashboard - My Standards Alabama - More Info icon is present'); + + //Validate title text + if (elementTitleText === 'View Detail Information') { + console.log('Passed: Dashboard - My Standards Alabama - text title matched as expected'); + } else { + const message = `Expected: Dashboard - My Standards Alabama - "View Detail Information" text title; Actual: "${elementTitleText}"`; + 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('Multiple validation checks did not pass'); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards Alabama - View icon + { + description: 'Verify Dashboard - My Standards Alabama - View icon is present', + action: async () => { + const expectedIcon = await driver.wait(until.elementLocated(By.css('tr:nth-child(1) > .text-center:nth-child(5) img')), 5000).catch(() => false); + + if (!expectedIcon) { + throw new Error('Expected: Dashboard - My Standards Alabama - View icon not found'); + } + console.log('Passed: Dashboard - My Standards Alabama - View icon is present'); + } + }, + + //Dashboard - My Standards Organization = Arizona Standards text + { + description: 'Validate Dashboard - My Standards Organization = Arizona Standards text', + action: async () => { + const elementText = await driver.findElement(By.css('#stdbody > tr:nth-child(2) > td:nth-child(1)')).getText(); + + if (elementText === 'Arizona Standards') { + console.log("Passed: Dashboard - My Standards Arizona Standadrds text matched as expected"); + } else { + throw new Error(`Expected: Dashboard - My Standards Arizona Standadrds text "Arizona Standards"; Actual: "${elementText}"`); + } + } + }, + + //Dashboard - My Standards Arizona - Export icon + { + description: 'Verify Dashboard - My Standards Arizona - Export icon is present', + action: async () => { + const expectedIcon = await driver.wait(until.elementLocated(By.css('#stdbody > tr:nth-child(2) > .text-center:nth-child(2) img')), 5000).catch(() => false); + + if (!expectedIcon) { + throw new Error('Expected: Dashboard - My Standards Arizona - Export icon not found'); + } + console.log('Passed: Dashboard - My Standards Arizona - Export icon is present'); + } + }, + + //Dashboard - My Standards Arizona - More Info icon and title text + { + description: 'Verify Dashboard - My Standards Arizona - More Info icon and title text is present', + action: async () => { + const element = await driver.wait(until.elementLocated(By.css('#stdbody > tr:nth-child(2) > td:nth-child(4) > a')), 5000).catch(() => false); + + //Get title text + const elementTitleText = await element.getAttribute('title'); + + //Track all errors + const errors = []; + + if (!element) { + throw new Error('Expected: Dashboard - My Standards Arizona - More Info icon not found'); + } + console.log('Passed: Dashboard - My Standards Arizona - More Info icon is present'); + + //Validate title text + if (elementTitleText === 'View Detail Information') { + console.log('Passed: Dashboard - My Standards Arizona - text title matched as expected'); + } else { + const message = `Expected: Dashboard - My Standards Arizona - "View Detail Information" text title; Actual: "${elementTitleText}"`; + 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('Multiple validation checks did not pass'); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards Arizona - View icon + { + description: 'Verify Dashboard - My Standards Arizona - View icon is present', + action: async () => { + const expectedIcon = await driver.wait(until.elementLocated(By.css('tr:nth-child(2) > .text-center:nth-child(5) img')), 5000).catch(() => false); + + if (!expectedIcon) { + throw new Error('Expected: Dashboard - My Standards Arizona - View icon not found'); + } + console.log('Passed: Dashboard - My Standards Arizona - View icon is present'); + } + }, + + //Dashboard - My Standards Organization = California Standards text + { + description: 'Validate Dashboard - My Standards Organization = California Standards text', + action: async () => { + const elementText = await driver.findElement(By.css('#stdbody > tr:nth-child(3) > td:nth-child(1)')).getText(); + + if (elementText === 'California Standards') { + console.log("Passed: Dashboard - My Standards California Standadrds text matched as expected"); + } else { + throw new Error(`Expected: Dashboard - My Standards California Standadrds text "California Standards"; Actual: "${elementText}"`); + } + } + }, + + //Dashboard - My Standards California - Export icon + { + description: 'Verify Dashboard - My Standards California - Export icon is present', + action: async () => { + const expectedIcon = await driver.wait(until.elementLocated(By.css('#stdbody > tr:nth-child(3) > .text-center:nth-child(2) img')), 5000).catch(() => false); + + if (!expectedIcon) { + throw new Error('Expected: Dashboard - My Standards California - Export icon not found'); + } + console.log('Passed: Dashboard - My Standards California - Export icon is present'); + } + }, + + //Dashboard - My Standards California - More Info icon and title text + { + description: 'Verify Dashboard - My Standards California - More Info icon and title text is present', + action: async () => { + const element = await driver.wait(until.elementLocated(By.css('#stdbody > tr:nth-child(3) > td:nth-child(4) > a')), 5000).catch(() => false); + + //Get title text + const elementTitleText = await element.getAttribute('title'); + + //Track all errors + const errors = []; + + if (!element) { + throw new Error('Expected: Dashboard - My Standards California - More Info icon not found'); + } + console.log('Passed: Dashboard - My Standards California - More Info icon is present'); + + //Validate title text + if (elementTitleText === 'View Detail Information') { + console.log('Passed: Dashboard - My Standards California - text title matched as expected'); + } else { + const message = `Expected: Dashboard - My Standards California - "View Detail Information" text title; Actual: "${elementTitleText}"`; + 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('Multiple validation checks did not pass'); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards California - View icon + { + description: 'Verify Dashboard - My Standards California - View icon is present', + action: async () => { + const expectedIcon = await driver.wait(until.elementLocated(By.css('tr:nth-child(3) > .text-center:nth-child(5) img')), 5000).catch(() => false); + + if (!expectedIcon) { + throw new Error('Expected: Dashboard - My Standards California - View icon not found'); + } + console.log('Passed: Dashboard - My Standards California - View icon is present'); + } + }, + + //Dashboard - My Standards Organization = Florida Standards text + { + description: 'Validate Dashboard - My Standards Organization = Florida Standards text', + action: async () => { + const elementText = await driver.findElement(By.css('#stdbody > tr:nth-child(4) > td:nth-child(1)')).getText(); + + if (elementText === 'Florida Standards') { + console.log("Passed: Dashboard - My Standards Florida Standadrds text matched as expected"); + } else { + throw new Error(`Expected: Dashboard - My Standards Florida Standadrds text "Florida Standards"; Actual: "${elementText}"`); + } + } + }, + + //Dashboard - My Standards Florida - Export icon + { + description: 'Verify Dashboard - My Standards Florida - Export icon is present', + action: async () => { + const expectedIcon = await driver.wait(until.elementLocated(By.css('#stdbody > tr:nth-child(4) > .text-center:nth-child(2) img')), 5000).catch(() => false); + + if (!expectedIcon) { + throw new Error('Expected: Dashboard - My Standards Florida - Export icon not found'); + } + console.log('Passed: Dashboard - My Standards Florida - Export icon is present'); + } + }, + + //Dashboard - My Standards Florida - More Info icon and title text + { + description: 'Verify Dashboard - My Standards Florida - More Info icon and title text is present', + action: async () => { + const element = await driver.wait(until.elementLocated(By.css('#stdbody > tr:nth-child(4) > td:nth-child(4) > a')), 5000).catch(() => false); + + //Get title text + const elementTitleText = await element.getAttribute('title'); + + //Track all errors + const errors = []; + + if (!element) { + throw new Error('Expected: Dashboard - My Standards Florida - More Info icon not found'); + } + console.log('Passed: Dashboard - My Standards Florida - More Info icon is present'); + + //Validate title text + if (elementTitleText === 'View Detail Information') { + console.log('Passed: Dashboard - My Standards Florida - text title matched as expected'); + } else { + const message = `Expected: Dashboard - My Standards Florida - "View Detail Information" text title; Actual: "${elementTitleText}"`; + 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('Multiple validation checks did not pass'); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards Florida - View icon + { + description: 'Verify Dashboard - My Standards Florida - View icon is present', + action: async () => { + const expectedIcon = await driver.wait(until.elementLocated(By.css('tr:nth-child(4) > .text-center:nth-child(5) img')), 5000).catch(() => false); + + if (!expectedIcon) { + throw new Error('Expected: Dashboard - My Standards Florida - View icon not found'); + } + console.log('Passed: Dashboard - My Standards Florida - View icon is present'); + } + }, + + //Dashboard - My Standards Organization = New York Standards text + { + description: 'Validate Dashboard - My Standards Organization = New York Standards text', + action: async () => { + const elementText = await driver.findElement(By.css('#stdbody > tr:nth-child(5) > td:nth-child(1)')).getText(); + + if (elementText === 'New York Standards') { + console.log("Passed: Dashboard - My Standards New York Standadrds text matched as expected"); + } else { + throw new Error(`Expected: Dashboard - My Standards "New York Standards"; Actual: "${elementText}"`); + } + } + }, + + //Dashboard - My Standards New York - Export icon + { + description: 'Verify Dashboard - My Standards New York - Export icon is present', + action: async () => { + const expectedIcon = await driver.wait(until.elementLocated(By.css('#stdbody > tr:nth-child(5) > .text-center:nth-child(2) img')), 5000).catch(() => false); + + if (!expectedIcon) { + throw new Error('Expected: Dashboard - My Standards New York - Export icon not found'); + } + console.log('Passed: Dashboard - My Standards New York - Export icon is present'); + } + }, + + //Dashboard - My Standards New York - More Info icon and title text + { + description: 'Verify Dashboard - My Standards New York - More Info icon and title text is present', + action: async () => { + const element = await driver.wait(until.elementLocated(By.css('#stdbody > tr:nth-child(5) > td:nth-child(4) > a')), 5000).catch(() => false); + + //Get title text + const elementTitleText = await element.getAttribute('title'); + + //Track all errors + const errors = []; + + if (!element) { + throw new Error('Expected: Dashboard - My Standards New York - More Info icon not found'); + } + console.log('Passed: Dashboard - My Standards New York - More Info icon is present'); + + //Validate title text + if (elementTitleText === 'View Detail Information') { + console.log('Passed: Dashboard - My Standards New York - text title matched as expected'); + } else { + const message = `Expected: Dashboard - My Standards New York - "View Detail Information" text title; Actual: "${elementTitleText}"`; + 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('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 - View icon + { + description: 'Verify Dashboard - My Standards New York - View icon is present', + action: async () => { + const expectedIcon = await driver.wait(until.elementLocated(By.css('tr:nth-child(5) > .text-center:nth-child(5) img')), 5000).catch(() => false); + + if (!expectedIcon) { + throw new Error('Expected: Dashboard - My Standards New York - View icon not found'); + } + console.log('Passed: Dashboard - My Standards New York - View icon is present'); + } + }, + + //Dashboard - My Standards Organization = North Carolina Standards text + { + description: 'Validate Dashboard - My Standards Organization = North Carolina Standards text', + action: async () => { + const elementText = await driver.findElement(By.css('#stdbody > tr:nth-child(6) > td:nth-child(1)')).getText(); + + if (elementText === 'North Carolina Standards') { + console.log("Passed: Dashboard - My Standards North Carolina Standadrds text matched as expected"); + } else { + throw new Error(`Expected: Dashboard - My Standards "North Carolina Standards"; Actual: "${elementText}"`); + } + } + }, + + //Dashboard - My Standards North Carolina - Export icon + { + description: 'Verify Dashboard - My Standards North Carolina - Export icon is present', + action: async () => { + const expectedIcon = await driver.wait(until.elementLocated(By.css('#stdbody > tr:nth-child(6) > .text-center:nth-child(2) img')), 5000).catch(() => false); + + if (!expectedIcon) { + throw new Error('Expected: Dashboard - My Standards North Carolina - Export icon not found'); + } + console.log('Passed: Dashboard - My Standards North Carolina - Export icon is present'); + } + }, + + //Dashboard - My Standards North Carolina - More Info icon and title text + { + description: 'Verify Dashboard - My Standards North Carolina - More Info icon and title text is present', + action: async () => { + const element = await driver.wait(until.elementLocated(By.css('#stdbody > tr:nth-child(6) > td:nth-child(4) > a')), 5000).catch(() => false); + + //Get title text + const elementTitleText = await element.getAttribute('title'); + + //Track all errors + const errors = []; + + if (!element) { + throw new Error('Expected: Dashboard - My Standards North Carolina - More Info icon not found'); + } + console.log('Passed: Dashboard - My Standards North Carolina - More Info icon is present'); + + //Validate title text + if (elementTitleText === 'View Detail Information') { + console.log('Passed: Dashboard - My Standards North Carolina - text title matched as expected'); + } else { + const message = `Expected: Dashboard - My Standards North Carolina - "View Detail Information" text title; Actual: "${elementTitleText}"`; + 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('Multiple validation checks did not pass'); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards North Carolina - View icon + { + description: 'Verify Dashboard - My Standards North Carolina - View icon is present', + action: async () => { + const expectedIcon = await driver.wait(until.elementLocated(By.css('tr:nth-child(6) > .text-center:nth-child(5) img')), 5000).catch(() => false); + + if (!expectedIcon) { + throw new Error('Expected: Dashboard - My Standards North Carolina - View icon not found'); + } + console.log('Passed: Dashboard - My Standards North Carolina - View icon is present'); + } + }, + + //Dashboard - My Standards Organization = South Carolina Standards text + { + description: 'Validate Dashboard - My Standards Organization = South Carolina Standards text', + action: async () => { + const elementText = await driver.findElement(By.css('#stdbody > tr:nth-child(7) > td:nth-child(1)')).getText(); + + if (elementText === 'South Carolina Standards') { + console.log("Passed: Dashboard - My Standards South Carolina Standadrds text matched as expected"); + } else { + throw new Error(`Expected: Dashboard - My Standards "South Carolina Standards"; Actual: "${elementText}"`); + } + } + }, + + //Dashboard - My Standards South Carolina - Export icon + { + description: 'Verify Dashboard - My Standards South Carolina - Export icon is present', + action: async () => { + const expectedIcon = await driver.wait(until.elementLocated(By.css('#stdbody > tr:nth-child(7) > .text-center:nth-child(2) img')), 5000).catch(() => false); + + if (!expectedIcon) { + throw new Error('Expected: Dashboard - My Standards South Carolina - Export icon not found'); + } + console.log('Passed: Dashboard - My Standards South Carolina - Export icon is present'); + } + }, + + //Dashboard - My Standards South Carolina - More Info icon and title text + { + description: 'Verify Dashboard - My Standards South Carolina - More Info icon and title text is present', + action: async () => { + const element = await driver.wait(until.elementLocated(By.css('#stdbody > tr:nth-child(7) > td:nth-child(4) > a')), 5000).catch(() => false); + + //Get title text + const elementTitleText = await element.getAttribute('title'); + + //Track all errors + const errors = []; + + if (!element) { + throw new Error('Expected: Dashboard - My Standards South Carolina - More Info icon not found'); + } + console.log('Passed: Dashboard - My Standards South Carolina - More Info icon is present'); + + //Validate title text + if (elementTitleText === 'View Detail Information') { + console.log('Passed: Dashboard - My Standards South Carolina - text title matched as expected'); + } else { + const message = `Expected: Dashboard - My Standards South Carolina - "View Detail Information" text title; Actual: "${elementTitleText}"`; + 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('Multiple validation checks did not pass'); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards South Carolina - View icon + { + description: 'Verify Dashboard - My Standards South Carolina - View icon is present', + action: async () => { + const expectedIcon = await driver.wait(until.elementLocated(By.css('tr:nth-child(7) > .text-center:nth-child(5) img')), 5000).catch(() => false); + + if (!expectedIcon) { + throw new Error('Expected: Dashboard - My Standards South Carolina - View icon not found'); + } + console.log('Passed: Dashboard - My Standards South Carolina - View icon is present'); + } + }, + + //Dashboard - My Standards Organization = Texas TEKS Standards text + { + description: 'Validate Dashboard - My Standards Organization = Texas TEKS Standards text', + action: async () => { + const elementText = await driver.findElement(By.css('#stdbody > tr:nth-child(8) > td:nth-child(1)')).getText(); + + if (elementText === 'Texas TEKS Standards') { + console.log("Passed: Dashboard - My Standards Texas TEKS Standadrds text matched as expected"); + } else { + throw new Error(`Expected: Dashboard - My Standards "Texas TEKS Standards"; Actual: "${elementText}"`); + } + } + }, + + //Dashboard - My Standards Texas TEKS - Export icon + { + description: 'Verify Dashboard - My Standards Texas TEKS - Export icon is present', + action: async () => { + const expectedIcon = await driver.wait(until.elementLocated(By.css('#stdbody > tr:nth-child(8) > .text-center:nth-child(2) img')), 5000).catch(() => false); + + if (!expectedIcon) { + throw new Error('Expected: Dashboard - My Standards Texas TEKS - Export icon not found'); + } + console.log('Passed: Dashboard - My Standards Texas TEKS - Export icon is present'); + } + }, + + //Dashboard - My Standards Texas TEKS - More Info icon and title text + { + description: 'Verify Dashboard - My Standards Texas TEKS - More Info icon and title text is present', + action: async () => { + const element = await driver.wait(until.elementLocated(By.css('#stdbody > tr:nth-child(8) > td:nth-child(4) > a')), 5000).catch(() => false); + + //Get title text + const elementTitleText = await element.getAttribute('title'); + + //Track all errors + const errors = []; + + if (!element) { + throw new Error('Expected: Dashboard - My Standards Texas TEKS - More Info icon not found'); + } + console.log('Passed: Dashboard - My Standards Texas TEKS - More Info icon is present'); + + //Validate title text + if (elementTitleText === 'View Detail Information') { + console.log('Passed: Dashboard - My Standards Texas TEKS - text title matched as expected'); + } else { + const message = `Expected: Dashboard - My Standards Texas TEKS - "View Detail Information" text title; Actual: "${elementTitleText}"`; + 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('Multiple validation checks did not pass'); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards Texas TEKS - View icon + { + description: 'Verify Dashboard - My Standards Texas TEKS - View icon is present', + action: async () => { + const expectedIcon = await driver.wait(until.elementLocated(By.css('tr:nth-child(8) > .text-center:nth-child(5) img')), 5000).catch(() => false); + + if (!expectedIcon) { + throw new Error('Expected: Dashboard - My Standards Texas TEKS - View icon not found'); + } + console.log('Passed: Dashboard - My Standards Texas TEKS - View icon is present'); + } + }, + + //Dashboard - My Standards Organization = Washington Standards text + { + description: 'Validate Dashboard - My Standards Organization = Washington Standards text', + action: async () => { + const elementText = await driver.findElement(By.css('#stdbody > tr:nth-child(9) > td:nth-child(1)')).getText(); + + if (elementText === 'Washington Standards') { + console.log("Passed: Dashboard - My Standards Washington Standadrds text matched as expected"); + } else { + throw new Error(`Expected: Dashboard - My Standards "Washington Standards"; Actual: "${elementText}"`); + } + } + }, + + //Dashboard - My Standards Washington - Export icon + { + description: 'Verify Dashboard - My Standards Washington - Export icon is present', + action: async () => { + const expectedIcon = await driver.wait(until.elementLocated(By.css('#stdbody > tr:nth-child(9) > .text-center:nth-child(2) img')), 5000).catch(() => false); + + if (!expectedIcon) { + throw new Error('Expected: Dashboard - My Standards Washington - Export icon not found'); + } + console.log('Passed: Dashboard - My Standards Washington - Export icon is present'); + } + }, + + //Dashboard - My Standards Washington - More Info icon and title text + { + description: 'Verify Dashboard - My Standards Washington - More Info icon and title text is present', + action: async () => { + const element = await driver.wait(until.elementLocated(By.css('#stdbody > tr:nth-child(9) > td:nth-child(4) > a')), 5000).catch(() => false); + + //Get title text + const elementTitleText = await element.getAttribute('title'); + + //Track all errors + const errors = []; + + if (!element) { + throw new Error('Expected: Dashboard - My Standards Washington - More Info icon not found'); + } + console.log('Passed: Dashboard - My Standards Washington - More Info icon is present'); + + //Validate title text + if (elementTitleText === 'View Detail Information') { + console.log('Passed: Dashboard - My Standards Washington - text title matched as expected'); + } else { + const message = `Expected: Dashboard - My Standards Washington - "View Detail Information" text title; Actual: "${elementTitleText}"`; + 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('Multiple validation checks did not pass'); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - My Standards Washington - View icon + { + description: 'Verify Dashboard - My Standards Washington - View icon is present', + action: async () => { + const expectedIcon = await driver.wait(until.elementLocated(By.css('tr:nth-child(9) > .text-center:nth-child(5) img')), 5000).catch(() => false); + + if (!expectedIcon) { + throw new Error('Expected: Dashboard - My Standards Washington - View icon not found'); + } + console.log('Passed: Dashboard - My Standards Washington - View icon is present'); + } + }, + + /*NEXT ACTION - Click Other Available Standards tab + { + description: 'Dashboard - Click Other Available Standards tab', + action: async () => { + console.log('----->| NEXT ACTION: Clicked Other Available Standards tab'); + await driver.findElement(By.css('#availstd-tab')).click(); + await driver.sleep(2000); + } + }, + + //Dashboard - My Standards Widget title (dimmed) + { + description: 'Validate Dashboard Semantic Standards Comparison Widget title text, color, and size', + action: async () => { + const element = await driver.findElement(By.css('#mystd-tab')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text + if (elementText === 'My Standards') { + console.log('Passed: Dashboard - Semantic Standards Comparison Widget title matched as expected'); + } else { + const message = `Expected: Dashboard - "Semantic Standards Comparison"; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -gray (dimmed) + if (elementColor === 'rgba(182, 186, 181, 1)') { + console.log('Passed: Dashboard - Semantic Standards Comparison Widget title text color matched as expected'); + } else { + const message = `Expected: Dashboard - Semantic Standards Comparison Widget title text color "rgba(182, 186, 181, 1)"; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '15px') { + console.log('Passed: Dashboard - Semantic Standards Comparison Widget title text font-size matched as expected'); + } else { + const message = `Expected: Dashboard - Semantic Standards Comparison Widget title text font-size "15px"; Actual: "${elementSize}"`; + 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('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, text, and font size (active) + { + description: 'Validate Dashboard - Other Available Stndards tab title text, color, and size', + action: async () => { + const element = await driver.findElement(By.css('#availstd-tab')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text + if (elementText === 'Other Available Standards') { + console.log('Passed: Dashboard - Other Available Standards tab title matched as expected'); + } else { + const message = `Expected: Dashboard - "Other Available Standards"; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -navy blue + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Dashboard - Other Available Standards tab title text color matched as expected'); + } else { + const message = `Expected: Dashboard - Other Available Standards tab title text color "rgba(40, 39, 90, 1)"'; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '15px') { + console.log('Passed: Dashboard - Other Available Standards tab title text font-size matched as expected'); + } else { + const message = `Expected: Dashboard - Other Available Standards tab title text font-size "15px"; Actual: "${elementSize}"`; + 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('Multiple validation checks did not pass'); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Dashboard - Other Available Standards description text + { + description: 'Validate Dashboard - Other Available Standards description text', + action: async () => { + const elementText = await driver.findElement(By.css('p:nth-child(1)')).getText(); + + 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 { + throw new Error(`Expected: Dashboard - Other Available Standards description text "The following standards are also available to clients. If you would like access to any of these standards sets, please Contact Us."; Actual: "${elementText}"`); + } + } + }, + + //Dashboard - Other Available Standards dropdown + { + description: 'Validate Dashboard - Other Available Standards dropdown list and value', + action: async () => { + const dropdown = await driver.findElement(By.css('#defstdparent')); + const dropdownValue = await dropdown.getAttribute('value'); + const options = await dropdown.findElements(By.css('option')); + const expectedList = [ + 'Additional U.S. Standards', + 'Australia Standards', + 'Canada Standards', + 'England Standards', + 'National Standards', + 'Supplemental Standards', + 'United States Standards' + ]; + const actual = []; + + //Track all errors + const errors = []; + + if (dropdownValue === '154828031') { + console.log("Passed: Dashboard - Other Available Standards dropdown value matched as expected"); + } else { + const message = `Expected: Dashboard - Other Available Standards dropdown value - "United States Standards"; Actual: "${dropdownValue}"`; + errors.push(message); + } + + for (const opt of options) { + const text = (await opt.getText()).trim(); + actual.push(text); + } + + if (JSON.stringify(actual) === JSON.stringify(expectedList)) { + console.log('Passed: Dashboard - Other Available Standards Dropdown list matched as expected'); + } else { + const message = `Expected: Dashboard - Other Available Standards Dropdown list: ${JSON.stringify(expectedList)}, Actual: ${JSON.stringify(actual)}`; + 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('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, text, and font size + { + description: 'Validate Dashboard - Other Available Standards Organization column title, text, and font size', + action: async () => { + const element = await driver.findElement(By.css('.table:nth-child(3) th:nth-child(1)')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text + if (elementText === 'Organization') { + console.log('Passed: Dashboard - Other Available Standards Organization column title matched as expected'); + } else { + const message = `Expected: Dashboard - Other Available Standards "Organization" column title; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -dark gray + if (elementColor === 'rgba(94, 105, 116, 1)') { + console.log('Passed: Dashboard - Other Available Standards Organization column title text color matched as expected'); + } else { + const message = `Expected: Dashboard - Other Available Standards Organization column title text color "rgba(94, 105, 116, 1)"'; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '14px') { + console.log('Passed: Dashboard - Other Available Standards Organization column title text font-size matched as expected'); + } else { + const message = `Expected: Dashboard - Other Available Standards Organization column title text font-size "14px"; Actual: "${elementSize}"`; + 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('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, text, and font size + { + description: 'Validate Dashboard - Other Available Standards More Info column title, text, and font size', + action: async () => { + const element = await driver.findElement(By.css('.table:nth-child(3) > thead .text-center')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text + if (elementText === 'More Info') { + console.log('Passed: Dashboard - Other Available Standards More Info column title matched as expected'); + } else { + const message = `Expected: Dashboard - Other Available Standards "More Info" column title; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -dark gray + if (elementColor === 'rgba(94, 105, 116, 1)') { + console.log('Passed: Dashboard - Other Available Standards More Info column title text color matched as expected'); + } else { + const message = `Expected: Dashboard - Other Available Standards More Info column title text color "rgba(94, 105, 116, 1)"'; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '14px') { + console.log('Passed: Dashboard - Other Available Standards More Info column title text font-size matched as expected'); + } else { + const message = `Expected: Dashboard - Other Available Standards More Info column title text font-size "14px"; Actual: "${elementSize}"`; + 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('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 Standards text + { + description: 'Validate Dashboard - Other Available Standards - Alaska Standards text', + action: async () => { + const elementText = await driver.findElement(By.css('#defstdbody > tr:nth-child(1) > td:nth-child(1)')).getText(); + + if (elementText === 'Alaska Standards') { + console.log("Passed: Dashboard - Other Available Standards - Alaska Standards text matched as expected"); + } else { + throw new Error(`Expected: Dashboard - Other Available Standards - "Alaska Standards"; Actual: "${elementText}"`); + } + } + }, + + //Dashboard - Other Available Standards - Alaska Standards More Info icon + { + description: 'Verify Dashboard - Other Available Standards - Alaska Standards icon is present', + action: async () => { + const expectedIcon = await driver.wait(until.elementLocated(By.css('#defstdbody > tr:nth-child(1) img')), 5000).catch(() => false); + + if (!expectedIcon) { + throw new Error('Expected: Dashboard - Other Available Standards - Alaska Standards More Info icon not found'); + } + console.log('Passed: Dashboard - Other Available Standards - Alaska Standards More Info icon is present'); + } + }, + + //Dashboard - Other Available Standards - Arkansas Standards text + { + description: 'Validate Dashboard - Other Available Standards - Arkansas Standards text', + action: async () => { + const elementText = await driver.findElement(By.css('#defstdbody > tr:nth-child(2) > td:nth-child(1)')).getText(); + + if (elementText === 'Arkansas Standards') { + console.log("Passed: Dashboard - Other Available Standards - Arkansas Standards text matched as expected"); + } else { + throw new Error(`Expected: Dashboard - Other Available Standards - "Arkansas Standards"; Actual: "${elementText}"`); + } + } + }, + + //Dashboard - Other Available Standards - Arkansas Standards More Info icon + { + description: 'Verify Dashboard - Other Available Standards - Arkansas Standards icon is present', + action: async () => { + const expectedIcon = await driver.wait(until.elementLocated(By.css('#defstdbody > tr:nth-child(2) img')), 5000).catch(() => false); + + if (!expectedIcon) { + throw new Error('Expected: Dashboard - Other Available Standards - Arkansas Standards More Info icon not found'); + } + console.log('Passed: Dashboard - Other Available Standards - Arkansas Standards More Info icon is present'); + } + }, + + //Dashboard - Other Available Standards - Colorado Standards text + { + description: 'Validate Dashboard - Other Available Standards - Colorado Standards text', + action: async () => { + const elementText = await driver.findElement(By.css('#defstdbody > tr:nth-child(3) > td:nth-child(1)')).getText(); + + if (elementText === 'Colorado Standards') { + console.log("Passed: Dashboard - Other Available Standards - Colorado Standards text matched as expected"); + } else { + throw new Error(`Expected: Dashboard - Other Available Standards - "Colorado Standards"; Actual: "${elementText}"`); + } + } + }, + + //Dashboard - Other Available Standards - Colorado Standards More Info icon + { + description: 'Verify Dashboard - Other Available Standards - Colorado Standards icon is present', + action: async () => { + const expectedIcon = await driver.wait(until.elementLocated(By.css('#defstdbody > tr:nth-child(3) img')), 5000).catch(() => false); + + if (!expectedIcon) { + throw new Error('Expected: Dashboard - Other Available Standards - Colorado Standards More Info icon not found'); + } + console.log('Passed: Dashboard - Other Available Standards - Colorado Standards More Info icon is present'); + } + }, + + //Dashboard - Other Available Standards - Connecticut Standards text + { + description: 'Validate Dashboard - Other Available Standards - Connecticut Standards text', + action: async () => { + const elementText = await driver.findElement(By.css('#defstdbody > tr:nth-child(4) > td:nth-child(1)')).getText(); + + if (elementText === 'Connecticut Standards') { + console.log("Passed: Dashboard - Other Available Standards - Connecticut Standards text matched as expected"); + } else { + throw new Error(`Expected: Dashboard - Other Available Standards - "Connecticut Standards"; Actual: "${elementText}"`); + } + } + }, + + //Dashboard - Other Available Standards - Connecticut Standards More Info icon + { + description: 'Verify Dashboard - Other Available Standards - Connecticut Standards icon is present', + action: async () => { + const expectedIcon = await driver.wait(until.elementLocated(By.css('#defstdbody > tr:nth-child(4) img')), 5000).catch(() => false); + + if (!expectedIcon) { + throw new Error('Expected: Dashboard - Other Available Standards - Connecticut Standards More Info icon not found'); + } + console.log('Passed: Dashboard - Other Available Standards - Connecticut Standards More Info icon is present'); + } + }, + + //Dashboard - Other Available Standards - Delaware Standards text + { + description: 'Validate Dashboard - Other Available Standards - Delaware Standards text', + action: async () => { + const elementText = await driver.findElement(By.css('#defstdbody > tr:nth-child(5) > td:nth-child(1)')).getText(); + + if (elementText === 'Delaware Standards') { + console.log("Passed: Dashboard - Other Available Standards - Delaware Standards text matched as expected"); + } else { + throw new Error(`Expected: Dashboard - Other Available Standards - "Delaware Standards"; Actual: "${elementText}"`); + } + } + }, + + //Dashboard - Other Available Standards - Delaware Standards More Info icon + { + description: 'Verify Dashboard - Other Available Standards - Delaware Standards icon is present', + action: async () => { + const expectedIcon = await driver.wait(until.elementLocated(By.css('#defstdbody > tr:nth-child(5) img')), 5000).catch(() => false); + + if (!expectedIcon) { + throw new Error('Expected: Dashboard - Other Available Standards - Delaware Standards More Info icon not found'); + } + console.log('Passed: Dashboard - Other Available Standards - Delaware Standards More Info icon is present'); + } + }, + + //NEXT ACTION - Click MyStandards tab + { + description: 'Dashboard - Click My Standards tab', + action: async () => { + console.log('----->| NEXT ACTION: Clicked My Standards tab'); + await driver.findElement(By.css('#mystd-tab')).click(); + await driver.sleep(2000); + } + }, + + //Dashboard - My Standards Widget title (active) + { + description: 'Validate Dashboard Semantic Standards Comparison Widget title text, color, and size', + action: async () => { + const element = await driver.findElement(By.css('#mystd-tab')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text + if (elementText === 'My Standards') { + console.log('Passed: Dashboard - Semantic Standards Comparison Widget title matched as expected'); + } else { + const message = `Expected: Dashboard - "Semantic Standards Comparison"; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -navy blue + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Dashboard - Semantic Standards Comparison Widget title text color matched as expected'); + } else { + const message = `Expected: Dashboard - Semantic Standards Comparison Widget title text color "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '15px') { + console.log('Passed: Dashboard - Semantic Standards Comparison Widget title text font-size matched as expected'); + } else { + const message = `Expected: Dashboard - Semantic Standards Comparison Widget title text font-size "15px"; Actual: "${elementSize}"`; + 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('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, text, and font size (dimmed) + { + description: 'Validate Dashboard - Other Available Stndards tab title text, color, and size', + action: async () => { + const element = await driver.findElement(By.css('#availstd-tab')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text + if (elementText === 'Other Available Standards') { + console.log('Passed: Dashboard - Other Available Standards tab title matched as expected'); + } else { + const message = `Expected: Dashboard - "Other Available Standards"; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -gray (dimmed) + if (elementColor === 'rgba(182, 186, 181, 1)') { + console.log('Passed: Dashboard - Other Available Standards tab title text color matched as expected'); + } else { + const message = `Expected: Dashboard - Other Available Standards tab title text color "rgba(182, 186, 181, 1)"'; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '15px') { + console.log('Passed: Dashboard - Other Available Standards tab title text font-size matched as expected'); + } else { + const message = `Expected: Dashboard - Other Available Standards tab title text font-size "15px"; Actual: "${elementSize}"`; + 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('Multiple validation checks did not pass'); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //NEXT ACTION - Click Alabama Export icon + { + description: 'Dashboard - Click Alabama Export icon', + action: async () => { + console.log('----->| NEXT ACTION: Clicked Alabama Export icon'); + await driver.findElement(By.css('#stdbody > tr:nth-child(1) > .text-center:nth-child(2) img')).click(); + } + }, + + //Wait for element + { + description: 'Wait for DIV to be visible', + action: async () => { + + //Wait until the element exists in the DOM + const elementVisible = await driver.wait( + until.elementLocated(By.css('.modal-lg .modal-title')), + 20000 + ); + + //Wait until it becomes visible + await driver.wait( + until.elementIsVisible(elementVisible), + 20000 + ); + await driver.sleep(2000); + } + }, + + //DIV - Export Standards title, text, and font size + { + description: 'Validate DIV - Export Standards title text, color, and size', + action: async () => { + const element = await driver.findElement(By.css('.modal-lg .modal-title')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text + if (elementText === 'Export Standards') { + console.log('Passed: DIV - Export Standards title matched as expected'); + } else { + const message = `Expected: DIV - "Export Standards"; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -navy blue + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: DIV - Export Standards title text color matched as expected'); + } else { + const message = `Expected: DIV - Export Standards title text color "rgba(40, 39, 90, 1)"'; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '18px') { + console.log('Passed: DIV - Export Standards title text font-size matched as expected'); + } else { + const message = `Expected: DIV - Export Standards title text font-size "18px"; Actual: "${elementSize}"`; + 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('Multiple validation checks did not pass'); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - Alabama Standards sub-title, text, and font size + { + description: 'Validate DIV - Alabama Standards sub-title text, color, and size', + action: async () => { + const element = await driver.findElement(By.css('p > b')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text + if (elementText === 'Alabama Standards') { + console.log('Passed: DIV - Alabama Standards sub-title matched as expected'); + } else { + const message = `Expected: DIV - sub-title "Alabama Standards"; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -navy blue + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: DIV - Alabama Standards sub-title text color matched as expected'); + } else { + const message = `Expected: DIV - Alabama Standards sub-title text color "rgba(40, 39, 90, 1)"'; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '13px') { + console.log('Passed: DIV - Alabama Standards sub-title text font-size matched as expected'); + } else { + const message = `Expected: DIV - Alabama Standards sub-title text font-size "13px"; Actual: "${elementSize}"`; + 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('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, text, and font size + { + description: 'Validate DIV - Alabama Standards Subject label text, color, and size', + action: async () => { + const element = await driver.findElement(By.css('.form-row:nth-child(2) > .form-group:nth-child(1) > label')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text + if (elementText === 'Subject') { + console.log('Passed: DIV - Alabama Standards Subject label matched as expected'); + } else { + const message = `Expected: DIV - "Subject" label; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -navy blue + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: DIV - Alabama Standards Subject label text color matched as expected'); + } else { + const message = `Expected: DIV - Alabama Standards Subject label text color "rgba(40, 39, 90, 1)"'; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '15px') { + console.log('Passed: DIV - Alabama Standards Subject label text font-size matched as expected'); + } else { + const message = `Expected: DIV - Alabama Standards Subject label text font-size "15px"; Actual: "${elementSize}"`; + 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('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 select = await driver.findElement(By.css('#exsubject')); + + // Get the selected option text + const selectedOption = await select.findElement(By.css('option:checked')); + const selectedText = await selectedOption.getText(); + + if (selectedText === 'Choose a subject') { + console.log('Passed: DIV - Subject Choose a subject default value matched as expected'); + } else { + throw new Error(`Expected DIV - Subject "Choose a subject"; Actual: "${selectedText}"`); + } + + const options = await select.findElements(By.css('option')); + const expectedList = [ + 'Choose a subject', + 'Language Arts', + 'Mathematics', + 'Science', + 'Social Studies', + 'World Languages' + ]; + 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: DIV - Subject Dropdown list matched as expected'); + } else { + const message = `Expected: DIV - Subject Dropdown list: ${JSON.stringify(expectedList)}, Actual: ${JSON.stringify(actual)}`; + 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('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, text, and font size + { + description: 'Validate DIV - Alabama Standards Format label text, color, and size', + action: async () => { + const element = await driver.findElement(By.css('.form-row:nth-child(2) > .form-group:nth-child(2) > label')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text + if (elementText === 'Format') { + console.log('Passed: DIV - Alabama Standards Format label matched as expected'); + } else { + const message = `Expected: DIV - "Format" label; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -navy blue + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: DIV - Alabama Standards Format label text color matched as expected'); + } else { + const message = `Expected: DIV - Alabama Standards Format label text color "rgba(40, 39, 90, 1)"'; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '15px') { + console.log('Passed: DIV - Alabama Standards Format label text font-size matched as expected'); + } else { + const message = `Expected: DIV - Alabama Standards Format label text font-size "15px"; Actual: "${elementSize}"`; + 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('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 dropdown = await driver.findElement(By.css('#exformat')); + const dropdownValue = await dropdown.getAttribute('value'); + const options = await dropdown.findElements(By.css('option')); + const expectedList = [ + 'CSV', + 'JSON' + ]; + const actual = []; + + //Track all errors + const errors = []; + + if (dropdownValue === 'csv') { + console.log("Passed: DIV - Format dropdown value matched as expected"); + } else { + const message = `Expected: DIV - Format dropdown value - "CSV"; Actual: "${dropdownValue}"`; + errors.push(message); + } + + 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 { + const message = `Expected: DIV - Format Dropdown list: ${JSON.stringify(expectedList)}, Actual: ${JSON.stringify(actual)}`; + 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('Multiple validation checks did not pass'); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - Alabama Standards Grades label, text, and font size + { + description: 'Validate DIV - Alabama Standards Grades label text, color, and size', + action: async () => { + const element = await driver.findElement(By.css('.col-md-12:nth-child(1) > label')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text + if (elementText === 'Grades') { + console.log('Passed: DIV - Alabama Standards Grades label matched as expected'); + } else { + const message = `Expected: DIV - "Grades" label; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -navy blue + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: DIV - Alabama Standards Grades label text color matched as expected'); + } else { + const message = `Expected: DIV - Alabama Standards Grades label text color "rgba(40, 39, 90, 1)"'; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '15px') { + console.log('Passed: DIV - Alabama Standards Grades label text font-size matched as expected'); + } else { + const message = `Expected: DIV - Alabama Standards Grades label text font-size "15px"; Actual: "${elementSize}"`; + 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('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 dropdown = await driver.findElement(By.css('#exgrades')); + const dropdownValue = await dropdown.getText(); + const options = await dropdown.findElements(By.css('option')); + const expectedList = [ + 'Please select a subject first' + ]; + const actual = []; + + //Track all errors + const errors = []; + + if (dropdownValue === 'Please select a subject first') { + console.log("Passed: DIV - Grades dropdown value matched as expected"); + } else { + const message = `Expected: DIV - Grades dropdown value - "Please select a subject first"; Actual: "${dropdownValue}"`; + errors.push(message); + } + + 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 { + const message = `Expected: DIV - Grades Dropdown list: ${JSON.stringify(expectedList)}, Actual: ${JSON.stringify(actual)}`; + 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('Multiple validation checks did not pass'); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - Download button validation + { + description: 'Validate DIV - Download button icon, text, and color', + action: async () => { + const icon = await driver.findElement(By.css('#exsubmit > .fa')); + const element = await driver.findElement(By.css('#exsubmit')); + + //Get text, color, and icon + const elementText = await element.getText(); + const elementColor = await element.getCssValue('background-color'); + + //Track all errors + const errors = []; + + //Validate button icon is present + if (icon) { + console.log('Passed: DIV - Download button icon is present'); + } else { + const message = 'Expected: DIV - Download button icon not found'; + errors.push(message); + } + + //Validate text + if (elementText === 'Download') { + console.log('Passed: DIV - Get Download button text matched as expected'); + } else { + const message = `Expected: DIV - "Download" button text; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -green + if (elementColor === 'rgba(48, 200, 172, 1)') { + console.log('Passed: DIV - Download button color matched as expected'); + } else { + const message = `Expected: DIV - Download button color "rgba(48, 200, 172, 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('Multiple validation checks did not pass'); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - Close button validation + { + description: 'Validate DIV - Close button icon, text, and color', + action: async () => { + const element = await driver.findElement(By.css('#modalclose')); + + //Get text, color, and icon + const elementText = await element.getText(); + const elementColor = await element.getCssValue('background-color'); + + //Track all errors + const errors = []; + + //Validate text + if (elementText === 'Close') { + console.log('Passed: DIV - Close button text matched as expected'); + } else { + const message = `Expected: DIV - "Close" button text; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -white + if (elementColor === 'rgba(0, 0, 0, 0)') { + console.log('Passed: DIV - Close button color matched as expected'); + } else { + const message = `Expected: DIV - Close button color "rgba(0, 0, 0, 0)"; 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('Multiple validation checks did not pass'); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //NEXT ACTION - Click Download button (validation) + { + description: 'DIV - Click DIV Download button', + action: async () => { + console.log('----->| NEXT ACTION: Clicked DIV Download button (validation)'); + await driver.findElement(By.css('#exsubmit > .fa')).click(); + await driver.sleep(2000); + } + }, + + //DIV - Validation, text, color, and size + { + 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 elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text + if (elementText === 'A subject and at least one grade must be selected.') { + console.log('Passed: DIV - Validation text matched as expected'); + } else { + const message = `Expected: DIV - validation text "A subject and at least one grade must be selected."; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -red + if (elementColor === 'rgba(220, 53, 69, 1)') { + console.log('Passed: DIV - Validation text color matched as expected'); + } else { + const message = `Expected: DIV - Validation text color "rgba(220, 53, 69, 1)"'; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '13px') { + console.log('Passed: DIV - Validation text font-size matched as expected'); + } else { + const message = `Expected: DIV - Validation text font-size "13px"; Actual: "${elementSize}"`; + 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('Multiple validation checks did not pass'); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //NEXT ACTION - Export Standards DIV - Select subject and grade + { + description: 'Validate Export Standards DIV - Select subject and grade', + action: async () => { + //Select "Mathematics" from dropdown + console.log('----->| NEXT ACTION: Selected Subject = Mathematics'); + await driver.findElement(By.css('#exsubject')).click(); + await driver.sleep(2000); + await driver.findElement(By.css('#exsubject > option:nth-child(3)')).click(); + + //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 + console.log('----->| NEXT ACTION: Clicked X clear icon'); + await clearGradesIcon.click(); + await driver.sleep(2000); + + console.log('----->| NEXT ACTION: Selected grades: 9, 10, 11, and 12'); + await driver.findElement(By.xpath("//li[contains(text(), '9')]")).click(); + await driver.sleep(2000); + + await driver.findElement(By.xpath("//li[contains(text(), '10')]")).click(); + await driver.sleep(2000); + + await driver.findElement(By.xpath("//li[contains(text(), '11')]")).click(); + await driver.sleep(2000); + + await driver.findElement(By.xpath("//li[contains(text(), '12')]")).click(); + await driver.sleep(2000); + + //Click away from dropdown list + await driver.findElement(By.css('#exform > div:nth-child(3) > div > span')).click(); + await driver.sleep(2000); + + /*Click Download button + console.log('----->| NEXT ACTION: Clicked Download button'); + await driver.findElement(By.css('#exsubmit')).click(); + await driver.sleep(5000);*/ + /*}, + }, + + //NEXT ACTION - Click Close button + { + description: 'DIV - Click DIV Close button', + action: async () => { + console.log('----->| NEXT ACTION: Clicked DIV Close button'); + await driver.findElement(By.css('#modalclose')).click(); + await driver.sleep(2000); + } + }, + + //NEXT ACTION - Click Arizona More Info icon + { + description: 'DIV - Click Arizona More Info icon', + action: async () => { + console.log('----->| NEXT ACTION: Clicked Arizona More Info icon'); + await driver.findElement(By.css('#stdbody > tr:nth-child(2) > .text-center:nth-child(4) img')).click(); + await driver.sleep(2000); + } + }, + + //Wait for element + { + description: 'Wait for DIV to be visible', + action: async () => { + + //Wait until the element exists in the DOM + const elementVisible = await driver.wait( + until.elementLocated(By.css('.modal-lg .modal-title')), + 20000 + ); + + //Wait until it becomes visible + await driver.wait( + until.elementIsVisible(elementVisible), + 20000 + ); + await driver.sleep(2000); + } + }, + + //DIV - More Info title, text, and font size + { + description: 'Validate DIV - More Info title text, color, and size', + action: async () => { + const element = await driver.findElement(By.css('.modal-lg .modal-title')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text + if (elementText === `Arizona's College and Career Ready Standards`) { + console.log(`Passed: DIV - Arizona's College and Career Ready Standards title matched as expected`); + } else { + const message = `Expected: DIV - "Arizona's College and Career Ready Standards"; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -navy blue + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log(`Passed: DIV - Arizona's College and Career Ready Standards title text color matched as expected`); + } else { + const message = `Expected: DIV - Arizona's College and Career Ready Standards title text color "rgba(40, 39, 90, 1)"'; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '18px') { + console.log(`Passed: DIV - Arizona's College and Career Ready Standards title text font-size matched as expected`); + } else { + const message = `Expected: DIV - Arizona's College and Career Ready Standards title text font-size "18px"; Actual: "${elementSize}"`; + 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('Multiple validation checks did not pass'); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - More Info Arizona sub-text, and font size + { + description: 'Validate DIV - More Info Arizona sub-text, color, and size', + action: async () => { + const element = await driver.findElement(By.css('.modal-body > .notenabled')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate 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 { + const message = `Expected: DIV - sub-text "*Not enabled in Profile. If you would like access to any of these standards sets, please Contact Us."; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -gray + if (elementColor === 'rgba(119, 119, 119, 1)') { + console.log('Passed: DIV - More Info Arizona sub-text color matched as expected'); + } else { + const message = `Expected: DIV - More Info Arizona sub-text text color "rgba(119, 119, 119, 1)"'; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '11.7px') { + console.log('Passed: DIV - More Info Arizona sub-text text font-size matched as expected'); + } else { + const message = `Expected: DIV - More Info Arizona sub-text text font-size "11.7px"; Actual: "${elementSize}"`; + 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('Multiple validation checks did not pass'); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - More Info Arizona Contact Us link text, and font size + { + description: 'Validate DIV - More Info Arizona Contact Us link text, color, and size', + action: async () => { + const element = await driver.findElement(By.linkText('Contact Us')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text + if (elementText === 'Contact Us') { + console.log('Passed: DIV - More Info Arizona sub-text matched as expected'); + } else { + const message = `Expected: DIV - More Info Arizona sub-text "Contact Us"; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -light green + if (elementColor === 'rgba(48, 200, 172, 1)') { + console.log('Passed: DIV - More Info Arizona Contact Us link text color matched as expected'); + } else { + const message = `Expected: DIV - More Info Arizona Contact Us link text color "rgba(48, 200, 172, 1)"'; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '11.7px') { + console.log('Passed: DIV - More Info Arizona Contact Us link text font-size matched as expected'); + } else { + const message = `Expected: DIV - More Info Arizona Contact Us link text font-size "11.7px"; Actual: "${elementSize}"`; + 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('Multiple validation checks did not pass'); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - More Info Arizona Subject column title text, and font size + { + description: 'Validate DIV - More Info Arizona Subject column title text, color, and size', + action: async () => { + const element = await driver.findElement(By.css('#myModal > div > div > div.modal-body > table > thead > tr > th:nth-child(1)')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text + if (elementText === 'Subject') { + console.log('Passed: DIV - More Info Arizona Subject column title text matched as expected'); + } else { + const message = `Expected: DIV - Arizona column title "Subject"; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -gray + if (elementColor === 'rgba(94, 105, 116, 1)') { + console.log('Passed: DIV - More Info Arizona Subject column title text color matched as expected'); + } else { + const message = `Expected: DIV - More Info Arizona Subject column title text color "rgba(94, 105, 116, 1)"'; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '14px') { + console.log('Passed: DIV - More Info Arizona Subject column title text font-size matched as expected'); + } else { + const message = `Expected: DIV - More Info Arizona Subject column title text font-size "14px"; Actual: "${elementSize}"`; + 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('Multiple validation checks did not pass'); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - More Info Arizona Adopted column title text, and font size + { + description: 'Validate DIV - More Info Arizona Adopted column title text, color, and size', + action: async () => { + const element = await driver.findElement(By.css('#myModal > div > div > div.modal-body > table > thead > tr > th:nth-child(2)')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text + if (elementText === 'Adopted') { + console.log('Passed: DIV - More Info Arizona Adopted column title text matched as expected'); + } else { + const message = `Expected: DIV - Arizona column title "Adopted"; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -gray + if (elementColor === 'rgba(94, 105, 116, 1)') { + console.log('Passed: DIV - More Info Arizona Adopted column title text color matched as expected'); + } else { + const message = `Expected: DIV - More Info Arizona Adopted column title text color "rgba(94, 105, 116, 1)"'; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '14px') { + console.log('Passed: DIV - More Info Arizona Adopted column title text font-size matched as expected'); + } else { + const message = `Expected: DIV - More Info Arizona Adopted column title text font-size "14px"; Actual: "${elementSize}"`; + 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('Multiple validation checks did not pass'); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - More Info Arizona Grades column title text, and font size + { + description: 'Validate DIV - More Info Arizona Grades column title text, color, and size', + action: async () => { + const element = await driver.findElement(By.css('#myModal > div > div > div.modal-body > table > thead > tr > th:nth-child(3)')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text + if (elementText === 'Grades') { + console.log('Passed: DIV - More Info Arizona Grades column title text matched as expected'); + } else { + const message = `Expected: DIV - Arizona column title "Grades"; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -navy blue + if (elementColor === 'rgba(94, 105, 116, 1)') { + console.log('Passed: DIV - More Info Arizona Grades column title text color matched as expected'); + } else { + const message = `Expected: DIV - More Info Arizona Grades column title text color "rgba(94, 105, 116, 1)"'; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '14px') { + console.log('Passed: DIV - More Info Arizona Grades column title text font-size matched as expected'); + } else { + const message = `Expected: DIV - More Info Arizona Grades column title text font-size "14px"; Actual: "${elementSize}"`; + 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('Multiple validation checks did not pass'); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //DIV - More Info Arizona Row 1 label text, color, and font size + { + description: 'Validate DIV - More Info Arizona Row 1 label text, color, and font size', + action: async () => { + + const checks = [ + //Subject + { + selector: '.text-success:nth-child(1) > td:nth-child(1)', + label: 'Language Arts', + expected: { + text: 'Language Arts', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + }, + //Adopted + { + selector: '.text-success:nth-child(1) > td:nth-child(2)', + label: '2010, Reading 2003 / Writing 2004', + expected: { + text: '2010, Reading 2003 / Writing 2004', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + }, + //Grades + //Pre K* (special color) + { + selector: '.text-success:nth-child(1) .notenabled', + label: 'Pre K*', + expected: { + text: 'Pre K*', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + //All Grades list + { + selector: '.text-success:nth-child(1) > td:nth-child(3)', + label: 'Grades List', + expected: { + text: 'Pre K*, K, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12', + 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 actualColor = await element.getCssValue('color'); + const actualSize = await element.getCssValue('font-size'); + + const errors = []; + + //Text + if (actualText === expected.text) { + console.log(`Passed: DIV - More Info Arizona Row 1 ${label} label text matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 1 "${expected.text}"; Actual: "${actualText}"`); + } + + //Color + if (actualColor === expected.color) { + console.log(`Passed: DIV - More Info Arizona Row 1 ${label} label text color matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 1 ${label} label text color "${expected.color}"; Actual: "${actualColor}"`); + } + + //Font-size + if (actualSize === expected.size) { + console.log(`Passed: DIV - More Info Arizona Row 1 ${label} label text font-size matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 1 ${label} label text font-size "${expected.size}"; Actual: "${actualSize}"`); + } + + 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('Multiple validation checks did not pass'); + throw new Error(allErrors.join('\n')); + } + } + }, + + //DIV - More Info Arizona Row 2 label text, color, and font size + { + description: 'Validate DIV - More Info Arizona Row 2 label text, color, and font size', + action: async () => { + + const checks = [ + //Subject + { + selector: '.text-success:nth-child(2) > td:nth-child(1)', + label: 'Mathematics', + expected: { + text: 'Mathematics', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + }, + //Adopted + { + selector: '.text-success:nth-child(2) > td:nth-child(2)', + label: '2008, 2010', + expected: { + text: '2008, 2010', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + }, + //Grades + //Pre K* (special color) + { + selector: '.text-success:nth-child(2) .notenabled', + label: 'Pre K*', + expected: { + text: 'Pre K*', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + //All Grades list + { + selector: '.text-success:nth-child(2) > td:nth-child(3)', + label: 'Grades List', + expected: { + text: 'Pre K*, K, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12', + 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 actualColor = await element.getCssValue('color'); + const actualSize = await element.getCssValue('font-size'); + + const errors = []; + + //Text + if (actualText === expected.text) { + console.log(`Passed: DIV - More Info Arizona Row 2 ${label} label text matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 2 "${expected.text}"; Actual: "${actualText}"`); + } + + //Color + if (actualColor === expected.color) { + console.log(`Passed: DIV - More Info Arizona Row 2 ${label} label text color matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 2 ${label} label text color "${expected.color}"; Actual: "${actualColor}"`); + } + + //Font-size + if (actualSize === expected.size) { + console.log(`Passed: DIV - More Info Arizona Row 2 ${label} label text font-size matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 2 ${label} label text font-size "${expected.size}"; Actual: "${actualSize}"`); + } + + 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('Multiple validation checks did not pass'); + throw new Error(allErrors.join('\n')); + } + } + }, + + //DIV - More Info Arizona Row 3 label text, color, and font size + { + description: 'Validate DIV - More Info Arizona Row 3 label text, color, and font size', + action: async () => { + + const checks = [ + //Subject + { + selector: '.text-success:nth-child(3) > td:nth-child(1)', + label: 'Science', + expected: { + text: 'Science', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + }, + //Adopted + { + selector: '.text-success:nth-child(3) > td:nth-child(2)', + label: '2004 / Updated 2005', + expected: { + text: '2004 / Updated 2005', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + }, + //Grades + //Pre K* (special color) + { + selector: '.text-success:nth-child(3) .notenabled', + label: 'Pre K*', + expected: { + text: 'Pre K*', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + //All Grades list + { + selector: '.text-success:nth-child(3) > td:nth-child(3)', + label: 'Grades List', + expected: { + text: 'Pre K*, K, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12', + 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 actualColor = await element.getCssValue('color'); + const actualSize = await element.getCssValue('font-size'); + + const errors = []; + + //Text + if (actualText === expected.text) { + console.log(`Passed: DIV - More Info Arizona Row 3 ${label} label text matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 3 "${expected.text}"; Actual: "${actualText}"`); + } + + //Color + if (actualColor === expected.color) { + console.log(`Passed: DIV - More Info Arizona Row 3 ${label} label text color matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 3 ${label} label text color "${expected.color}"; Actual: "${actualColor}"`); + } + + //Font-size + if (actualSize === expected.size) { + console.log(`Passed: DIV - More Info Arizona Row 3 ${label} label text font-size matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 3 ${label} label text font-size "${expected.size}"; Actual: "${actualSize}"`); + } + + 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('Multiple validation checks did not pass'); + throw new Error(allErrors.join('\n')); + } + } + }, + + //DIV - More Info Arizona Row 4 label text, color, and font size + { + description: 'Validate DIV - More Info Arizona Row 4 label text, color, and font size', + action: async () => { + + const checks = [ + //Subject + { + selector: '.text-success:nth-child(4) > td:nth-child(1)', + label: 'Social Studies', + expected: { + text: 'Social Studies', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + }, + //Adopted + { + selector: '.text-success:nth-child(4) > td:nth-child(2)', + label: '2005 / Updated 2006', + expected: { + text: '2005 / Updated 2006', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + }, + //Grades + //Pre K* (special color) + { + selector: '.text-success:nth-child(4) .notenabled', + label: 'Pre K*', + expected: { + text: 'Pre K*', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + //All Grades list + { + selector: '.text-success:nth-child(4) > td:nth-child(3)', + label: 'Grades List', + expected: { + text: 'Pre K*, K, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12', + 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 actualColor = await element.getCssValue('color'); + const actualSize = await element.getCssValue('font-size'); + + const errors = []; + + //Text + if (actualText === expected.text) { + console.log(`Passed: DIV - More Info Arizona Row 4 ${label} label text matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 4 "${expected.text}"; Actual: "${actualText}"`); + } + + //Color + if (actualColor === expected.color) { + console.log(`Passed: DIV - More Info Arizona Row 4 ${label} label text color matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 4 ${label} label text color "${expected.color}"; Actual: "${actualColor}"`); + } + + //Font-size + if (actualSize === expected.size) { + console.log(`Passed: DIV - More Info Arizona Row 4 ${label} label text font-size matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 4 ${label} label text font-size "${expected.size}"; Actual: "${actualSize}"`); + } + + 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('Multiple validation checks did not pass'); + throw new Error(allErrors.join('\n')); + } + } + }, + + //DIV - More Info Arizona Row 5 label text, color, and font size + { + description: 'Validate DIV - More Info Arizona Row 5 label text, color, and font size', + action: async () => { + + const checks = [ + //Subject + { + selector: '.text-success:nth-child(5) > td:nth-child(1)', + label: 'World Languages', + expected: { + text: 'World Languages', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + }, + //Adopted + { + selector: '.text-success:nth-child(5) > td:nth-child(2)', + label: '1997', + expected: { + text: '1997', + color: 'rgba(40, 167, 69, 1)', + size: '14.3px' + } + }, + //Grades + //Pre K* (special color) + { + selector: '.text-success:nth-child(5) .notenabled', + label: 'Pre K*', + expected: { + text: 'Pre K*', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + //All Grades list + { + selector: '.text-success:nth-child(5) > td:nth-child(3)', + label: 'Grades List', + expected: { + text: 'Pre K*, K, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12', + 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 actualColor = await element.getCssValue('color'); + const actualSize = await element.getCssValue('font-size'); + + const errors = []; + + //Text + if (actualText === expected.text) { + console.log(`Passed: DIV - More Info Arizona Row 5 ${label} label text matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 5 "${expected.text}"; Actual: "${actualText}"`); + } + + //Color + if (actualColor === expected.color) { + console.log(`Passed: DIV - More Info Arizona Row 5 ${label} label text color matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 5 ${label} label text color "${expected.color}"; Actual: "${actualColor}"`); + } + + //Font-size + if (actualSize === expected.size) { + console.log(`Passed: DIV - More Info Arizona Row 5 ${label} label text font-size matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 5 ${label} label text font-size "${expected.size}"; Actual: "${actualSize}"`); + } + + 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('Multiple validation checks did not pass'); + throw new Error(allErrors.join('\n')); + } + } + }, + + //DIV - More Info Arizona Row 6 label text, color, and font size + { + description: 'Validate DIV - More Info Arizona Row 6 label text, color, and font size', + action: async () => { + + const checks = [ + //Subject + { + selector: '.notenabled:nth-child(6) > td:nth-child(1)', + label: 'Arts Education*', + expected: { + text: 'Arts Education*', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + //Adopted + { + selector: '.notenabled:nth-child(6) > td:nth-child(2)', + label: '2006', + expected: { + text: '2006', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + //Grades + //Pre K* + { + selector: '.notenabled:nth-child(6) .notenabled', + label: 'Pre K*', + expected: { + text: 'Pre K*', + color: 'rgba(119, 119, 119, 1)', + size: '11.583px' + } + }, + //All Grades list + { + selector: '.notenabled:nth-child(6) > td:nth-child(3)', + label: 'Grades List', + expected: { + text: 'Pre K*, K, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12', + 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 actualColor = await element.getCssValue('color'); + const actualSize = await element.getCssValue('font-size'); + + const errors = []; + + //Text + if (actualText === expected.text) { + console.log(`Passed: DIV - More Info Arizona Row 6 ${label} label text matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 6 "${expected.text}"; Actual: "${actualText}"`); + } + + //Color + if (actualColor === expected.color) { + console.log(`Passed: DIV - More Info Arizona Row 6 ${label} label text color matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 6 ${label} label text color "${expected.color}"; Actual: "${actualColor}"`); + } + + //Font-size + if (actualSize === expected.size) { + console.log(`Passed: DIV - More Info Arizona Row 6 ${label} label text font-size matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 6 ${label} label text font-size "${expected.size}"; Actual: "${actualSize}"`); + } + + 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('Multiple validation checks did not pass'); + throw new Error(allErrors.join('\n')); + } + } + }, + + //DIV - More Info Arizona Row 7 label text, color, and font size + { + description: 'Validate DIV - More Info Arizona Row 7 label text, color, and font size', + action: async () => { + + const checks = [ + //Subject + { + selector: '.notenabled:nth-child(7) > td:nth-child(1)', + label: 'Early Childhood Education*', + expected: { + text: 'Early Childhood Education*', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + //Adopted + { + selector: '.notenabled:nth-child(7) > td:nth-child(2)', + label: '2005', + expected: { + text: '2005', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + //Grades + { + selector: '.notenabled:nth-child(7) .notenabled', + label: 'Ages 3-5*', + expected: { + text: 'Ages 3-5*', + 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 actualColor = await element.getCssValue('color'); + const actualSize = await element.getCssValue('font-size'); + + const errors = []; + + //Text + if (actualText === expected.text) { + console.log(`Passed: DIV - More Info Arizona Row 7 ${label} label text matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 7 "${expected.text}"; Actual: "${actualText}"`); + } + + //Color + if (actualColor === expected.color) { + console.log(`Passed: DIV - More Info Arizona Row 7 ${label} label text color matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 7 ${label} label text color "${expected.color}"; Actual: "${actualColor}"`); + } + + //Font-size + if (actualSize === expected.size) { + console.log(`Passed: DIV - More Info Arizona Row 7 ${label} label text font-size matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 7 ${label} label text font-size "${expected.size}"; Actual: "${actualSize}"`); + } + + 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('Multiple validation checks did not pass'); + throw new Error(allErrors.join('\n')); + } + } + }, + + //DIV - More Info Arizona Row 8 label text, color, and font size + { + description: 'Validate DIV - More Info Arizona Row 8 label text, color, and font size', + action: async () => { + + const checks = [ + //Subject + { + selector: '.notenabled:nth-child(8) > td:nth-child(1)', + label: 'English Language Learners*', + expected: { + text: 'English Language Learners*', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + //Adopted + { + selector: '.notenabled:nth-child(8) > td:nth-child(2)', + label: '2004', + expected: { + text: '2004', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + //Grades + //Pre K* + { + selector: '.notenabled:nth-child(8) .notenabled', + label: 'Pre K*', + expected: { + text: 'Pre K*', + color: 'rgba(119, 119, 119, 1)', + size: '11.583px' + } + }, + //All Grades list + { + selector: '.notenabled:nth-child(8) > td:nth-child(3)', + label: 'Grades List', + expected: { + text: 'Pre K*, K, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12', + 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 actualColor = await element.getCssValue('color'); + const actualSize = await element.getCssValue('font-size'); + + const errors = []; + + //Text + if (actualText === expected.text) { + console.log(`Passed: DIV - More Info Arizona Row 8 ${label} label text matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 8 "${expected.text}"; Actual: "${actualText}"`); + } + + //Color + if (actualColor === expected.color) { + console.log(`Passed: DIV - More Info Arizona Row 8 ${label} label text color matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 8 ${label} label text color "${expected.color}"; Actual: "${actualColor}"`); + } + + //Font-size + if (actualSize === expected.size) { + console.log(`Passed: DIV - More Info Arizona Row 8 ${label} label text font-size matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 8 ${label} label text font-size "${expected.size}"; Actual: "${actualSize}"`); + } + + 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('Multiple validation checks did not pass'); + throw new Error(allErrors.join('\n')); + } + } + }, + + //DIV - More Info Arizona Row 9 label text, color, and font size + { + description: 'Validate DIV - More Info Arizona Row 9 label text, color, and font size', + action: async () => { + + const checks = [ + //Subject + { + selector: '.notenabled:nth-child(9) > td:nth-child(1)', + label: 'Health and PE*', + expected: { + text: 'Health and PE*', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + //Adopted + { + selector: '.notenabled:nth-child(9) > td:nth-child(2)', + label: '2009', + expected: { + text: '2009', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + //Grades + //Pre K* + { + selector: '.notenabled:nth-child(9) .notenabled', + label: 'Pre K*', + expected: { + text: 'Pre K*', + color: 'rgba(119, 119, 119, 1)', + size: '11.583px' + } + }, + //All Grades list + { + selector: '.notenabled:nth-child(9) > td:nth-child(3)', + label: 'Grades List', + expected: { + text: 'Pre K*, K, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12', + 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 actualColor = await element.getCssValue('color'); + const actualSize = await element.getCssValue('font-size'); + + const errors = []; + + //Text + if (actualText === expected.text) { + console.log(`Passed: DIV - More Info Arizona Row 9 ${label} label text matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 9 "${expected.text}"; Actual: "${actualText}"`); + } + + //Color + if (actualColor === expected.color) { + console.log(`Passed: DIV - More Info Arizona Row 9 ${label} label text color matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 9 ${label} label text color "${expected.color}"; Actual: "${actualColor}"`); + } + + //Font-size + if (actualSize === expected.size) { + console.log(`Passed: DIV - More Info Arizona Row 9 ${label} label text font-size matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 9 ${label} label text font-size "${expected.size}"; Actual: "${actualSize}"`); + } + + 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('Multiple validation checks did not pass'); + throw new Error(allErrors.join('\n')); + } + } + }, + + //DIV - More Info Arizona Row 10 label text, color, and font size + { + description: 'Validate DIV - More Info Arizona Row 10 label text, color, and font size', + action: async () => { + + const checks = [ + //Subject + { + selector: '.notenabled:nth-child(10) > td:nth-child(1)', + label: 'Library Media*', + expected: { + text: 'Library Media*', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + //Grades + //Pre K* + { + selector: '.notenabled:nth-child(10) .notenabled', + label: 'Pre K*', + expected: { + text: 'Pre K*', + color: 'rgba(119, 119, 119, 1)', + size: '11.583px' + } + }, + //All Grades list + { + selector: '.notenabled:nth-child(10) > td:nth-child(3)', + label: 'Grades List', + expected: { + text: 'Pre K*, K, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12', + 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 actualColor = await element.getCssValue('color'); + const actualSize = await element.getCssValue('font-size'); + + const errors = []; + + //Text + if (actualText === expected.text) { + console.log(`Passed: DIV - More Info Arizona Row 10 ${label} label text matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 10 "${expected.text}"; Actual: "${actualText}"`); + } + + //Color + if (actualColor === expected.color) { + console.log(`Passed: DIV - More Info Arizona Row 10 ${label} label text color matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 10 ${label} label text color "${expected.color}"; Actual: "${actualColor}"`); + } + + //Font-size + if (actualSize === expected.size) { + console.log(`Passed: DIV - More Info Arizona Row 10 ${label} label text font-size matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 10 ${label} label text font-size "${expected.size}"; Actual: "${actualSize}"`); + } + + 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('Multiple validation checks did not pass'); + throw new Error(allErrors.join('\n')); + } + } + }, + + //DIV - More Info Arizona Row 11 label text, color, and font size + { + description: 'Validate DIV - More Info Arizona Row 11 label text, color, and font size', + action: async () => { + + const checks = [ + //Subject + { + selector: '.notenabled:nth-child(11) > td:nth-child(1)', + label: 'Technology Education*', + expected: { + text: 'Technology Education*', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + //Adopted + { + selector: '.notenabled:nth-child(11) > td:nth-child(2)', + label: '2009', + expected: { + text: '2009', + color: 'rgba(119, 119, 119, 1)', + size: '12.87px' + } + }, + //Grades + //Pre K* + { + selector: '.notenabled:nth-child(11) .notenabled', + label: 'Pre K*', + expected: { + text: 'Pre K*', + color: 'rgba(119, 119, 119, 1)', + size: '11.583px' + } + }, + //All Grades list + { + selector: '.notenabled:nth-child(11) > td:nth-child(3)', + label: 'Grades List', + expected: { + text: 'Pre K*, K, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12', + 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 actualColor = await element.getCssValue('color'); + const actualSize = await element.getCssValue('font-size'); + + const errors = []; + + //Text + if (actualText === expected.text) { + console.log(`Passed: DIV - More Info Arizona Row 11 ${label} label text matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 11 "${expected.text}"; Actual: "${actualText}"`); + } + + //Color + if (actualColor === expected.color) { + console.log(`Passed: DIV - More Info Arizona Row 11 ${label} label text color matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 11 ${label} label text color "${expected.color}"; Actual: "${actualColor}"`); + } + + //Font-size + if (actualSize === expected.size) { + console.log(`Passed: DIV - More Info Arizona Row 11 ${label} label text font-size matched as expected`); + } else { + errors.push(`Expected: DIV - More Info Arizona Row 11 ${label} label text font-size "${expected.size}"; Actual: "${actualSize}"`); + } + + 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('Multiple validation checks did not pass'); + throw new Error(allErrors.join('\n')); + } + } + }, + + //NEXT ACTION - Click DIV X icon + { + description: 'DIV - Click DIV X icon', + action: async () => { + console.log('----->| NEXT ACTION: Clicked DIV X icon'); + await driver.findElement(By.css('.modal-lg .modal-header span')).click(); + await driver.sleep(2000); + } + },*/ + + //NEXT ACTION - Click View icon + { + description: 'DIV - Click California View icon', + action: async () => { + console.log('----->| NEXT ACTION: Clicked California View icon'); + await driver.findElement(By.css('tr:nth-child(3) > .text-center:nth-child(5) img')).click(); + await driver.sleep(2000); + } + }, + + //Wait until the element exists in the DOM + { + description: 'Wait for page to load', + action: async () => { + const pageTitle = await driver.wait( + until.elementLocated(By.css('h2')), + 30000 + ); + + //Wait until it becomes visible + await driver.wait( + until.elementIsVisible(pageTitle), + 30000 + ); + + //Wait for page to load completely + await driver.wait(async () => { + const readyState = await driver.executeScript('return document.readyState'); + return readyState === 'complete'; + }, 30000, 'Browse Page did not fully load within 30 seconds'); + console.log('Passed: Browse Page loaded successfully'); + } + }, + + //Browse - Page title, text, and font size + { + description: 'Validate Browse page title text, color, and size', + action: async () => { + const element = await driver.findElement(By.css('h2')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text = + if (elementText === 'Browse') { + console.log("Passed: Browse page title matched as expected"); + } else { + const message = `Expected: "Browse" page title; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -navy blue + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Browse Page title text color matched as expected'); + } else { + const message = `Expected: Browse Page title text color "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '32px') { + console.log('Passed: Browse Page title text font-size matched as expected'); + } else { + const message = `Expected: Browse Page title text font-size "32px"; Actual: "${elementSize}"`; + errors.push(message); + } + + //Throw once at the end (no additional console logs here) + if (errors.length > 0) { + throw new Error(errors.join('\n')); + } + } + }, + + //Browse - Content tab title, text, and font size (dimmed) + { + description: 'Validate Browse - Content tab title text, color, and size', + action: async () => { + const element = await driver.findElement(By.css('#content-tab')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('background-color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text = + if (elementText === 'Content') { + console.log("Passed: Browse page - Content tab title matched as expected"); + } else { + const message = `Expected: "Content" tab title; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -clear + if (elementColor === 'rgba(0, 0, 0, 0)') { + console.log('Passed: Browse page - Content tab title text color matched as expected'); + } else { + const message = `Expected: Browse page - Content tab title text color "rgba(0, 0, 0, 0)"; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '15px') { + console.log('Passed: Browse page - Content tab title text font-size matched as expected'); + } else { + const message = `Expected: Browse page - Content tab title text font-size "15px"; Actual: "${elementSize}"`; + errors.push(message); + } + + //Throw once at the end (no additional console logs here) + if (errors.length > 0) { + throw new Error(errors.join('\n')); + } + } + }, + + //Browse - Standards tab title, text, and font size (active) + { + description: 'Validate Browse - Standards tab title text, color, and size', + action: async () => { + const element = await driver.findElement(By.css('#std-tab')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('background-color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text = + if (elementText === 'Standards') { + console.log("Passed: Browse page - Standards tab title matched as expected"); + } else { + const message = `Expected: "Standards" tab title; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -navy blue + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Browse page - Standards tab title text color matched as expected'); + } else { + const message = `Expected: Browse page - Standards tab title text color "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '15px') { + console.log('Passed: Browse page - Standards tab title text font-size matched as expected'); + } else { + const message = `Expected: Browse page - Standards tab title text font-size "15px"; Actual: "${elementSize}"`; + errors.push(message); + } + + //Throw once at the end (no additional console logs here) + if (errors.length > 0) { + throw new Error(errors.join('\n')); + } + } + }, + + //Browse - Concepts tab title, text, and font size (dimmed) + { + description: 'Validate Browse - Conceptss tab title text, color, and size', + action: async () => { + const element = await driver.findElement(By.css('#concept-tab')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('background-color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text = + if (elementText === 'Concepts') { + console.log("Passed: Browse page - Concepts tab title matched as expected"); + } else { + const message = `Expected: "Concepts" tab title; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -clear + if (elementColor === 'rgba(0, 0, 0, 0)') { + console.log('Passed: Browse page - Concepts tab title text color matched as expected'); + } else { + const message = `Expected: Browse page - Concepts tab title text color "rgba(0, 0, 0, 0)"; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '15px') { + console.log('Passed: Browse page - Concepts tab title text font-size matched as expected'); + } else { + const message = `Expected: Browse page - Concepts tab title text font-size "15px"; Actual: "${elementSize}"`; + errors.push(message); + } + + //Throw once at the end (no additional console logs here) + if (errors.length > 0) { + throw new Error(errors.join('\n')); + } + } + }, + + //Browse - Browse standards sub-title, text, and font size + { + description: 'Validate Browse - Browse standards sub-title text, color, and size', + action: async () => { + const element = await driver.findElement(By.css('#std p')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('background-color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text = + if (elementText === 'Browse standards') { + console.log("Passed: Browse page - Browse standards sub-title matched as expected"); + } else { + const message = `Expected: "Browse standards" sub-title; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -navy blue + if (elementColor === 'rgba(0, 0, 0, 0)') { + console.log('Passed: Browse page - Browse standards sub-title text color matched as expected'); + } else { + const message = `Expected: Browse page - Browse standards sub-title text color "rgba(0, 0, 0, 0)"; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '13px') { + console.log('Passed: Browse page - Browse standards sub-title text font-size matched as expected'); + } else { + const message = `Expected: Browse page - Browse standards sub-title text font-size "13px"; Actual: "${elementSize}"`; + errors.push(message); + } + + //Throw once at the end (no additional console logs here) + if (errors.length > 0) { + throw new Error(errors.join('\n')); + } + } + }, + + //Standards label text + { + description: 'Validate Standards label text', + action: async () => { + const elementText = await driver.findElement(By.css('.form-group:nth-child(4) > .col-sm-2')).getText(); + if (elementText === 'Standards') { + console.log('Passed: Standards label text matched as expected'); + } else { + throw new Error(`Expected: "Standards" label text; Actual: "${elementText}"`); + } + } + }, + + //Standards dropdown + { + description: 'Validate Standards dropdown list and value', + action: async () => { + const select = await driver.findElement(By.css('#stdselect')); + + // Get the selected option text + const selectedOption = await select.findElement(By.css('option:checked')); + const selectedText = await selectedOption.getText(); + + if (selectedText === 'California Standards') { + console.log('Passed: California Standards default value matched as expected'); + } else { + throw new Error(`Expected "California Standards"; Actual: "${selectedText}"`); + } + + const options = await select.findElements(By.css('option')); + const expectedList = [ + 'Select standards', + 'Alabama Standards', + 'Arizona Standards', + 'California Standards', + 'Florida Standards', + 'New York Standards', + 'North Carolina Standards', + 'South Carolina Standards', + 'Texas TEKS Standards', + 'Washington Standards', + 'Common Core State Standards', + 'Alberta Standards', + 'Ontario Standards', + 'Australian Curriculum (ACARA) Standards', + '5th Grade Import ECS-2732', + 'Stats Test Framework', + 'Widget Test', + 'Still Testing ECS-273', + 'New Framework to New Org 2735', + 'New York Language Arts (2011)', + 'New York Language Arts (2017)', + 'Make Sure To Delete', + 'Inquiry Skills' + ]; + 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 { + const message = `Expected: Standards Dropdown list: ${JSON.stringify(expectedList)}, Actual: ${JSON.stringify(actual)}`; + 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('Multiple validation checks did not pass'); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Standards Display label text + { + description: 'Validate Standards Display label text', + action: async () => { + const elementText = await driver.findElement(By.css('.form-group:nth-child(5) > .col-sm-2')).getText(); + if (elementText === 'Standards Display') { + console.log('Passed: Standards Display label text matched as expected'); + } else { + throw new Error(`Expected: "Standards Display" label text; Actual: "${elementText}"`); + } + } + }, + + //All radio option checkbox -active + { + description: 'Validate All radio option enabled', + action: async () => { + const elementOption = await driver.findElement(By.css('#gap1')).getAttribute('checked'); + if (elementOption === 'true') { + console.log('Passed: All radio option value matched as expected'); + } else { + throw new Error(`All radio option value was not selected; Actual: "${elementOption}"`); + } + } + }, + + //All radio handle text + { + description: 'Validate All radio handle text', + action: async () => { + const elementText = await driver.findElement(By.css('.form-check:nth-child(1) > .form-check-label')).getText(); + if (elementText === 'All') { + console.log('Passed: All radio handle text matched as expected'); + } else { + throw new Error(`Expected: "All" radio handle text; Actual: "${elementText}"`); + } + } + }, + + //Correlated Only radio option checkbox + { + description: 'Validate Correlated Only radio option enabled', + action: async () => { + const elementOption = await driver.findElement(By.css('#gap2')).getAttribute('type'); + if (elementOption === 'radio') { + console.log('Passed: Correlated Only radio type matched as expected'); + } else { + throw new Error(`Correlated Only radio type did not match; Actual: "${elementOption}"`); + } + } + }, + + //Correlated Only radio handle text + { + description: 'Validate Correlated Only radio handle text', + action: async () => { + const elementText = await driver.findElement(By.css('.form-check:nth-child(2) > .form-check-label')).getText(); + if (elementText === 'Correlated Only') { + console.log('Passed: Correlated Only radio handle text matched as expected'); + } else { + throw new Error(`Expected: "Correlated Only" radio handle text; Actual: "${elementText}"`); + } + } + }, + + //Uncorrelated Only radio option checkbox + { + description: 'Validate Uncorrelated Only radio option enabled', + action: async () => { + const elementOption = await driver.findElement(By.css('#gap3')).getAttribute('type'); + if (elementOption === 'radio') { + console.log('Passed: Uncorrelated Only radio type matched as expected'); + } else { + throw new Error(`Uncorrelated Only radio type did not match; Actual: "${elementOption}"`); + } + } + }, + + //Uncorrelated Only radio handle text + { + description: 'Validate Uncorrelated Only radio handle text', + action: async () => { + const elementText = await driver.findElement(By.css('.form-check:nth-child(3) > .form-check-label')).getText(); + if (elementText === 'Uncorrelated Only') { + console.log('Passed: Uncorrelated Only radio handle text matched as expected'); + } else { + throw new Error(`Expected: "Uncorrelated Only" radio handle text; Actual: "${elementText}"`); + } + } + }, + + //Subject label text + { + description: 'Validate Subject Display label text', + action: async () => { + const elementText = await driver.findElement(By.css('.hideSubject > .col-sm-2')).getText(); + if (elementText === 'Subject') { + console.log('Passed: Subject label text matched as expected'); + } else { + throw new Error(`Expected: "Subject" label text; Actual: "${elementText}"`); + } + } + }, + + //Subject dropdown + { + description: 'Validate Subject dropdown list and value', + action: async () => { + const select = await driver.findElement(By.css('#selectSubjects')); + + // Get the selected option text + const selectedOption = await select.findElement(By.css('option:checked')); + const selectedText = await selectedOption.getText(); + + if (selectedText === 'Select a subject') { + console.log('Passed: Select a subject default value matched as expected'); + } else { + throw new Error(`Expected Select a subject "Select a subject"; Actual: "${selectedText}"`); + } + + const options = await select.findElements(By.css('option')); + const expectedList = [ + 'Select a subject', + 'Language Arts', + 'Mathematics', + 'Science', + 'Social Studies', + 'World Languages' + ]; + 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 { + const message = `Expected: Subject Dropdown list: ${JSON.stringify(expectedList)}, Actual: ${JSON.stringify(actual)}`; + 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('Multiple validation checks did not pass'); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //Show Correlations From label text + { + description: 'Validate Show Correlations From label text', + action: async () => { + const elementText = await driver.findElement(By.css('.form-group:nth-child(8) > .col-sm-2')).getText(); + if (elementText === 'Show Correlations From') { + console.log('Passed: Show Correlations From label text matched as expected'); + } else { + throw new Error(`Expected: "Show Correlations From" label text; Actual: "${elementText}"`); + } + } + }, + + //Show Correlations From dropdown + { + description: 'Validate Show Correlations From dropdown list and value', + action: async () => { + + //Locate and validate selected (collapsed) value + const dropdownButton = await driver.findElement( + By.css('button.multiselect.dropdown-toggle') + ); + + const selectedText = (await dropdownButton.getAttribute('title')).trim(); + + if (selectedText === 'None selected') { + console.log('Passed: Show Correlations From default value matched as expected'); + } else { + throw new Error( + `Expected default value "All Content Sets"; Actual: "${selectedText}"` + ); + } + + //Open dropdown + console.log('----->| NEXT ACTION: Clicked All Content Sets dropdown'); + await driver.findElement(By.css('.col-sm-10 .multiselect-selected-text')).click(); + await driver.sleep(2000); + + //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', + 'Demo - User Submitted Content', + 'Upload Demo', + 'Exploring - Access', + 'Exploring - PowerPoint', + 'Exploring - Word', + 'Algebra - QA', + 'Biology - QA', + 'English II - QA', + 'Geometry - QA', + 'US History - QA', + 'Import Align - Concept Based', + 'Import Align - Direct Align', + 'Im Creating Content', + 'Math Alignment Import Test', + 'Import testing 3', + 'New Frame Delete Test', + 'ECS-2952 Test' + ]; + + 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]}"` + ); + } + }); + + //Fail once, list everything + if (errors.length > 0) { + throw new Error(errors.join('\n')); + } + + //Click away to close list + await driver.findElement(By.css('.mt-2 > .col-sm-10')).click(); + console.log('Passed: Show Correlations From dropdown list matched as expected'); + } + }, + + //Term Search From label text + { + description: 'Validate Term Search From label text', + action: async () => { + const elementText = await driver.findElement(By.css('.form-group:nth-child(12) > .col-sm-2')).getText(); + if (elementText === 'Term Search') { + console.log('Passed: Term Search label text matched as expected'); + } else { + throw new Error(`Expected: "Term Search" label text; Actual: "${elementText}"`); + } + } + }, + + //Term Search placeholder + { + description: 'Validate Term Search placeholder', + action: async () => { + const elementValue = await driver.findElement(By.css('#searchTerm')).getAttribute('placeholder'); + if (elementValue === '') { + console.log('Passed: Term Search "blank" placeholder text, matched as expected'); + } else { + throw new Error(`Expected: Term Search "blank" placeholder text; Actual: "${elementValue}"`); + } + } + }, + + //Include Related Standards checkbox + { + description: 'Validate Include Related Standards checkbox', + action: async () => { + const elementOption = await driver.findElement(By.css('#doRel')).getAttribute('type'); + if (elementOption === '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: "${elementOption}"`); + } + } + }, + + //Include Related Standards label text + { + description: 'Validate Include Related Standards label text', + action: async () => { + const elementText = await driver.findElement(By.css('.col-sm-offset-2 > label')).getText(); + if (elementText === 'Include Related Standards') { + console.log('Passed: Include Related Standards label text matched as expected'); + } else { + throw new Error(`Expected: "Include Related Standards" label text; Actual: "${elementText}"`); + } + } + }, + + //Search button + { + description: 'Validate Search button icon, text, and color', + action: async () => { + const element = await driver.findElement(By.css('#stdsubmit')); + + //Get text, color, and icon + const elementText = await element.getAttribute('value'); + const elementColor = await element.getCssValue('background-color'); + + //Track all errors + const errors = []; + + //Validate text + if (elementText === 'Search') { + console.log('Passed: Search button text matched as expected'); + } else { + const message = `Expected: Button text "Search"; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -green + if (elementColor === 'rgba(48, 200, 172, 1)') { + console.log('Passed: Search button color matched as expected'); + } else { + const message = `Expected: Search button color "rgba(48, 200, 172, 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('Multiple validation checks did not pass'); + } + + //Throw collected messages — catch() will prefix with "FAILED:" + throw new Error(errors.join('\n')); + } + } + }, + + //NEXT ACTION - Alert DIV -Validation + { + description: 'Click search button without selecting any values and validate assert message', + action: async () => { + const searchButton = await driver.wait( + until.elementLocated(By.css('#stdsubmit')), + 5000 + ); + + await searchButton.click(); + console.log('----->| NEXT ACTION: Clicked Search button'); + + const expected = 'You must select a grade'; + let alertText; + + try { + const alert = await driver.wait(until.alertIsPresent(), 5000); + alertText = (await alert.getText()).trim(); + + //close alert before leaving try block + await alert.accept(); + console.log('----->| NEXT ACTION: Clicked alert OK option'); + } catch (err) { + throw new Error(`Failed while handling alert: ${err.message}`); + } + + if (alertText === expected) { + console.log('Passed: Alert text matched as expected'); + } else { + throw new Error( + `Alert text did not match: \n Expected: "${expected}"\n Actual: "${alertText}"` + ); + } + } + }, + + //NEXT ACTION - Click Include Related Standards checkbox + { + description: 'Dashboard - Click Include Related Standards checkbox', + action: async () => { + console.log('----->| NEXT ACTION: Clicked Inclued Related Standards checkbox'); + await driver.findElement(By.css('#doRel')).click(); + } + }, + + //Wait for element + { + description: 'Wait for DIV to be visible', + action: async () => { + + //Wait until the element exists in the DOM + const elementVisible = await driver.wait( + until.elementLocated(By.css('.col-auto .multiselect-selected-text')), + 20000 + ); + + //Wait until it becomes visible + await driver.wait( + until.elementIsVisible(elementVisible), + 20000 + ); + await driver.sleep(2000); + } + }, + + //None Selected dropdown + + //based on label text + { + description: 'Validate based on label text', + action: async () => { + const elementText = await driver.findElement(By.css('.col-auto:nth-child(2)')).getText(); + if (elementText === 'based on') { + console.log('Passed: based on label text matched as expected'); + } else { + throw new Error(`Expected: "based on" label text; Actual: "${elementText}"`); + } + } + }, + + //best match dropdown + + //Question icon + + //Asterisk text, family font, and font size + { + description: 'Validate Asterisk text, family font, and size', + action: async () => { + const element = await driver.findElement(By.css('em')); + + //Get text, color, and size + const elementText = await element.getText(); + const elementColor = await element.getCssValue('color'); + const elementSize = await element.getCssValue('font-size'); + + //Track all errors + const errors = []; + + //Validate text = + if (elementText === '** note - including related standards may cause increased page load times') { + console.log("Passed: *Note text matched as expected"); + } else { + const message = `Expected: "** note - including related standards may cause increased page load times"; Actual: "${elementText}"`; + errors.push(message); + } + + //Validate color -navy blue + if (elementColor === 'rgba(40, 39, 90, 1)') { + console.log('Passed: Browse page - Browse standards sub-title text color matched as expected'); + } else { + const message = `Expected: Browse page - Browse standards sub-title text color "rgba(40, 39, 90, 1)"; Actual: "${elementColor}"`; + errors.push(message); + } + + //Validate font size + if (elementSize === '10.4px') { + console.log('Passed: Browse page - Browse standards sub-title text font-size matched as expected'); + } else { + const message = `Expected: Browse page - Browse standards sub-title text font-size "10.4px"; Actual: "${elementSize}"`; + errors.push(message); + } + + //Throw once at the end (no additional console logs here) + if (errors.length > 0) { + throw new Error(errors.join('\n')); + } + } + }, + + //Alert DIV -Validation + { + description: 'Click search button without selecting any values and validate assert message', + action: async () => { + const searchButton = await driver.wait( + until.elementLocated(By.css('#stdsubmit')), + 5000 + ); + + await searchButton.click(); + console.log('----->| NEXT ACTION: Clicked Search button'); + + const expected = 'You must select at least one set of related standards'; + let alertText; + + try { + const alert = await driver.wait(until.alertIsPresent(), 5000); + alertText = (await alert.getText()).trim(); + + //close alert before leaving try block + await alert.accept(); + console.log('----->| NEXT ACTION: Clicked alert OK option'); + } catch (err) { + throw new Error(`Failed while handling alert: ${err.message}`); + } + + if (alertText === expected) { + console.log('Passed: Alert text matched as expected'); + } else { + throw new Error( + `Alert text did not match: \n Expected: "${expected}"\n Actual: "${alertText}"` + ); + } + } + }, + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + //LOG OUT + //NEXT ACTION - Log out + { + description: 'Log out of EXACT', + action: async () => { + //Profile link + await driver.findElement(By.css('#navbarDropdown > span')).click(); + await driver.sleep(1000); + //Log Out + await driver.findElement(By.linkText('Log Out')).click(); + console.log('----->| NEXT ACTION: Clicked User Profile and Logged out'); + await driver.sleep(1000); + } + }, + + //Wait for page to load + { + description: 'Wait for page to fully load', + action: async () => { + + //Wait until the element exists in the DOM + const loginButton = await driver.wait( + until.elementLocated(By.css('.login')), + 20000 + ); + + //Wait until it becomes visible + await driver.wait( + until.elementIsVisible(loginButton), + 20000 + ); + + await driver.wait(async () => { + const readyState = await driver.executeScript('return document.readyState'); + return readyState === 'complete'; + }, 30000, 'ExACT landing page did not fully load within 30 seconds'); + + console.log('----------------->| LOGGED OUT SUCCESSFULLY |<-----------------'); + await driver.sleep(5000); + } + }, +]; + +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 clearOldResults = () => { + //Remove old screenshots + const screenshotDir = path.join('screenshots', 'dashboardMyStandardsResults'); + if (fs.existsSync(screenshotDir)) { + fs.rmSync(screenshotDir, { recursive: true, force: true }); + } + fs.mkdirSync(screenshotDir, { recursive: true }); + + //Remove old Excel file + if (fs.existsSync('dashboardMyStandardsResultsResults.xlsx')) { + fs.unlinkSync('dashboardMyStandardsResults.xlsx'); + } +}; + +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; + + for (const step of steps) { + const stepIndex = steps.indexOf(step) + 1; + const timestamp = new Date().toISOString(); + + try { + //Screenshot of failed step + 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) { + //Only take screenshot if the step fails + 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}`); + testStatus = 'Failed'; + allStepsPassed = false; + } + } + + //Check if log out was successful + const loginButton = await driver.wait(until.elementLocated(By.css('.login')), 5000).catch(() => false); + + if (loginButton && allStepsPassed) { + console.log('PASSED: My Standards Widget(ExACT_dashboardMyStandards); All test steps completed successfully'); + testStatus = 'Passed'; + } else { + console.log('FAILED: My Standards Widget(ExACT_dashboardMyStandards); One or more test steps failed'); + 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, 'dashboardMyStandardsResults.xlsx'); +} finally { + await driver.quit(); +} +})(); +} + +export default ExACT_dashboardMyStandards;