Selenium / New Relic Synthetics login using Microsoft AD + Check for text
After the recent Microsoft Azure AD outage of 15/0/3/2021 I thought how can I actually see whether our page is displaying what should be there and not just a API call error generated because of the Microsoft outage.
To do that I added step 6 ‘find text’ see below.
/**
* Script Name: {Moodle Login}
*
*/
/** CONFIGURATIONS **/
// Theshold for duration of entire script - fails test if script lasts longer than X (in ms)
var ScriptTimeout = 180000;
// Script-wide timeout for all wait and waitAndFind functions (in ms)
var DefaultTimeout = 30000;
// Change to any User Agent you want to use.
// Leave as "default" or empty to use the Synthetics default.
var UserAgent = "default";
/** HELPER VARIABLES AND FUNCTIONS **/
const assert = require('assert'),
By = $driver.By,
browser = $browser.manage()
/** BEGINNING OF SCRIPT **/
console.log('Starting synthetics script: {Untitled Test Case}');
console.log('Default timeout is set to ' + (DefaultTimeout/1000) + ' seconds');
// Setting User Agent is not then-able, so we do this first (if defined and not default)
if (UserAgent && (0 !== UserAgent.trim().length) && (UserAgent != 'default')) {
$browser.addHeader('User-Agent', UserAgent);
console.log('Setting User-Agent to ' + UserAgent);
}
// Get browser capabilities and do nothing with it, so that we start with a then-able command
$browser.getCapabilities().then(function () { })
.then(() => {
logger.log(1, "https://your.site.co.uk/login/index.php");
return $browser.get("https://your.site.co.uk/login/index.php"), DefaultTimeout;
})
.then(() => {
logger.log(2, "click Sign in on Moodle page");
return $browser.waitForAndFindElement(By.linkText("Sign in"), DefaultTimeout)
.then(function (el) {
el.click();
})
})
.then(() => {
logger.log(3, "Pass Test Username");
return $browser.waitForAndFindElement(By.name("loginfmt"), DefaultTimeout)
.then(function (el) {
el.sendKeys($secure.USER);
})
}).then(function(el){
//Find and click the login button.
return $browser.waitForAndFindElement(By.xpath("//input[@value='Next']"), DefaultTimeout)
.then(function (el) {
el.click();
})
})
.then(() => {
logger.log(4, "pass the password securely");
return $browser.waitForElement(By.name("passwd"), DefaultTimeout)
.then(function (el) {
el.sendKeys($secure.PASS_ID);
})
}).then(function(el){
//Find and click the login button.
return $browser.waitForAndFindElement(By.xpath("//input[@value='Sign in']"), DefaultTimeout)
.then(function (el) {
el.click();
})
})
.then(() => {
logger.log(5, "find YOUR text");
var textToFind = "YOUR TEXT";
var pageText = $browser.waitForAndFindElement(By.tagName("html"), DefaultTimeout).getText()
.then(function(body){
assert.ok(body.indexOf(textToFind) != -1,"Text "+ textToFind+ " not found in page");
});
})
.then(function() {
logger.end();
console.log('Browser script execution SUCCEEDED.');
}, function(err) {
logger.end();
console.log ('Browser script execution FAILED.');
throw(err);
});
//** Export Functions
const logger=(function (timeout=3000, mode='production') {
var startTime = Date.now(),
stepStartTime = Date.now(),
prevMsg = '',
prevStep = 0;
if (typeof $util == 'undefined' ){
$util = {
insights: {
set: (msg) => {
console.log(`dryRun: sending to Insights using ${msg}`)
}
}
}
}
function log(thisStep, thisMsg) {
if (thisStep > prevStep && prevStep != 0) {
end()
}
stepStartTime = Date.now() - startTime;
if (mode != "production") {
stepStartTime = 0
}
console.log(`Step ${thisStep}: ${thisMsg} STARTED at ${stepStartTime}ms.`);
prevMsg = thisMsg;
prevStep = thisStep;
}
function end() {
var totalTimeElapsed = Date.now() - startTime;
var prevStepTimeElapsed = totalTimeElapsed - stepStartTime;
if (mode != 'production') {
prevStepTimeElapsed = 0
totalTimeElapsed = 0
}
console.log(`Step ${prevStep}: ${prevMsg} FINISHED. It took ${prevStepTimeElapsed}ms to complete.`);
$util.insights.set(`Step ${prevStep}: ${prevMsg}`, prevStepTimeElapsed);
if (timeout > 0 && totalTimeElapsed > timeout) {
throw new Error('Script timed out. ' + totalTimeElapsed + 'ms is longer than script timeout threshold of ' + timeout + 'ms.');
}
}
return {
log,
end
}
})(ScriptTimeout)