From e9147c67f405e96480bc9769904ed3c4f6d76499 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Grand?= <francois.grand@inrae.fr>
Date: Mon, 22 May 2023 15:05:30 +0200
Subject: [PATCH] fix(e2e): warnings during tests execution (stale element,
 element click intercepted)

refs #620
---
 e2e/calculate-linked-params.e2e-spec.ts       |  4 +++-
 e2e/calculator.po.ts                          |  9 +++++++++
 e2e/compute-reset-chained-links.e2e-spec.ts   |  4 +---
 e2e/cote-amont-aval-bief.e2e-spec.ts          |  6 ++++--
 e2e/duplicate-results.e2e-spec.ts             |  1 -
 e2e/linked-parameter-section-type.e2e-spec.ts |  3 ++-
 e2e/load-save-session.e2e-spec.ts             |  7 +++----
 e2e/preferences.po.ts                         |  2 +-
 e2e/solveur.e2e-spec.ts                       |  3 ++-
 e2e/translation.e2e-spec.ts                   | 14 ++++++++------
 e2e/util.po.ts                                |  1 +
 e2e/valeurs-erronees.e2e-spec.ts              |  3 ++-
 12 files changed, 36 insertions(+), 21 deletions(-)

diff --git a/e2e/calculate-linked-params.e2e-spec.ts b/e2e/calculate-linked-params.e2e-spec.ts
index 5a5306f41..38f708386 100644
--- a/e2e/calculate-linked-params.e2e-spec.ts
+++ b/e2e/calculate-linked-params.e2e-spec.ts
@@ -308,7 +308,7 @@ describe("ngHyd − calculate with linked parameters", () => {
         await openCalculator(12, navBar, listPage);
 
         //  upstream water level should not have link mode (only one calculator)
-        const Z1_1 = await calcPage.getInputById("Z1");
+        let Z1_1 = await calcPage.getInputById("Z1");
         expect(await calcPage.inputHasLinkModeButton(Z1_1)).toBe(false);
 
         // create 2nd PAB-Chute
@@ -319,6 +319,7 @@ describe("ngHyd − calculate with linked parameters", () => {
         await browser.pause(200);
 
         //  upstream water level should have link mode (now there are 2 calculators)
+        Z1_1 = await calcPage.getInputById("Z1"); // re-request input to avoid "Request encountered a stale element - terminating request" warning (due to tab change)
         expect(await calcPage.inputHasLinkModeButton(Z1_1)).toBe(true);
 
         // back to 2nd calculator
@@ -334,6 +335,7 @@ describe("ngHyd − calculate with linked parameters", () => {
         await browser.pause(200);
 
         //  upstream water level should not have link mode (already a link target)
+        Z1_1 = await calcPage.getInputById("Z1"); // re-request input to avoid "Request encountered a stale element - terminating request" warning (due to tab change)
         expect(await calcPage.inputHasLinkModeButton(Z1_1)).toBe(false);
     });
 });
diff --git a/e2e/calculator.po.ts b/e2e/calculator.po.ts
index ee185aaa7..bf82481cb 100644
--- a/e2e/calculator.po.ts
+++ b/e2e/calculator.po.ts
@@ -35,6 +35,14 @@ export class CalculatorPage {
         return $$("mat-select[id^=select_]"); // all mat-select with id starting with "select_"
     }
 
+    /**
+     * return select count which id is in the form "select_*"
+     */
+    async getCalculatorSelectCount() {
+        const sels = await $$("mat-select[id^=select_]"); // all mat-select with id starting with "select_"
+        return sels.length;
+    }
+
     /**
      * get the option count of a select
      */
@@ -201,6 +209,7 @@ export class CalculatorPage {
      */
     async getInputRadioButton(input, mode: string) {
         const tag = await input.getTagName();
+        await browser.pause(100);
         const root = tag === "input" ? await this.findParentContainer(input) : input;
         return await root.$(`mat-button-toggle.radio_${mode}`);
     }
diff --git a/e2e/compute-reset-chained-links.e2e-spec.ts b/e2e/compute-reset-chained-links.e2e-spec.ts
index e0577d246..89ef7a886 100644
--- a/e2e/compute-reset-chained-links.e2e-spec.ts
+++ b/e2e/compute-reset-chained-links.e2e-spec.ts
@@ -123,9 +123,7 @@ describe("ngHyd − compute then reset chained results − ", () => {
         await newSession(navBar, sidenav);
 
         // disable evil option "empty fields on module creation"
-        await prefPage.navigateTo();
-        await prefPage.disableEvilEmptyFields();
-        await browser.pause(200);
+        await prefPage.setEmptyFields(false);
 
         // start page
         await navBar.clickNewCalculatorButton();
diff --git a/e2e/cote-amont-aval-bief.e2e-spec.ts b/e2e/cote-amont-aval-bief.e2e-spec.ts
index a4788ee9b..e001fbcb0 100644
--- a/e2e/cote-amont-aval-bief.e2e-spec.ts
+++ b/e2e/cote-amont-aval-bief.e2e-spec.ts
@@ -40,7 +40,7 @@ describe("ngHyd − up/downstream elevations of a reach", () => {
         await flowCalcBtn.click();
 
         // check details buttons are disabled
-        const upDetailsBtn = await $("#generate-sp-aval");
+        let upDetailsBtn = await $("#generate-sp-aval");
         expect(await upDetailsBtn.isEnabled()).toBe(false);
         const downDetailsBtn = await $("#generate-sp-amont");
         expect(await downDetailsBtn.isEnabled()).toBe(false);
@@ -69,6 +69,7 @@ describe("ngHyd − up/downstream elevations of a reach", () => {
 
         // click downstream hydraulic details button
         await navBar.openNthCalculator(0);
+        upDetailsBtn = await $("#generate-sp-aval"); // re-request element to avoid "Request encountered a stale element - terminating request" warning (due to tab change)
         await upDetailsBtn.click();
         await browser.pause(500);
 
@@ -84,7 +85,7 @@ describe("ngHyd − up/downstream elevations of a reach", () => {
         await openCalculator(21, navBar, listPage);
 
         // check details buttons status
-        const upDetailsBtn = await $("#generate-sp-aval");
+        let upDetailsBtn = await $("#generate-sp-aval");
         expect(await upDetailsBtn.isEnabled()).toBe(true);
         const downDetailsBtn = await $("#generate-sp-amont");
         expect(await downDetailsBtn.isEnabled()).toBe(false);
@@ -108,6 +109,7 @@ describe("ngHyd − up/downstream elevations of a reach", () => {
 
         // click downstream hydraulic details button
         await navBar.openNthCalculator(0);
+        upDetailsBtn = await $("#generate-sp-aval"); // re-request element to avoid "Request encountered a stale element - terminating request" warning (due to tab change)
         await upDetailsBtn.click();
         await browser.pause(500);
 
diff --git a/e2e/duplicate-results.e2e-spec.ts b/e2e/duplicate-results.e2e-spec.ts
index f9f58b730..b567a2144 100644
--- a/e2e/duplicate-results.e2e-spec.ts
+++ b/e2e/duplicate-results.e2e-spec.ts
@@ -38,7 +38,6 @@ describe("ngHyd − check that results are not duplicated", () => {
         // check result count
         const fixRows = await calcPage.getAllFixedResultsRows();
         const nbRows = fixRows.length;
-        console.log(nbRows);
         expect(nbRows).toBe(24); // boundaries are included
     });
 });
diff --git a/e2e/linked-parameter-section-type.e2e-spec.ts b/e2e/linked-parameter-section-type.e2e-spec.ts
index 538aea3b4..c6a63f70f 100644
--- a/e2e/linked-parameter-section-type.e2e-spec.ts
+++ b/e2e/linked-parameter-section-type.e2e-spec.ts
@@ -35,13 +35,14 @@ describe("linked parameter in calculator with section - ", () => {
         await openCalculator(2, navBar, listPage);
 
         // set Q parameter to linked mode
-        const inputQ = await calcPage.getInputById("Q");
+        let inputQ = await calcPage.getInputById("Q");
         await calcPage.setParamMode(inputQ, "link");
 
         // change section type
         await changeSelectValue(await calcPage.getSelectById("select_section"), 3); // mode "parabolique"
 
         // check Q is still in linked mode
+        inputQ = await calcPage.getInputById("Q"); // re-request input to avoid "Request encountered a stale element - terminating request" warning
         expect(await calcPage.inputIsInLinkedMode(inputQ)).toBe(true);
     });
 });
diff --git a/e2e/load-save-session.e2e-spec.ts b/e2e/load-save-session.e2e-spec.ts
index 23765fbec..29c1cc67a 100644
--- a/e2e/load-save-session.e2e-spec.ts
+++ b/e2e/load-save-session.e2e-spec.ts
@@ -150,10 +150,9 @@ describe("ngHyd − save and load sessions", () => {
                 await openCalculator(ct, navBar, listPage);
 
                 // detect selects
-                let selects = await calcPage.getAllCalculatorSelects();
-                const nsel = selects.length;
+                const nsel = await calcPage.getCalculatorSelectCount();
                 for (let s = 0; s < nsel; s++) {
-                    const sel = selects[s];
+                    const sel = await calcPage.getAllCalculatorSelects()[s];
                     const selId = await sel.getAttribute("id");
 
                     const options = await calcPage.getMatselectOptionsText(sel);
@@ -199,7 +198,7 @@ describe("ngHyd − save and load sessions", () => {
                         deleteDownloadedFile(filename);
 
                         // get selects once again since page has been replaced (session load)
-                        selects = await calcPage.getAllCalculatorSelects();
+                        const selects = await calcPage.getAllCalculatorSelects();
 
                         // restore select previous option, other selects presence may depend on it (eg. pressure loss calculator)
                         await changeSelectValue(selects[s], ind);
diff --git a/e2e/preferences.po.ts b/e2e/preferences.po.ts
index 57f921dd1..91d98abcc 100644
--- a/e2e/preferences.po.ts
+++ b/e2e/preferences.po.ts
@@ -69,7 +69,7 @@ export class PreferencesPage {
      */
     async setEmptyFields(b: boolean) {
         await this.navigateTo();
-        await browser.pause(200);
+        await browser.pause(1000); // 1000 is necessary to avoid "element click intercepted" warning
 
         if (b) {
             await this.enableEvilEmptyFields();
diff --git a/e2e/solveur.e2e-spec.ts b/e2e/solveur.e2e-spec.ts
index 6bacf6639..b4e37f820 100644
--- a/e2e/solveur.e2e-spec.ts
+++ b/e2e/solveur.e2e-spec.ts
@@ -49,7 +49,7 @@ describe("Solveur - ", () => {
         const ntcV = await calcPage.getSelectValueText(ntc);
         expect(ntcV).toContain("PAB : puissance / Puissance dissipée (PV)");
         // check targetted result
-        const ntt = await calcPage.getSelectById("select_target_result");
+        let ntt = await calcPage.getSelectById("select_target_result");
         const nttV = await calcPage.getSelectValueText(ntt);
         expect(nttV).toContain("Puissance dissipée (PV)");
         // check searched Parameter
@@ -69,6 +69,7 @@ describe("Solveur - ", () => {
 
         // change targetted Nub, check that targetted result changes too
         await changeSelectValue(ntc, 0);
+        ntt = await calcPage.getSelectById("select_target_result"); // re-request element to avoid "Request encountered a stale element - terminating request" warning (probably due to select change)
         const nttV2 = await calcPage.getSelectValueText(ntt);
         expect(nttV2).not.toContain("Puissance dissipée (PV)");
     });
diff --git a/e2e/translation.e2e-spec.ts b/e2e/translation.e2e-spec.ts
index dffdf4997..16c41d2d4 100644
--- a/e2e/translation.e2e-spec.ts
+++ b/e2e/translation.e2e-spec.ts
@@ -11,14 +11,12 @@ describe("Check translation", () => {
     let navBar: Navbar;
     let calcPage: CalculatorPage;
     let prefPage: PreferencesPage;
-    let sideNav: SideNav;
 
     beforeAll(() => {
         listPage = new ListPage();
         navBar = new Navbar();
         calcPage = new CalculatorPage();
         prefPage = new PreferencesPage();
-        sideNav = new SideNav();
     });
 
     beforeEach(async () => {
@@ -43,21 +41,21 @@ describe("Check translation", () => {
         await browser.pause(500);
 
         // "variable for X axis" select label
-        const selXaxis = await calcPage.getSelectById("selectX");
+        let selXaxis = await calcPage.getSelectById("selectX");
         expect(await calcPage.getMatselectCurrentOptionText(selXaxis)).toEqual("Cote aval");
 
         // "variable for Y axis" select label
-        const selYaxis = await calcPage.getSelectById("selectY");
+        let selYaxis = await calcPage.getSelectById("selectY");
         expect(await calcPage.getMatselectCurrentOptionText(selYaxis)).toEqual("DH : Chute (m)");
 
         // fixed results variables
-        const frr = await calcPage.getAllFixedResultsRows();
+        let frr = await calcPage.getAllFixedResultsRows();
         let row0 = frr[0];
         let lbl1 = await row0.$("td").getText();
         expect(lbl1).toEqual("Cote amont (m)");
 
         // variated results headers
-        const vrh = await calcPage.getAllVariatedResultsTableHeaders();
+        let vrh = await calcPage.getAllVariatedResultsTableHeaders();
         let lbl2 = await vrh[0].getText();
         expect(lbl2).toEqual("Cote aval");
         let lbl3 = await vrh[1].getText();
@@ -75,17 +73,21 @@ describe("Check translation", () => {
         await browser.pause(200);
 
         // "variable for X axis" select label
+        selXaxis = await calcPage.getSelectById("selectX");   // re-request element to avoid "Request encountered a stale element - terminating request" warning (due tab change)
         expect(await calcPage.getMatselectCurrentOptionText(selXaxis)).toEqual("Downstream elevation");
 
         // "variable for Y axis" select label
+        selYaxis = await calcPage.getSelectById("selectY");   // avoid "Request encountered a stale element - terminating request" warning (due tab change)
         expect(await calcPage.getMatselectCurrentOptionText(selYaxis)).toEqual("DH : Fall (m)");
 
         // fixed results variables
+        frr = await calcPage.getAllFixedResultsRows();  // re-request element to avoid "Request encountered a stale element - terminating request" warning (due to pref modifcation -> page update)
         row0 = frr[0];
         lbl1 = await row0.$("td").getText();
         expect(lbl1).toEqual("Upstream elevation (m)");
 
         // variated results headers
+        vrh = await calcPage.getAllVariatedResultsTableHeaders(); // re-request element to avoid "Request encountered a stale element - terminating request" warning (due to pref modifcation -> page update)
         lbl2 = await vrh[0].getText();
         expect(lbl2).toEqual("Downstream elevation");
         lbl3 = await vrh[1].getText();
diff --git a/e2e/util.po.ts b/e2e/util.po.ts
index f9db46269..d0c59aa91 100644
--- a/e2e/util.po.ts
+++ b/e2e/util.po.ts
@@ -85,6 +85,7 @@ export async function openApplication(startPage: AppPage) {
 
 export async function openCalculator(id: number, navBar: Navbar, listPage: ListPage) {
     const ncButton = await navBar.getNewCalculatorButton();
+    await browser.pause(100); // avoid "webdriver: Request encountered a stale element - terminating request" warning
     if (await ncButton.isExisting()) {
         await scrollToElement(ncButton);
         if (await ncButton.isDisplayed()) {
diff --git a/e2e/valeurs-erronees.e2e-spec.ts b/e2e/valeurs-erronees.e2e-spec.ts
index a332dced9..46281237e 100644
--- a/e2e/valeurs-erronees.e2e-spec.ts
+++ b/e2e/valeurs-erronees.e2e-spec.ts
@@ -31,7 +31,7 @@ describe("ngHyd - check invalid values are removed - ", () => {
         await openCalculator(5, navBar, listPage);
 
         // modify W input with invalid value
-        const inputW = await calcPage.getInputById("W");
+        let inputW = await calcPage.getInputById("W");
         await inputW.setValue("-1");
 
         // open another calculator
@@ -42,6 +42,7 @@ describe("ngHyd - check invalid values are removed - ", () => {
         await browser.pause(200);
 
         // check invalid value is removed
+        inputW = await calcPage.getInputById("W"); // re-request element to avoid "Request encountered a stale element - terminating request" warning (due tab change)
         const w = await inputW.getValue();
         expect(w).toEqual("");
 
-- 
GitLab