mirror of
https://github.com/scratchfoundation/scratch-www.git
synced 2024-11-27 01:25:52 -05:00
121 lines
3.4 KiB
JavaScript
121 lines
3.4 KiB
JavaScript
var webdriver = require('selenium-webdriver');
|
|
|
|
const headless = process.env.SMOKE_HEADLESS || false;
|
|
const remote = process.env.SMOKE_REMOTE || false;
|
|
const {SAUCE_USERNAME, SAUCE_ACCESS_KEY} = process.env;
|
|
|
|
const getDriver = function () {
|
|
const chromeCapabilities = webdriver.Capabilities.chrome();
|
|
let args = [];
|
|
if (headless) {
|
|
args.push('--headless');
|
|
args.push('window-size=1024,1680');
|
|
args.push('--no-sandbox');
|
|
}
|
|
chromeCapabilities.set('chromeOptions', {args});
|
|
const newDriver = new webdriver.Builder()
|
|
.forBrowser('chrome')
|
|
.withCapabilities(chromeCapabilities)
|
|
.build();
|
|
return newDriver;
|
|
};
|
|
|
|
const getSauceDriver = function (username, accessKey, configs) {
|
|
let driver = new webdriver.Builder()
|
|
.withCapabilities({
|
|
browserName: configs.browserName,
|
|
platform: configs.platform,
|
|
version: configs.version,
|
|
username: username,
|
|
accessKey: accessKey,
|
|
name: 'smoke test scratch-www'
|
|
})
|
|
.usingServer(`http://${username}:${accessKey
|
|
}@ondemand.saucelabs.com:80/wd/hub`)
|
|
.build();
|
|
return driver;
|
|
};
|
|
// Driver configs can be generated with the Sauce Platform Configurator
|
|
// https://wiki.saucelabs.com/display/DOCS/Platform+Configurator
|
|
const driverConfig = {
|
|
browserName: 'chrome',
|
|
platform: 'macOS 10.13',
|
|
version: '67.0'
|
|
};
|
|
var driver;
|
|
if (remote === 'true'){
|
|
driver = getSauceDriver(SAUCE_USERNAME, SAUCE_ACCESS_KEY, driverConfig);
|
|
} else {
|
|
driver = getDriver();
|
|
}
|
|
|
|
const {By, until} = webdriver;
|
|
|
|
const findByXpath = (xpath) => {
|
|
return driver.wait(until.elementLocated(By.xpath(xpath), 5 * 1000));
|
|
};
|
|
|
|
const clickXpath = (xpath) => {
|
|
return findByXpath(xpath).then(el => el.click());
|
|
};
|
|
|
|
const clickText = (text) => {
|
|
return clickXpath(`//*[contains(text(), '${text}')]`);
|
|
};
|
|
|
|
const findText = (text) => {
|
|
return driver.wait(until.elementLocated(By.xpath(`//*[contains(text(), '${text}')]`), 5 * 1000));
|
|
};
|
|
|
|
const clickButton = (text) => {
|
|
return clickXpath(`//button[contains(text(), '${text}')]`);
|
|
};
|
|
|
|
const findByCss = (css) => {
|
|
return driver.wait(until.elementLocated(By.css(css), 1000 * 5));
|
|
};
|
|
|
|
const clickCss = (css) => {
|
|
return findByCss(css).then(el => el.click());
|
|
};
|
|
|
|
const getLogs = (whitelist) => {
|
|
return driver.manage()
|
|
.logs()
|
|
.get('browser')
|
|
.then((entries) => {
|
|
return entries.filter((entry) => {
|
|
const message = entry.message;
|
|
for (let i = 0; i < whitelist.length; i++) {
|
|
if (message.indexOf(whitelist[i]) !== -1) {
|
|
// eslint-disable-next-line no-console
|
|
// console.warn('Ignoring whitelisted error: ' + whitelist[i]);
|
|
return false;
|
|
} else if (entry.level !== 'SEVERE') {
|
|
// eslint-disable-next-line no-console
|
|
// console.warn('Ignoring non-SEVERE entry: ' + message);
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
return true;
|
|
});
|
|
});
|
|
};
|
|
|
|
module.exports = {
|
|
webdriver,
|
|
By,
|
|
until,
|
|
driver,
|
|
clickXpath,
|
|
findByXpath,
|
|
clickText,
|
|
findText,
|
|
clickButton,
|
|
findByCss,
|
|
clickCss,
|
|
getLogs,
|
|
getDriver,
|
|
getSauceDriver
|
|
};
|