From dbaa521358c0c01fbf3ed347d3d0000837aa29cb Mon Sep 17 00:00:00 2001 From: jhuerta Date: Mon, 19 May 2025 13:44:43 -0700 Subject: [PATCH] Added split row validation fix --- frameworkManagementPageResults.xlsx | Bin 128640 -> 127686 bytes tests/ExACT_frameworkManagementPage.js | 629 +++++++++++++++++++------ 2 files changed, 483 insertions(+), 146 deletions(-) diff --git a/frameworkManagementPageResults.xlsx b/frameworkManagementPageResults.xlsx index b019b7907f5fdfdd528a8bc1c76e6ccb28dc6bd1..539a1a6777c967a58150ad833b249815d02dc72f 100644 GIT binary patch delta 13053 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

-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 Sze(+$v1mW#0ek12cm5CYGJDVf delta 13815 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 diff --git a/tests/ExACT_frameworkManagementPage.js b/tests/ExACT_frameworkManagementPage.js index 6afae79..ecc64de 100644 --- a/tests/ExACT_frameworkManagementPage.js +++ b/tests/ExACT_frameworkManagementPage.js @@ -741,7 +741,7 @@ const steps = [ { description: 'Validate Advanced Search button text', action: async () => { - const elementText = await driver.findElement(By.css('.bg-green')).getText(); + const elementText = await driver.findElement(By.css('div:nth-child(4) > .btn')).getText(); if (elementText !== 'Advanced Search') { throw new Error(`Expected: "Advanced Search" button text; Actual: "${elementText}"`); } @@ -749,20 +749,20 @@ const steps = [ } }, - //Advanced Search button color -green (ECS-2894) + //Advanced Search button color -green { description: 'Validate Advanced Search button color', action: async () => { - const elementStyle = await driver.findElement(By.css('.bg-green')).getCssValue('background-color'); + const elementStyle = await driver.findElement(By.css('div:nth-child(4) > .btn')).getCssValue('background-color'); if (elementStyle !== 'rgba(48, 200, 172, 1)') { - throw new Error(`ECS-2894 Advanced Search button color did not match; Actual: "${elementStyle}"`); + throw new Error(`Advanced Search button color did not match; Actual: "${elementStyle}"`); } - console.log('Passed: ECS-2894 Advanced Search button color matched as expected'); + console.log('Passed: Advanced Search button color matched as expected'); } }, //NEXT ACTION - Advanced Search button - { description: 'Click Advanced Search button', action: async () => await driver.findElement(By.css('.bg-green')).click() }, + { description: 'Click Advanced Search button', action: async () => await driver.findElement(By.css('div:nth-child(4) > .btn')).click() }, //Advanced Search DIV { @@ -782,7 +782,7 @@ const steps = [ action: async () => { const elementText = await driver.findElement(By.css('#exampleModalCenterTitle')).getText(); if (elementText !== 'Advance Framework Search') { - throw new Error(`Expected: "Advance Framework Searchh" DIV title text; Actual: "${elementText}"`); + throw new Error(`Expected: "Advance Framework Search" DIV title text; Actual: "${elementText}"`); } console.log('Passed: Advance Framework Search DIV title text matched as expected'); } @@ -848,15 +848,15 @@ const steps = [ } }, - //Match exact phrase label (ECS-2893) + //Match exact phrase label { description: 'Validate Match exact phrase label', action: async () => { const elementText = await driver.findElement(By.css('.ml-2:nth-child(2)')).getText(); if (elementText !== 'Match exact phrase') { - throw new Error(`Expected: ECS-2893 "Match exact phrase" label; Actual: "${elementText}"`); + throw new Error(`Expected: "Match exact phrase" label; Actual: "${elementText}"`); } - console.log('Passed: ECS-2893 Match exact phrase label matched as expected'); + console.log('Passed: Match exact phrase label matched as expected'); } }, @@ -1408,54 +1408,69 @@ const steps = [ { description: 'Validate Organization label', action: async () => { - const elementText = await driver.findElement(By.css('#divtype')).getText(); - if (elementText !== 'Organization') { - throw new Error(`Expected: "Organization" label text; Actual: "${elementText}"`); + try { + const element = await driver.findElement(By.css('#divtype')); + + //Get different versions of the text for debugging + const fullText = await element.getText(); + + //Check for the expected text in different ways + const expectedText = 'Organization'; + const trimmedFullText = fullText.trim(); + const firstLine = trimmedFullText.split('\n')[0].trim(); + + //Try multiple matching strategies + if (firstLine.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text in first line`); + } else if (trimmedFullText.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text within full text`); + } else { + throw new Error( + `Text validation failed.\nExpected: "${expectedText}"\n` + + `Full text: "${fullText}"\n` + + `First line: "${firstLine}"\n` + ); + } + + } catch (error) { + console.error('Detailed error during validation:', error); + throw error; //Re-throw after logging } - console.log('Passed: Organization label text matched as expected'); } }, - //Fixes are made for text comparison for description text + //Organization value { - description: 'Validate Applications of Linear Systems description text', + description: 'Validate Organization value', action: async () => { - const elementText = await driver.findElement(By.css('#divtype')).getText(); - const expectedText = 'Organization'; - - // Trim the element text to avoid mismatch due to extra spaces or appended text - if (elementText.trimEnd() !== expectedText) { - throw new Error(`Expected: "${expectedText}" text; Actual: "${elementText}"`); + try { + const element = await driver.findElement(By.css('#divname > .form-label')); + + //Get different versions of the text for debugging + const fullText = await element.getText(); + + //Check for the expected text in different ways + const expectedText = 'Name'; + const trimmedFullText = fullText.trim(); + const firstLine = trimmedFullText.split('\n')[0].trim(); + + //Try multiple matching strategies + if (firstLine.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text in first line`); + } else if (trimmedFullText.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text within full text`); + } else { + throw new Error( + `Text validation failed.\nExpected: "${expectedText}"\n` + + `Full text: "${fullText}"\n` + + `First line: "${firstLine}"\n` + ); + } + + } catch (error) { + console.error('Detailed error during validation:', error); + throw error; //Re-throw after logging } - - console.log('Passed: text matched as expected'); - } - }, - - - //Organization label - { - description: 'Validate Organization label', - action: async () => { - const elementText = await driver.findElement(By.css('#divname')).getText(); - const expectedText = 'Ogranization'; - //Trim expected text - if (elementText.trimStart() !== expectedText) { - throw new Error(`Expected: "${expectedText}" label text; Actual: "${elementText}"`); - } - console.log(`Passed: "${expectedText}" label text matched as expected`); - } - }, - - //Name label - { - description: 'Validate Name label', - action: async () => { - const elementText = await driver.findElement(By.css('#divname > .form-label')).getText(); - if (elementText !== 'Name') { - throw new Error(`Expected: "Name" label text; Actual: "${elementText}"`); - } - console.log('Passed: Name label text matched as expected'); } }, @@ -1938,15 +1953,15 @@ const steps = [ } }, - //Asterisk icons + //Asterisk icons is present { description: 'Validate Asterisk icons', - action: async () => { - const elementText = await driver.findElement(By.css('#divcreator')).getText(); - if (elementText !== 'This option also allows access to this framework via CASE compliant API') { - throw new Error(`Expected: "This option also allows access to this framework via CASE compliant API" label text; Actual: "${elementText}"`); + action: async () => + { const expectedIcon = await driver.wait(until.elementLocated(By.css('#divcreator')), 5000).catch(() => false); + if (!expectedIcon) { + throw new Error('Asterisk icon is not present'); } - console.log('Passed: This option also allows access to this framework via CASE compliant API label text matched as expected'); + console.log('Passed: Asterisk icon is present'); } }, @@ -2066,7 +2081,7 @@ const steps = [ if (elementStyle !== 'rgba(48, 200, 172, 1)') { throw new Error(`Publish button color did not match; Actual: "${elementStyle}"`); } - console.log('Passed: SPublish button color matched as expected'); + console.log('Passed: Publish button color matched as expected'); } }, @@ -2978,15 +2993,38 @@ const steps = [ } }, - //Type description + //Type value { - description: 'Validate Type description', + description: 'Validate Type value', action: async () => { - const elementText = await driver.findElement(By.css('#divtype')).getText(); - if (elementText !== 'Framework') { - throw new Error(`Expected: "Framework" type description text; Actual: "${elementText}"`); + try { + const element = await driver.findElement(By.css('#divtype')); + + //Get different versions of the text for debugging + const fullText = await element.getText(); + + //Check for the expected text in different ways + const expectedText = 'Framework'; + const trimmedFullText = fullText.trim(); + const firstLine = trimmedFullText.split('\n')[0].trim(); + + //Try multiple matching strategies + if (firstLine.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text in first line`); + } else if (trimmedFullText.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text within full text`); + } else { + throw new Error( + `Text validation failed.\nExpected: "${expectedText}"\n` + + `Full text: "${fullText}"\n` + + `First line: "${firstLine}"\n` + ); + } + + } catch (error) { + console.error('Detailed error during validation:', error); + throw error; //Re-throw after logging } - console.log('Passed: Framework type description text matched as expected'); } }, @@ -3002,15 +3040,38 @@ const steps = [ } }, - //Name description + //Name value { - description: 'Validate Name description', + description: 'Validate Name value', action: async () => { - const elementText = await driver.findElement(By.css('#divname')).getText(); - if (elementText !== 'Juan Testing Again & Again') { - throw new Error(`Expected: "Juan Testing Again & Again" name description text; Actual: "${elementText}"`); + try { + const element = await driver.findElement(By.css('#divname')); + + //Get different versions of the text for debugging + const fullText = await element.getText(); + + //Check for the expected text in different ways + const expectedText = 'Juan Testing Again & Again'; + const trimmedFullText = fullText.trim(); + const firstLine = trimmedFullText.split('\n')[0].trim(); + + //Try multiple matching strategies + if (firstLine.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text in first line`); + } else if (trimmedFullText.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text within full text`); + } else { + throw new Error( + `Text validation failed.\nExpected: "${expectedText}"\n` + + `Full text: "${fullText}"\n` + + `First line: "${firstLine}"\n` + ); + } + + } catch (error) { + console.error('Detailed error during validation:', error); + throw error; //Re-throw after logging } - console.log('Passed: Juan Testing Again & Again name description text matched as expected'); } }, @@ -3026,15 +3087,15 @@ const steps = [ } }, - //Source URL description + //Source URL value { - description: 'Validate Source URL description', + description: 'Validate Source URL value', action: async () => { const elementText = await driver.findElement(By.linkText('https://www.espn.com')).getText(); if (elementText !== 'https://www.espn.com') { - throw new Error(`Expected: "https://www.espn.com" source URL description text; Actual: "${elementText}"`); + throw new Error(`Expected: "https://www.espn.com" source URL valuen text; Actual: "${elementText}"`); } - console.log('Passed: https://www.espn.com source URL description text matched as expected'); + console.log('Passed: https://www.espn.com source URL value text matched as expected'); } }, @@ -3050,15 +3111,38 @@ const steps = [ } }, - //Parent description + //Parent value { - description: 'Validate Parent description', + description: 'Validate Parent value', action: async () => { - const elementText = await driver.findElement(By.css('.form-row:nth-child(1) > #divparent')).getText(); - if (elementText !== 'Parent') { - throw new Error(`Expected: "Parent" parent description text; Actual: "${elementText}"`); + try { + const element = await driver.findElement(By.css('.form-row:nth-child(1) > #divparent')); + + //Get different versions of the text for debugging + const fullText = await element.getText(); + + //Check for the expected text in different ways + const expectedText = 'Parent'; + const trimmedFullText = fullText.trim(); + const firstLine = trimmedFullText.split('\n')[0].trim(); + + //Try multiple matching strategies + if (firstLine.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text in first line`); + } else if (trimmedFullText.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text within full text`); + } else { + throw new Error( + `Text validation failed.\nExpected: "${expectedText}"\n` + + `Full text: "${fullText}"\n` + + `First line: "${firstLine}"\n` + ); + } + + } catch (error) { + console.error('Detailed error during validation:', error); + throw error; //Re-throw after logging } - console.log('Passed: Parent parent description text matched as expected'); } }, @@ -3074,15 +3158,38 @@ const steps = [ } }, - //Description description + //Description value { - description: 'Validate Description description', + description: 'Validate Description value', action: async () => { - const elementText = await driver.findElement(By.css('#divdescription')).getText(); - if (elementText !== 'Parent') { - throw new Error(`Expected: "1" parent description text; Actual: "${elementText}"`); + try { + const element = await driver.findElement(By.css('#divdescription')); + + //Get different versions of the text for debugging + const fullText = await element.getText(); + + //Check for the expected text in different ways + const expectedText = 'This is my Framework testing description.'; + const trimmedFullText = fullText.trim(); + const firstLine = trimmedFullText.split('\n')[0].trim(); + + //Try multiple matching strategies + if (firstLine.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text in first line`); + } else if (trimmedFullText.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text within full text`); + } else { + throw new Error( + `Text validation failed.\nExpected: "${expectedText}"\n` + + `Full text: "${fullText}"\n` + + `First line: "${firstLine}"\n` + ); + } + + } catch (error) { + console.error('Detailed error during validation:', error); + throw error; //Re-throw after logging } - console.log('Passed: Parent parent description text matched as expected'); } }, @@ -3098,15 +3205,38 @@ const steps = [ } }, - //Creator description + //Creator value { - description: 'Validate Creator description', + description: 'Validate Creator value', action: async () => { - const elementText = await driver.findElement(By.css('#divcreator')).getText(); - if (elementText !== 'Parent') { - throw new Error(`Expected: "2" creator description text; Actual: "${elementText}"`); + try { + const element = await driver.findElement(By.css('#divcreator')); + + //Get different versions of the text for debugging + const fullText = await element.getText(); + + //Check for the expected text in different ways + const expectedText = 'Juancho'; + const trimmedFullText = fullText.trim(); + const firstLine = trimmedFullText.split('\n')[0].trim(); + + //Try multiple matching strategies + if (firstLine.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text in first line`); + } else if (trimmedFullText.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text within full text`); + } else { + throw new Error( + `Text validation failed.\nExpected: "${expectedText}"\n` + + `Full text: "${fullText}"\n` + + `First line: "${firstLine}"\n` + ); + } + + } catch (error) { + console.error('Detailed error during validation:', error); + throw error; //Re-throw after logging } - console.log('Passed: Parent creator description text matched as expected'); } }, @@ -3122,15 +3252,38 @@ const steps = [ } }, - //Publisher description + //Publisher value { - description: 'Validate Publisher description', + description: 'Validate Publisher value', action: async () => { - const elementText = await driver.findElement(By.css('#divpublisher')).getText(); - if (elementText !== 'Parent') { - throw new Error(`Expected: "3" publisher description text; Actual: "${elementText}"`); + try { + const element = await driver.findElement(By.css('#divpublisher')); + + //Get different versions of the text for debugging + const fullText = await element.getText(); + + //Check for the expected text in different ways + const expectedText = 'Publishers Clearing House'; + const trimmedFullText = fullText.trim(); + const firstLine = trimmedFullText.split('\n')[0].trim(); + + //Try multiple matching strategies + if (firstLine.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text in first line`); + } else if (trimmedFullText.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text within full text`); + } else { + throw new Error( + `Text validation failed.\nExpected: "${expectedText}"\n` + + `Full text: "${fullText}"\n` + + `First line: "${firstLine}"\n` + ); + } + + } catch (error) { + console.error('Detailed error during validation:', error); + throw error; //Re-throw after logging } - console.log('Passed: Parent publisher description text matched as expected'); } }, @@ -3146,15 +3299,38 @@ const steps = [ } }, - //Status description + //Status value { - description: 'Validate Status description', + description: 'Validate Status value', action: async () => { - const elementText = await driver.findElement(By.css('#divstatus')).getText(); - if (elementText !== 'Parent') { - throw new Error(`Expected: "4" Status description text; Actual: "${elementText}"`); + try { + const element = await driver.findElement(By.css('#divstatus')); + + //Get different versions of the text for debugging + const fullText = await element.getText(); + + //Check for the expected text in different ways + const expectedText = 'Draft'; + const trimmedFullText = fullText.trim(); + const firstLine = trimmedFullText.split('\n')[0].trim(); + + //Try multiple matching strategies + if (firstLine.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text in first line`); + } else if (trimmedFullText.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text within full text`); + } else { + throw new Error( + `Text validation failed.\nExpected: "${expectedText}"\n` + + `Full text: "${fullText}"\n` + + `First line: "${firstLine}"\n` + ); + } + + } catch (error) { + console.error('Detailed error during validation:', error); + throw error; //Re-throw after logging } - console.log('Passed: Parent Status description text matched as expected'); } }, @@ -3170,15 +3346,38 @@ const steps = [ } }, - //Effective Date description + //Effective Date value { - description: 'Validate Effective Date description', + description: 'Validate Effective Date value', action: async () => { - const elementText = await driver.findElement(By.css('#diveffective')).getText(); - if (elementText !== 'Parent') { - throw new Error(`Expected: "5" effective date description text; Actual: "${elementText}"`); + try { + const element = await driver.findElement(By.css('#diveffective')); + + //Get different versions of the text for debugging + const fullText = await element.getText(); + + //Check for the expected text in different ways + const expectedText = '12/02/2022'; + const trimmedFullText = fullText.trim(); + const firstLine = trimmedFullText.split('\n')[0].trim(); + + //Try multiple matching strategies + if (firstLine.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text in first line`); + } else if (trimmedFullText.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text within full text`); + } else { + throw new Error( + `Text validation failed.\nExpected: "${expectedText}"\n` + + `Full text: "${fullText}"\n` + + `First line: "${firstLine}"\n` + ); + } + + } catch (error) { + console.error('Detailed error during validation:', error); + throw error; //Re-throw after logging } - console.log('Passed: Parent effective date description text matched as expected'); } }, @@ -3194,15 +3393,38 @@ const steps = [ } }, - //Language description + //Language value { - description: 'Validate Language description', + description: 'Validate Language value', action: async () => { - const elementText = await driver.findElement(By.css('#divlang')).getText(); - if (elementText !== 'Parent') { - throw new Error(`Expected: "5" language description text; Actual: "${elementText}"`); + try { + const element = await driver.findElement(By.css('#divlang')); + + //Get different versions of the text for debugging + const fullText = await element.getText(); + + //Check for the expected text in different ways + const expectedText = 'English'; + const trimmedFullText = fullText.trim(); + const firstLine = trimmedFullText.split('\n')[0].trim(); + + //Try multiple matching strategies + if (firstLine.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text in first line`); + } else if (trimmedFullText.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text within full text`); + } else { + throw new Error( + `Text validation failed.\nExpected: "${expectedText}"\n` + + `Full text: "${fullText}"\n` + + `First line: "${firstLine}"\n` + ); + } + + } catch (error) { + console.error('Detailed error during validation:', error); + throw error; //Re-throw after logging } - console.log('Passed: Parent language description text matched as expected'); } }, @@ -3214,19 +3436,42 @@ const steps = [ if (elementText !== 'Version') { throw new Error(`Expected: "Version" label; Actual: "${elementText}"`); } - console.log('Passed:Version label matched as expected'); + console.log('Passed: Version label matched as expected'); } }, - //Version description + //Version value { - description: 'Validate Version description', + description: 'Validate Version value', action: async () => { - const elementText = await driver.findElement(By.css('#divversion')).getText(); - if (elementText !== 'Parent') { - throw new Error(`Expected: "6" version description text; Actual: "${elementText}"`); + try { + const element = await driver.findElement(By.css('#divversion')); + + //Get different versions of the text for debugging + const fullText = await element.getText(); + + //Check for the expected text in different ways + const expectedText = '2022.1.1'; + const trimmedFullText = fullText.trim(); + const firstLine = trimmedFullText.split('\n')[0].trim(); + + //Try multiple matching strategies + if (firstLine.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text in first line`); + } else if (trimmedFullText.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text within full text`); + } else { + throw new Error( + `Text validation failed.\nExpected: "${expectedText}"\n` + + `Full text: "${fullText}"\n` + + `First line: "${firstLine}"\n` + ); + } + + } catch (error) { + console.error('Detailed error during validation:', error); + throw error; //Re-throw after logging } - console.log('Passed: Parent version description text matched as expected'); } }, @@ -3242,15 +3487,38 @@ const steps = [ } }, - //Notes description + //Notes value { - description: 'Validate Notes description', + description: 'Validate Notes value', action: async () => { - const elementText = await driver.findElement(By.css('#divnotes')).getText(); - if (elementText !== 'Parent') { - throw new Error(`Expected: "6" notes description text; Actual: "${elementText}"`); + try { + const element = await driver.findElement(By.css('#divnotes')); + + //Get different versions of the text for debugging + const fullText = await element.getText(); + + //Check for the expected text in different ways + const expectedText = 'This only contains Kindergarten for now.'; + const trimmedFullText = fullText.trim(); + const firstLine = trimmedFullText.split('\n')[0].trim(); + + //Try multiple matching strategies + if (firstLine.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text in first line`); + } else if (trimmedFullText.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text within full text`); + } else { + throw new Error( + `Text validation failed.\nExpected: "${expectedText}"\n` + + `Full text: "${fullText}"\n` + + `First line: "${firstLine}"\n` + ); + } + + } catch (error) { + console.error('Detailed error during validation:', error); + throw error; //Re-throw after logging } - console.log('Passed: Parent notes description text matched as expected'); } }, @@ -3266,15 +3534,38 @@ const steps = [ } }, - //Created description + //Created value { - description: 'Validate Created description', + description: 'Validate Created value', action: async () => { - const elementText = await driver.findElement(By.css('.form-row:nth-child(4) > #divsource')).getText(); - if (elementText !== 'Parent') { - throw new Error(`Expected: "7" created description text; Actual: "${elementText}"`); + try { + const element = await driver.findElement(By.css('.form-row:nth-child(4) > #divsource')); + + //Get different versions of the text for debugging + const fullText = await element.getText(); + + //Check for the expected text in different ways + const expectedText = 'Wed, 23 Nov 2022 21:05:03 -0800'; + const trimmedFullText = fullText.trim(); + const firstLine = trimmedFullText.split('\n')[0].trim(); + + //Try multiple matching strategies + if (firstLine.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text in first line`); + } else if (trimmedFullText.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text within full text`); + } else { + throw new Error( + `Text validation failed.\nExpected: "${expectedText}"\n` + + `Full text: "${fullText}"\n` + + `First line: "${firstLine}"\n` + ); + } + + } catch (error) { + console.error('Detailed error during validation:', error); + throw error; //Re-throw after logging } - console.log('Passed: Parent created description text matched as expected'); } }, @@ -3290,15 +3581,38 @@ const steps = [ } }, - //Last Modified description + //Last Modified value { - description: 'Validate Last Modified description', + description: 'Validate Last Modified value', action: async () => { - const elementText = await driver.findElement(By.css('.form-row:nth-child(4) > #divparent')).getText(); - if (elementText !== 'Parent') { - throw new Error(`Expected: "8" last modified description text; Actual: "${elementText}"`); + try { + const element = await driver.findElement(By.css('.form-row:nth-child(4) > #divparent')); + + //Get different versions of the text for debugging + const fullText = await element.getText(); + + //Check for the expected text in different ways + const expectedText = 'Wed, 26 Feb 2025 15:50:11 -0800'; + const trimmedFullText = fullText.trim(); + const firstLine = trimmedFullText.split('\n')[1].trim(); + + //Try multiple matching strategies + if (firstLine.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text in first line`); + } else if (trimmedFullText.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text within full text`); + } else { + throw new Error( + `Text validation failed.\nExpected: "${expectedText}"\n` + + `Full text: "${fullText}"\n` + + `First line: "${firstLine}"\n` + ); + } + + } catch (error) { + console.error('Detailed error during validation:', error); + throw error; //Re-throw after logging } - console.log('Passed: Parent last modified description text matched as expected'); } }, @@ -3377,11 +3691,34 @@ const steps = [ { description: 'Validate Type value text', action: async () => { - const elementText = await driver.findElement(By.css('#divtype')).getText(); - if (elementText !== 'Framework') { - throw new Error(`Expected: "Framework" Type value text; Actual: "${elementText}"`); + try { + const element = await driver.findElement(By.css('#divtype')); + + //Get different versions of the text for debugging + const fullText = await element.getText(); + + //Check for the expected text in different ways + const expectedText = 'Framework'; + const trimmedFullText = fullText.trim(); + const firstLine = trimmedFullText.split('\n')[0].trim(); + + //Try multiple matching strategies + if (firstLine.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text in first line`); + } else if (trimmedFullText.includes(expectedText)) { + console.log(`Passed: "${expectedText}" text within full text`); + } else { + throw new Error( + `Text validation failed.\nExpected: "${expectedText}"\n` + + `Full text: "${fullText}"\n` + + `First line: "${firstLine}"\n` + ); + } + + } catch (error) { + console.error('Detailed error during validation:', error); + throw error; //Re-throw after logging } - console.log('Passed: "Framework" Type value text matched as expected'); } }, @@ -3869,7 +4206,7 @@ try { //Check if log out was successful const loginButton = await driver.wait(until.elementLocated(By.css('.login')), 5000).catch(() => false); - if (loginButton & allStepsPassed) { + if (loginButton && allStepsPassed) { console.log('PASSED: Framework Management Page(ExACT_frameworkManagementPage); All test steps completed successfully'); testStatus = 'Passed'; } else {