import 'codeceptjs'; import fetch from "node-fetch"; import { logger } from "../Logger/logger"; import { CommonKeyword } from './commonKeyword'; import { DatePicker } from './datePicker'; import { DewFileUpload } from './dewFileUpload'; import { Wait } from './dewWait'; import { DewElement } from './element'; import { GenerateRandom } from './generateRandom'; import { TextField } from './textfield'; import { z } from './z'; const { I } = inject(); declare const inject: any; /** * Flexifield eNum class to store Name, ID and type */ class FlexiFields { fieldName!: string; fieldId!: string; fieldType!: string; } /** * FlexiForm Class */ export class Flexiform { /** * The method is used to fill flexiform fields using getInstance API call * * ```js * await Flexiform.flexiformAPI('iSource') * ``` * @param {string}product */ static async flexiformAPI(product: string) { const cookieValue: any = await getCookie(); await console.log(`Session Tekend is: ${cookieValue}`); const raw = await JSON.stringify({ "formId": `8a82839c-733bbf0f-0173-75a9a8e1-0157`, "instanceId": `` }); const requestOptions = { method: `POST`, headers: { 'cookie': `SAAS_COMMON_BASE_TOKEN_ID=` + cookieValue, 'Content-Type': `application/json`, }, body: raw, }; const homeURL = await CommonKeyword.executeScript(`return window.location.origin`); console.log(homeURL + `/` + product.toLowerCase() + `/api/a/eform/dynamicforms/getInstance`); let responseFetched: any; await fetch(homeURL + `/` + product.toLowerCase() + `/api/a/eform/dynamicforms/getInstance`, requestOptions) .then((res) => res.json()) .then((res) => { responseFetched = res; }) .catch((error) => console.log(`error`, error)); // console.log(responseFetched); let flexiFieldList! : FlexiFields[]; const sectionsList: any[] = await responseFetched.data.form.formDefinition.sectionDefinitions; // console.log(`Section List:`, sectionsList); for (const section of sectionsList) { const fieldsList: any[] = section.fieldDefinitions; for (const field of fieldsList) { const fieldInstance: FlexiFields = new FlexiFields(); fieldInstance.fieldName = field.name; fieldInstance.fieldId = field.fieldDefinitionId; fieldInstance.fieldType = field.fieldType; flexiFieldList.push(fieldInstance); } } for (const flexiField of flexiFieldList) { /* console.log(`-----------Field---------------`); console.log(`Field:`, flexiField); */ await fillFields(flexiField); } } } /** * The method is used to fill flexiform fields * @param {any}flexiField */ async function fillFields(flexiField: any) { try { switch (flexiField.fieldType) { case `TEXT`: console.log(`TEXT Field ID ${flexiField.fieldId}`); await flexi_Text(flexiField.fieldId, flexiField.fieldType); break; case `CHECKBOX`: console.log(`CHECKBOX Field ID ${flexiField.fieldId}`); await flexi_checkbox(flexiField.fieldId); break; case `FILE_UPLOAD`: console.log(`FILE_UPLOAD Field ID ${flexiField.fieldId}`); await flexi_fileUpload(flexiField.fieldId); break; case `MULTI_SELECT`: console.log(`MULTI_SELECT Field ID ${flexiField.fieldId}`); await flexi_Dropdown_Multiselect_AutoComplete(flexiField.fieldId); break; case `DROP_DOWN`: console.log(`DROP_DOWN Field ID ${flexiField.fieldId}`); await flexi_Dropdown_Multiselect_AutoComplete(flexiField.fieldId); break; case `NUMERIC`: console.log(`NUMERIC Field ID ${flexiField.fieldId}`); await flexi_Text(flexiField.fieldId, flexiField.fieldType); break; case `DATE_TIME`: console.log(`DATE_TIME Field ID ${flexiField.fieldId}`); await flexi_Datepicker(flexiField.fieldId); break; case `RADIO`: console.log(`RADIO Field ID ${flexiField.fieldId}`); await flexi_Radio(flexiField.fieldId); break; case `TEXT_AREA`: console.log(`TEXT_AREA Field ID ${flexiField.fieldId}`); await flexi_Text(flexiField.fieldId, flexiField.fieldType); break; case `AUTO_COMPLETE`: console.log(`AUTO_COMPLETE Field ID ${flexiField.fieldId}`); await flexi_Dropdown_Multiselect_AutoComplete(flexiField.fieldId); break; default: throw new Error(`Error in DDCC`); } } catch (err) { throw err; } } /** * The method is used to fill Text, TextArea and Numeric type field * * @param {string}fieldId * @param {string}fieldType */ async function flexi_Text(fieldId: string, fieldType?: string) { try { let locator; if (fieldType == `NUMERIC`) { locator = `//*[contains(@id,"${fieldId}")]`; await CommonKeyword.scrollIntoView(locator); await TextField.enterTextUsingLocator(locator, await GenerateRandom.generateRandomNumber(100)); } else { locator = `//*[contains(@id,"${fieldId}")]/input | //*[contains(@id,"${fieldId}")]/textarea`; await CommonKeyword.scrollIntoView(locator); await TextField.enterTextUsingLocator(locator, `Autotext_` + await GenerateRandom.generateRandomNumber(10000)); } } catch (err) { throw err; } } /** * The method is used to fill Attachment type field * * @param {string}fieldId */ async function flexi_fileUpload(fieldId: string) { try { const locator = `//*[contains(@id,'${fieldId}')]//input[1]`; await CommonKeyword.scrollIntoView(locator); await DewFileUpload.uploadFileUsingLocator(locator, `resources//Sprint.xlsx`); } catch (err) { throw err; } } /** * The method is used to fill checkbox type field * @param {string}fieldId */ async function flexi_checkbox(fieldId: string) { try { const locator = `(//dew-input-container[contains(@id,"${fieldId}")]//dew-checkbox)[1]`; await CommonKeyword.clickElement(locator); } catch (err) { throw err; } } /** * The method is used to select dropdown, Multiselect and AutoComplete type field * @param {string}fieldId */ async function flexi_Dropdown_Multiselect_AutoComplete(fieldId: string) { try { await CommonKeyword.scrollIntoView(`//*[contains(@id,'${fieldId}')]//input`); await CommonKeyword.clickElement(`//*[contains(@id,'${fieldId}')]//input`); const locator = `//div[contains(@class,'autoCompleteListOutsideTable')]//div[contains(@class,'list')]/div`; await Wait.waitUntilVisibilityOfElement(locator); const dropdownElements = await DewElement.getListOfElements(locator); const rnd = await GenerateRandom.generateRandomNumber(dropdownElements.length); await CommonKeyword.clickElement(`(//div[contains(@class,'autoCompleteListOutsideTable')]//div[contains(@class,'list')]/div)[${rnd + 1}]`); } catch (err) { logger.log(`Error`); throw err; } } /** * The method is used to select Date type field * @param {string}fieldId */ async function flexi_Datepicker(fieldId: string) { try { await CommonKeyword.scrollIntoView(`//*[contains(@id,'${fieldId}')]//input`); await DatePicker.selectToday(`//*[contains(@id,'${fieldId}')]//input`); } catch (err) { logger.log(`Error`); throw err; } } /** * The method is used to select Radio button type field * @param {string}fieldId */ async function flexi_Radio(fieldId: string) { try { await CommonKeyword.scrollIntoView(`(//input[contains(@name,'${fieldId}')]/following-sibling::label)[1]`); // await CommonKeyword.clickElement(`(//*[contains(@id,'${fieldId}')]//input)[1]/following-sibling::label`); await CommonKeyword.clickElement(`(//input[contains(@name,'${fieldId}')]/following-sibling::label)[1]`); } catch (err) { logger.log(`Error`); throw err; } } /** * Cookies */ async function getCookie() { const cookie: any = await z.grabCookie(`SAAS_COMMON_BASE_TOKEN_ID`); return cookie.value; }