const find = require("../lib/PromiseSelector"); const $ = find.one; const fs = require("fs"); async function login(email, password) { await browser.url(await getBaseUrl() + "?s=login"); await browser.waitUntil(async () => { let element = $("#main-content"); return await element.isDisplayed() }); await acceptCookies(); await browser.pause(1000); await $("input[name=email]").setValue(email); await $("input[name=password]").setValue(password); await $("button=Login").click(); await browser.pause(3000); } async function logout() { await $(".footer .icon.home").click(); await $("span=Logout").click(); } async function pause(delay) { await browser.pause(delay * browser.config.delayFactor); } async function queryDatabase(query) { let mysql = browser.config.mysqlConnection; return new Promise(resolve => { mysql.query(query, function (err, result) { if (!err) { resolve(result); } else { console.error(err); resolve(err); } }); }); } async function setCurrentDate(date) { if (!(date instanceof Date)) { date = new Date(2019, 5, 26, 14, 30, 42); } const time = date.getTime(); await browser.execute((time) => { const OldDate = window["Date"]; class Date extends OldDate { constructor(...args) { if (arguments.length === 0) { super(time); } else { super(...arguments) } } } window["Date"] = Date; }, time); } async function setFormValues(values, useSelector) { if (useSelector === undefined) { useSelector = false; } let promise = Promise.resolve(); Object.keys(values).forEach(selector => { promise = promise.then(async () => { let elem; if (useSelector) { elem = $(selector) } else { elem = $("[name=" + selector + "]"); } if (await elem.isTag("select")) { await elem.selectByAttribute("value", values[selector]); } else if (await elem.getAttribute("type") === "checkbox" || await elem.getAttribute("type") === "radio") { if (!await elem.isSelected()) { return elem.click(); } } else { return elem.setValue(values[selector]); } }); }); return promise; } async function acceptCookies() { if (!browser.config.isMobile) { try { await $("#accept-all").click(); } catch (e) { console.error(e); } } } async function verifyFormValues(values, useSelector) { if (useSelector === undefined) { useSelector = false; } let promise = Promise.resolve(); Object.keys(values).forEach(selector => { promise = promise.then(async () => { if (useSelector) { expect(await $(selector).getValue()).toEqual(values[selector]); } else { expect(await $("[name=" + selector + "]").getValue()).toEqual(values[selector]); } }); }); return promise; } async function addCustomChildSelector() { await browser.addLocatorStategy("selectParent", (parentSelector, childSelector) => { let children = document.querySelectorAll(childSelector); let parents = []; children.forEach(child => { let parent = child.closest(parentSelector); if (parent) { parents.push(parent); } }); return parents; }); } async function getBaseUrl() { if (browser.config.baseUrl.trim() !== "") { return browser.config.baseUrl; } else { return browser.getUrl(); } } async function acceptAlert() { if (browser.config.hasAlertDialogs !== false) { try { await pause(1500); await browser.acceptAlert(); await pause(500); // await browser.acceptAlert(); // await pause(500); } catch (e) { if (e.message !== "An attempt was made to operate on a modal dialog when one was not open." && !e.message.startsWith("no such alert")) { expect(e.message).toEqual("error message"); throw e; } } } } async function compareFiles(originalPath, expectedPath) { let filePromises = [ new Promise((res, rej) => fs.readFile(originalPath, (err, data) => err ? rej(err) : res(data))), new Promise((res, rej) => fs.readFile(expectedPath, (err, data) => err ? rej(err) : res(data))) ]; let fileData = await Promise.all(filePromises); expect(fileData[0]).toEqual(fileData[1]); } async function deactivateTranslationLogging() { await browser.execute(() => { window["shouldConsoleMissingTranslation"] = false; }); } async function logErrors() { await browser.execute(() => { window["loggedErrors"] = []; window.addEventListener("error", event => { window["loggedErrors"].push(event.message); }, true); window.onunhandledrejection = (e) => { window["loggedErrors"].push(e.reason); } }); } async function getLoggedErrors() { return await browser.execute(() => { return window["loggedErrors"]; }); } async function asyncExecute(func, ...args){ // console.log(func+""); let index = await browser.execute((funcString, args) => { let func = eval(funcString); let res = func(...args); if (!window["testValIndex"]){ window["testValIndex"] = 0; } window["testValIndex"]++; let index = window["testValIndex"]; Promise.resolve(res).then(r => window["test-res-"+index] = r); return index; // return args; }, func+"", args); // console.log(index); // await pause(1000); return await browser.execute((i) => window["test-res-"+i], index); // return index; } module.exports = { login: login, logout: logout, queryDatabase: queryDatabase, setCurrentDate: setCurrentDate, setFormValues: setFormValues, verifyFormValues: verifyFormValues, addCustomChildSelector: addCustomChildSelector, getBaseUrl: getBaseUrl, pause: pause, acceptAlert: acceptAlert, acceptCookies: acceptCookies, compareFiles: compareFiles, deactivateTranslationLogging: deactivateTranslationLogging, logErrors: logErrors, getLoggedErrors: getLoggedErrors, asyncExecute: asyncExecute, };