Files
EdGateAutomatedRegression/tests/ExACT_landingPage.js
2024-10-04 16:02:05 -07:00

499 lines
22 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { Builder, By, Key, until } from 'selenium-webdriver';
import fs from 'fs';
import XLSX from 'xlsx';
import path from 'path';
import { assert } from 'console';
const ExACT_landingPage = (req, res) => {
res.send('<h2>ExACT Automated Test Script - Landing Page: Initiated</h2>');
(async function example() {
let driver = await new Builder().forBrowser('chrome').build();
let testStatus = 'Failed';
let workbook;
let worksheet;
const startTime = new Date().toISOString();
//Left Panel:
//Title
const expectedTitleText = 'Empowering publishers with the ability to correlate their unique content to standards.';
const expectedTitleFont = '32px';
//Description
const expectedDescriptiveText1 = 'The ExACT platform is the education industry’s most trusted source to globally correlate content to standards and produce content alignment reports.';
const expectedDescriptiveText2 = 'With access to over five million learning outcomes, ExACT’s robust toolset allows end users to discover new markets for their content, find gaps, and adjust alignments for specific opportunities.';
//Sign Up
const expectedSignUpText = 'Sign Up For A 30 Day Free Trial';
const expectedFreeTrialLinkColor = 'rgba(255, 111, 97, 1)'; //Red/Orange
//Bullet Points
const expectedBulletPointText1 = 'Learn more about ExACT AutoAlign, the AI-based alignment tool.';
const expectedBulletPointLinkColor1 = 'rgba(48, 200, 172, 1)'; //teal
const expectedBulletPointText2 = 'See your Correlation Analytics.';
const expectedBulletPointLinkColor2 = 'rgba(48, 200, 172, 1)'; //teal
const expectedBulletPointText3 = 'Explore how your Content maps to International Standards.';
const expectedBulletPointLinkColor3 = 'rgba(48, 200, 172, 1)'; //teal
//Right Panel:
//Welcome back
const expectedWelcomeBackText = 'WELCOME BACK!';
const expectedWelcomeBackColor = 'rgba(117, 117, 117, 1)' //gray
//Login
const expectedLoginTitleText = 'Login to your account';
const expectedLoginTitleColor = 'rgba(40, 39, 90, 1)'; //navy blue
const expectedLoginTitleFont = '32px';
//Username
const expectedUsernameLabel = 'Username';
const expectedUsernameColor = 'rgba(40, 39, 90, 1)'; //navy blue
const expectedUsernamePlaceholder = 'Username';
//Password
const expectedPasswordLabel = 'Password';
const expectedPasswordColor = 'rgba(40, 39, 90, 1)'; //navy blue
const expectedPasswordPlaceholder = 'Password';
//Forgot password link
const expectedForgotPasswordLinkColor = 'rgba(40, 39, 90, 1)'; //navy blue
//Login button
const expectedLoginButtonText = 'Login';
const expectedLoginButtonColor = 'rgba(48, 200, 172, 1)'; //teal
//Don't have account text
const expectedDontHaveAccountText = `DON'T HAVE AN ACCOUNT?`;
//Free trial button
const expectedFreeTrialButtonText = '30 Day';
const expectedFreeTrialButtonColor = 'rgba(0, 0, 0, 0)'; //white
const steps = [
{ description: 'Navigate to ExACT Landing Page', action: async () => await driver.navigate().to('https://stage.edgate.com/exact/login.php') }, //PROD - https://correlation.edgate.com/exact/login.php
{ description: 'Expand browser', action: async () => await driver.manage().window().maximize() },
//LEFT PANEL
//Title text
{ description: 'Wait for title text to be present', action: async () => await driver.wait(until.elementLocated(By.css('h2:nth-child(1)')), 5000) },
{ description: 'Validate title text', action: async () =>
{ const elementText = await driver.findElement(By.css('h2:nth-child(1)')).getText();
if (elementText === expectedTitleText)
{console.log('Passed: Title text matched as expected');}
else
{console.log(`FAILED: Expected: "${expectedTitleText}"; Actual: "${elementText}"`);}
}
},
//Title text font
{ description: 'Validate Title text font size', action: async () =>
{ const elementStyle = await driver.findElement(By.css('h2:nth-child(3)')).getCssValue('font-size');
if (elementStyle === expectedTitleFont)
{console.log('Passed: Title text font-size matched as expected');}
else
{console.log(`FAILED: Title text font-size Expected: "${expectedTitleFont}"; Actual: "${elementStyle}"`);}
}
},
//Descriptive text 1
{ description: 'Validate descriptive text 1', action: async () =>
{ const elementText = await driver.findElement(By.css('.content-inner > p:nth-child(2)')).getText();
if (elementText === expectedDescriptiveText1)
{console.log('Passed: Descriptive text 1 matched as expected');}
else
{console.log(`FAILED: Expected: "${expectedDescriptiveText1}"; Actual: "${elementText}"`);}
}
},
//Descriptive text 2
{ description: 'Validate descriptive text 2', action: async () =>
{ const elementText = await driver.findElement(By.css('p:nth-child(3)')).getText();
if (elementText === expectedDescriptiveText2)
{console.log('Passed: Descriptive text 2 matched as expected');}
else
{console.log(`FAILED: Expected: "${expectedDescriptiveText2}"; Actual: "${elementText}"`);}
}
},
//Sign Up text
{ description: 'Validate sign up text', action: async () =>
{ const elementText = await driver.findElement(By.css('h4')).getText();
if (elementText === expectedSignUpText)
{console.log('Passed: Sign up text matched as expected');}
else
{console.log(`FAILED: Expected: "${expectedSignUpText}"; Actual: "${elementText}"`);}
}
},
//Free trial link text color
{ description: 'Validate free trial link color', action: async () =>
{ const elementStyle = await driver.findElement(By.linkText('30 Day Free Trial')).getCssValue('color');
if (elementStyle === expectedFreeTrialLinkColor)
{console.log('Passed: Free trial link text color matched as expected');}
else
{console.log(`FAILED: Free trial link text color Expected: "${expectedFreeTrialLinkColor}"; Actual: "${elementStyle}"`);}
}
},
//Bullet Point Icon 1
{ description: 'Verify bullet point icon 1 is present', action: async () =>
{ const expectedbulletPointIcon = await driver.wait(until.elementLocated(By.css('li:nth-child(1) img')), 5000).catch(() => false);
if (expectedbulletPointIcon)
{console.log('Passed: Bullet Point Icon 1 present');}
else
{console.log('FAILED: Bullet Point Icon 1 not found');}
}
},
//Bullet Point 1 text
{ description: 'Validate bullet point 1 text', action: async () =>
{ const elementText = await driver.findElement(By.css('li:nth-child(1) > .list-flex')).getText();
if (elementText === expectedBulletPointText1)
{console.log('Passed: Bullet point 1 text matched as expected');}
else
{console.log(`FAILED: Expected: "${expectedBulletPointText1}"; Actual: "${elementText}"`);}
}
},
//Bullet Point link 1 text color
{ description: 'Validate bullet point link 1 text color', action: async () =>
{ const elementStyle = await driver.findElement(By.linkText('ExACT AutoAlign,')).getCssValue('color');
if (elementStyle === expectedBulletPointLinkColor1)
{console.log('Passed: Bullet point link 1 text color matched as expected');}
else
{console.log(`FAILED: Bullet point link 1 text color Expected: "${expectedBulletPointLinkColor1}"; Actual: "${elementStyle}"`);}
}
},
//Bullet Point Icon 2
{ description: 'Verify bullet point icon 2 is present', action: async () =>
{ const expectedbulletPointIcon = await driver.wait(until.elementLocated(By.css('li:nth-child(2) img')), 5000).catch(() => false);
if (expectedbulletPointIcon)
{console.log('Passed: Bullet Point Icon 2 present');}
else
{console.log('FAILED: Bullet Point Icon 2 not found');}
}
},
//Bullet Point 2 text
{ description: 'Validate bullet point 2 text', action: async () =>
{ const elementText = await driver.findElement(By.css('li:nth-child(2) > .list-flex')).getText();
if (elementText === expectedBulletPointText2)
{console.log('Passed: Bullet point 2 text matched as expected');}
else
{console.log(`FAILED: Expected: "${expectedBulletPointText2}"; Actual: "${elementText}"`);}
}
},
//Bullet Point link 2 text color
{ description: 'Validate bullet point link 2 text color', action: async () =>
{ const elementStyle = await driver.findElement(By.linkText('Correlation Analytics.')).getCssValue('color');
if (elementStyle === expectedBulletPointLinkColor2)
{console.log('Passed: Bullet point link 2 text color matched as expected');}
else
{console.log(`FAILED: Bullet point link 2 text color Expected: "${expectedBulletPointLinkColor2}"; Actual: "${elementStyle}"`);}
}
},
//Bullet Point Icon 3
{ description: 'Verify bullet point icon 3 is present', action: async () =>
{ const expectedbulletPointIcon = await driver.wait(until.elementLocated(By.css('li:nth-child(3) img')), 5000).catch(() => false);
if (expectedbulletPointIcon)
{console.log('Passed: Bullet Point Icon 3 present');}
else
{console.log('FAILED: Bullet Point Icon 3 not found');}
}
},
//Bullet Point 3 text
{ description: 'Validate bullet point 3 text', action: async () =>
{ const elementText = await driver.findElement(By.css('li:nth-child(3) > .list-flex')).getText();
if (elementText === expectedBulletPointText3)
{console.log('Passed: Bullet point 3 text matched as expected');}
else
{console.log(`FAILED: Expected: "${expectedBulletPointText3}"; Actual: "${elementText}"`);}
}
},
//Bullet Point link 3 text color
{ description: 'Validate bullet point link 3 text color', action: async () =>
{ const elementStyle = await driver.findElement(By.linkText('International Standards.')).getCssValue('color');
if (elementStyle === expectedBulletPointLinkColor3)
{console.log('Passed: Bullet point link 3 text color matched as expected');}
else
{console.log(`FAILED: Bullet point link 3 text color Expected: "${expectedBulletPointLinkColor3}"; Actual: "${elementStyle}"`);}
}
},
//RIGHT PANEL
//ExACT logo
{ description: 'Verify ExACT logo is present', action: async () =>
{ const expectedExactLogo = await driver.wait(until.elementLocated(By.css('.logo')), 5000).catch(() => false);
if (expectedExactLogo)
{console.log('Passed: ExACT logo present');}
else
{console.log('FAILED: ExACT logo not found');}
}
},
//Welcome back text
{ description: 'Validate Welcome back text', action: async () =>
{ const elementText = await driver.findElement(By.css('#formLogin > p')).getText();
if (elementText === expectedWelcomeBackText)
{console.log('Passed: Welcome Back! text matched as expected');}
else
{console.log(`FAILED: Expected: "${expectedWelcomeBackText}"; Actual: "${elementText}"`);}
}
},
//Welcome back text color
{ description: 'Validate Welcome back text color', action: async () =>
{ const elementStyle = await driver.findElement(By.css('#formLogin > p')).getCssValue('color');
if (elementStyle === expectedWelcomeBackColor)
{console.log('Passed: Welcome back text color matched as expected');}
else
{console.log(`FAILED: Welcome back text color Expected: "${expectedWelcomeBackColor}"; Actual: "${elementStyle}"`);}
}
},
//Welcome back icon
{ description: 'Verify Welcome back icon is present', action: async () =>
{ const expectedWelcomeBackIcon = await driver.wait(until.elementLocated(By.css('p > img')), 5000).catch(() => false);
if (expectedWelcomeBackIcon)
{console.log('Passed: Welcome back icon present');}
else
{console.log('FAILED: Welcome back icon not found');}
}
},
//Login title text
{ description: 'Validate Login title text', action: async () =>
{ const elementText = await driver.findElement(By.css('h2:nth-child(3)')).getText();
if (elementText === expectedLoginTitleText)
{console.log('Passed: Login title text matched as expected');}
else
{console.log(`FAILED: Expected: "${expectedLoginTitleText}"; Actual: "${elementText}"`);}
}
},
//Login title text color
{ description: 'Validate Login title text color', action: async () =>
{ const elementStyle = await driver.findElement(By.css('h2:nth-child(3)')).getCssValue('color');
if (elementStyle === expectedLoginTitleColor)
{console.log('Passed: Login title text color matched as expected');}
else
{console.log(`FAILED: Login title text color Expected: "${expectedLoginTitleColor}"; Actual: "${elementStyle}"`);}
}
},
//Login title text font
{ description: 'Validate Login title text font size', action: async () =>
{ const elementStyle = await driver.findElement(By.css('h2:nth-child(3)')).getCssValue('font-size');
if (elementStyle === expectedLoginTitleFont)
{console.log('Passed: Login title text font-size matched as expected');}
else
{console.log(`FAILED: Login title text font-size Expected: "${expectedLoginTitleFont}"; Actual: "${elementStyle}"`);}
}
},
//Username label text
{ description: 'Validate Username label text', action: async () =>
{ const elementText = await driver.findElement(By.css('.form-group:nth-child(4) > label')).getText();
if (elementText === expectedUsernameLabel)
{console.log('Passed: Username label text matched as expected');}
else
{console.log(`FAILED: Expected: "${expectedUsernameLabel}"; Actual: "${elementText}"`);}
}
},
//Username label text color
{ description: 'Validate Username label text color', action: async () =>
{ const elementStyle = await driver.findElement(By.css('.form-group:nth-child(4) > label')).getCssValue('color');
if (elementStyle === expectedUsernameColor)
{console.log('Passed: Username label text color matched as expected');}
else
{console.log(`FAILED: Username label text color Expected: "${expectedUsernameColor}"; Actual: "${elementStyle}"`);}
}
},
//Username textbox placeholder
{ description: 'Validate Username placeholder text', action: async () =>
{ const elementValue = await driver.findElement(By.css('.form-control:nth-child(2)')).getAttribute('placeholder');
if (elementValue === expectedUsernamePlaceholder)
{console.log('Passed: Username placeholder text matched as expected');}
else
{console.log(`FAILED: Username placeholder text Expected: "${expectedUsernamePlaceholder}"; Actual: "${elementValue}"`);}
}
},
//Password label text
{ description: 'Validate Password label text', action: async () =>
{ const elementText = await driver.findElement(By.css('.form-group:nth-child(5) > label')).getText();
if (elementText === expectedPasswordLabel)
{console.log('Passed: Password label text matched as expected');}
else
{console.log(`FAILED: Expected: "${expectedPasswordLabel}"; Actual: "${elementText}"`);}
}
},
//Password label text color
{ description: 'Validate Password label text color', action: async () =>
{ const elementStyle = await driver.findElement(By.css('.form-group:nth-child(5) > label')).getCssValue('color');
if (elementStyle === expectedPasswordColor)
{console.log('Passed: Password label text color matched as expected');}
else
{console.log(`FAILED: Password label text color Expected: "${expectedPasswordColor}"; Actual: "${elementStyle}"`);}
}
},
//Password textbox placeholder
{ description: 'Validate Password placeholder text', action: async () =>
{ const elementValue = await driver.findElement(By.css('.passfield')).getAttribute('placeholder');
if (elementValue === expectedPasswordPlaceholder)
{console.log('Passed: Password placeholder text matched as expected');}
else
{console.log(`FAILED: Password placeholder text Expected: "${expectedPasswordPlaceholder}"; Actual: "${elementValue}"`);}
}
},
//Forgot password text link color
{ description: 'Validate Forgot Password link text color', action: async () =>
{ const elementStyle = await driver.findElement(By.linkText('Forgot Password?')).getCssValue('color');
if (elementStyle === expectedForgotPasswordLinkColor)
{console.log('Passed: Forgot password link text color matched as expected');}
else
{console.log(`FAILED: Forgot password link text color Expected: "${expectedForgotPasswordLinkColor}"; Actual: "${elementStyle}"`);}
}
},
//Login button text
{ description: 'Validate Login button text', action: async () =>
{ const elementText = await driver.findElement(By.css('.login')).getAttribute('value');
if (elementText === expectedLoginButtonText)
{console.log('Passed: Login button text matched as expected');}
else
{console.log(`FAILED: Expected: "${expectedLoginButtonText}"; Actual: "${elementText}"`);}
}
},
//Login button background color
{ description: 'Validate Login button background color', action: async () =>
{ const elementStyle = await driver.findElement(By.css('.login')).getCssValue('background-color');
if (elementStyle === expectedLoginButtonColor)
{console.log('Passed: Login button background color matched as expected');}
else
{console.log(`FAILED: Login button background color Expected: "${expectedLoginButtonColor}"; Actual: "${elementStyle}"`);}
}
},
//Don't have an account? text
{ description: 'Validate Dont have account text', action: async () =>
{ const elementText = await driver.findElement(By.css('p:nth-child(1)')).getText();
if (elementText === expectedDontHaveAccountText)
{console.log('Passed: Dont have an account text matched as expected');}
else
{console.log(`FAILED: Expected: "${expectedDontHaveAccountText}"; Actual: "${elementText}"`);}
}
},
//Free trial button text
{ description: 'Validate Free trial button text', action: async () =>
{ const elementText = await driver.findElement(By.css('.btn > span')).getText();//attribute
if (elementText === expectedFreeTrialButtonText)
{console.log('Passed: Free trial button text matched as expected');}
else
{console.log(`FAILED: Expected: "${expectedFreeTrialButtonText}"; Actual: "${elementText}"`);}
}
},
//Free trial button background color
{ description: 'Validate Free trial button background color', action: async () =>
{ const elementStyle = await driver.findElement(By.css('.btn > span')).getCssValue('background-color');
if (elementStyle === expectedFreeTrialButtonColor)
{console.log('Passed: Free trial button background color matched as expected');}
else
{console.log(`FAILED: Free trial button background color Expected: "${expectedFreeTrialButtonColor}"; Actual: "${elementStyle}"`);}
}
},
//EdGate copyright image
{ description: 'Verify EdGate copyright image is present', action: async () =>
{ const expectedEdGateCopyright = await driver.wait(until.elementLocated(By.css('.logincopyright > img')), 5000).catch(() => false);
if (expectedEdGateCopyright)
{console.log('Passed: EdGate copyright image present');}
else
{console.log('FAILED: EdGate copyright not found');}
}
},
//Validation
{ description: 'Click Login button', action: async () => await driver.findElement(By.css('.login')).click() },
];
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', 'landingPageScript');
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true });
}
const screenshotFileName = `step_${stepIndex}_${stepDescription.replace(/\s+/g, '_')}.png`;
const screenshotPath = path.join(dir, screenshotFileName);
fs.writeFileSync(screenshotPath, screenshot, 'base64');
return screenshotPath;
};
try {
// Initialize workbook and worksheet
if (!fs.existsSync('landingPageResults.xlsx')) {
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');
XLSX.writeFile(workbook, 'landingPageResults.xlsx');
} else {
workbook = XLSX.readFile('landingPageResults.xlsx', { cellStyles: true });
const sheetName = workbook.SheetNames[0];
worksheet = workbook.Sheets[sheetName];
}
// Log test start time
worksheet = logStep(worksheet, 'Test Start', 'Started', '', startTime, '');
for (const step of steps) {
const stepIndex = steps.indexOf(step) + 1;
const timestamp = new Date().toISOString();
try {
await step.action();
const screenshotPath = await takeScreenshot(driver, stepIndex, step.description);
worksheet = logStep(worksheet, step.description, 'Passed', stepIndex, timestamp, screenshotPath);
} catch (error) {
const screenshotPath = await takeScreenshot(driver, stepIndex, `${step.description}_Failed`);
worksheet = logStep(worksheet, step.description, 'Failed', stepIndex, timestamp, screenshotPath);
throw error; // Re-throw the error to stop further execution if necessary
}
}
//Check if landing page username validation was successful
const usernameValidation = await driver.wait(until.elementLocated(By.css('.form-group:nth-child(5) > label')), 5000).catch(() => false);
if (usernameValidation) {
console.log('Passed: Username validation');
testStatus = 'Passed';
} else {
console.log('FAILED: Username validation not triggered');
}
// Log test end time
const endTime = new Date().toISOString();
worksheet = logStep(worksheet, 'Test End', 'Ended', '', endTime, '');
// Write the updated worksheet back to the workbook and save it
workbook.Sheets['Sheet1'] = worksheet;
XLSX.writeFile(workbook, 'landingPageResults.xlsx');
} finally {
await driver.quit();
}
})();
}
export default ExACT_landingPage;