diff --git a/e2e/app.po.ts b/e2e/app.po.ts
index 494a18afda40ef99f8b55a3e8bb03f22fa5a7367..8e2605b744729eae248a6994e30e7cf572a0e3cd 100644
--- a/e2e/app.po.ts
+++ b/e2e/app.po.ts
@@ -1,3 +1,5 @@
+import { browser } from '@wdio/globals'
+
 export class AppPage {
     navigateTo() {
         return browser.url("/");
diff --git a/e2e/bief-empty-fields.e2e-spec.ts b/e2e/bief-empty-fields.e2e-spec.ts
index a828ffc0bfe22393b694ead22e03c28823a5c401..1ad63832e6a89ae56babd8cb9a4110f4ad0f3cbf 100644
--- a/e2e/bief-empty-fields.e2e-spec.ts
+++ b/e2e/bief-empty-fields.e2e-spec.ts
@@ -3,6 +3,7 @@ import { Navbar } from "./navbar.po";
 import { CalculatorPage } from "./calculator.po";
 import { PreferencesPage } from "./preferences.po";
 import { browser, $, $$, expect } from '@wdio/globals'
+import { openCalculator } from "./util.po";
 
 describe("Check fields are empty in 'up/downstream elevations of a reach' calculator when created with 'empty fields' option", () => {
     let listPage: ListPage;
@@ -26,9 +27,7 @@ describe("Check fields are empty in 'up/downstream elevations of a reach' calcul
 
     it("", async () => {
         // open "up/downstream elevations of a reach" calculator
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(21);
-        await browser.pause(200);
+        await openCalculator(21, navBar, listPage);
 
         await calcPage.checkEmptyOrFilledFields(["LargeurBerge", "Ks", "Long", "YB", "ZF1", "ZF2", "Q", "Z1", "Z2", "Dx"],
             [true, true, true, true, true, true, true, true, true, true])
diff --git a/e2e/calculate-button-validation.e2e-spec.ts b/e2e/calculate-button-validation.e2e-spec.ts
index 537b49f304d07949ccfba93a4d6173007805dac9..4ba0b00b2a95d9544607e2ea93b99dbc983550a0 100644
--- a/e2e/calculate-button-validation.e2e-spec.ts
+++ b/e2e/calculate-button-validation.e2e-spec.ts
@@ -3,6 +3,7 @@ import { CalculatorPage } from "./calculator.po";
 import { Navbar } from "./navbar.po";
 import { PreferencesPage } from "./preferences.po";
 import { browser, $, $$, expect } from '@wdio/globals'
+import { openCalculator } from "./util.po";
 
 describe("Calculate button - ", () => {
     let listPage: ListPage;
@@ -25,21 +26,11 @@ describe("Calculate button - ", () => {
     });
 
     it("check button status only depends on calculator (no link between calculators)", async () => {
-        // start page
-        await navBar.clickNewCalculatorButton();
-        await browser.pause(200);
-
         // open PAB: chute calculator
-        await listPage.clickMenuEntryForCalcType(12);
-        await browser.pause(200);
-
-        // start page
-        await navBar.clickNewCalculatorButton();
-        await browser.pause(200);
+        await openCalculator(12, navBar, listPage);
 
         // open PAB: dimensions
-        await listPage.clickMenuEntryForCalcType(5);
-        await browser.pause(200);
+        await openCalculator(5, navBar, listPage);
 
         // fill width field with invalid data
         const inputW = await calcPage.getInputById("W");
@@ -68,13 +59,8 @@ describe("Calculate button - ", () => {
 
     describe("check button status in prébarrages - ", () => {
         it("invalid data in Q input", async () => {
-            // start page
-            await navBar.clickNewCalculatorButton();
-            await browser.pause(200);
-
             // open prébarrages calculator
-            await listPage.clickMenuEntryForCalcType(30);
-            await browser.pause(200);
+            await openCalculator(30, navBar, listPage);
 
             // Q input
             const inputQ = await $("#Q");
@@ -94,13 +80,8 @@ describe("Calculate button - ", () => {
         });
 
         it("add basin, invalid data in Q input", async () => {
-            // start page
-            await navBar.clickNewCalculatorButton();
-            await browser.pause(200);
-
             // open prébarrages calculator
-            await listPage.clickMenuEntryForCalcType(30);
-            await browser.pause(200);
+            await openCalculator(30, navBar, listPage);
 
             // "add basin" button
             const addBasinBtn = await $("#add-basin");
@@ -141,9 +122,7 @@ describe("Calculate button - ", () => {
 
     async function checkCalculateButtonValidity(calcType: number) {
         // open calculator
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(calcType);
-        await browser.pause(200);
+        await openCalculator(calcType, navBar, listPage);
 
         // for each input, set empty and check calculate button is not active
 
diff --git a/e2e/calculate-linked-params.e2e-spec.ts b/e2e/calculate-linked-params.e2e-spec.ts
index 2f998ebd45153f719b7eeee0743bdebb1817640f..38f708386ec04ddbf24786ea8478766a63841fa5 100644
--- a/e2e/calculate-linked-params.e2e-spec.ts
+++ b/e2e/calculate-linked-params.e2e-spec.ts
@@ -3,7 +3,7 @@ import { CalculatorPage } from "./calculator.po";
 import { Navbar } from "./navbar.po";
 import { SideNav } from "./sidenav.po";
 import { PreferencesPage } from "./preferences.po";
-import { changeSelectValue, loadSession, newSession } from "./util.po";
+import { changeSelectValue, loadSession, newSession, openCalculator } from "./util.po";
 import { browser, $, $$, expect } from '@wdio/globals'
 
 /**
@@ -59,12 +59,11 @@ describe("ngHyd − calculate with linked parameters", () => {
 
     it(" − direct links : parameter linked to a single parameter", async () => {
         // create a Régime uniforme
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(3);
+        await openCalculator(3, navBar, listPage);
 
         // create a PAB : dimensions
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(5);
+        await openCalculator(5, navBar, listPage);
+
         // link Y to Y (R uniforme)
         const Y = await calcPage.getInputById("Y");
         await calcPage.setParamMode(Y, "link");
@@ -76,12 +75,11 @@ describe("ngHyd − calculate with linked parameters", () => {
 
     it(" − direct links : parameter linked to a single parameter, plus local variated parameter", async () => {
         // create a Régime uniforme
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(3);
+        await openCalculator(3, navBar, listPage);
 
         // create a PAB : dimensions
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(5);
+        await openCalculator(5, navBar, listPage);
+
         // link Y to Y (R uniforme)
         const Y = await calcPage.getInputById("Y");
         await calcPage.setParamMode(Y, "link");
@@ -96,15 +94,15 @@ describe("ngHyd − calculate with linked parameters", () => {
 
     it(" − direct links : parameter linked to a variated parameter", async () => {
         // create a Régime uniforme
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(3);
+        await openCalculator(3, navBar, listPage);
+
         // vary Y
         const Y1 = await calcPage.getInputById("Y");
         await calcPage.setParamMode(Y1, "var");
 
         // create a PAB : dimensions
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(5);
+        await openCalculator(5, navBar, listPage);
+
         // link Y to Y (R uniforme)
         const Y2 = await calcPage.getInputById("Y");
         await calcPage.setParamMode(Y2, "link");
@@ -116,15 +114,15 @@ describe("ngHyd − calculate with linked parameters", () => {
 
     it(" − direct links : parameter linked to a single result", async () => {
         // create a Régime uniforme
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(3);
+        await openCalculator(3, navBar, listPage);
+
         // calculate Y
         const Y1 = await calcPage.getInputById("Y");
         await calcPage.setParamMode(Y1, "cal");
 
         // create a PAB : dimensions
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(5);
+        await openCalculator(5, navBar, listPage);
+
         // link Y to Y (R uniforme)
         const Y2 = await calcPage.getInputById("Y");
         await calcPage.setParamMode(Y2, "link");
@@ -136,15 +134,15 @@ describe("ngHyd − calculate with linked parameters", () => {
 
     it(" − direct links : parameter linked to a single result, plus local variated parameter", async () => {
         // create a Régime uniforme
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(3);
+        await openCalculator(3, navBar, listPage);
+
         // calculate Y
         const Y1 = await calcPage.getInputById("Y");
         await calcPage.setParamMode(Y1, "cal");
 
         // create a PAB : dimensions
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(5);
+        await openCalculator(5, navBar, listPage);
+
         // link Y to Y (R uniforme)
         const Y2 = await calcPage.getInputById("Y");
         await calcPage.setParamMode(Y2, "link");
@@ -159,8 +157,8 @@ describe("ngHyd − calculate with linked parameters", () => {
 
     it(" − direct links : parameter linked to a variated result", async () => {
         // create a Régime uniforme
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(3);
+        await openCalculator(3, navBar, listPage);
+
         // vary Q
         const Q = await calcPage.getInputById("Q");
         await calcPage.setParamMode(Q, "var");
@@ -169,8 +167,8 @@ describe("ngHyd − calculate with linked parameters", () => {
         await calcPage.setParamMode(Y1, "cal");
 
         // create a PAB : dimensions
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(5);
+        await openCalculator(5, navBar, listPage);
+
         // link Y to Y (R uniforme)
         const Y2 = await calcPage.getInputById("Y");
         await calcPage.setParamMode(Y2, "link");
@@ -182,12 +180,11 @@ describe("ngHyd − calculate with linked parameters", () => {
 
     it(" − direct links : parameter linked to a single extra result", async () => {
         // create a Régime uniforme
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(3);
+        await openCalculator(3, navBar, listPage);
 
         // create a Jet
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(18);
+        await openCalculator(18, navBar, listPage);
+
         // link V0 to V (Régime uniforme)
         const V0 = await calcPage.getInputById("V0");
         await calcPage.setParamMode(V0, "link");
@@ -197,12 +194,11 @@ describe("ngHyd − calculate with linked parameters", () => {
 
     it(" − direct links : parameter linked to a single extra result, plus local variated parameter", async () => {
         // create a Régime uniforme
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(3);
+        await openCalculator(3, navBar, listPage);
 
         // create a Jet
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(18);
+        await openCalculator(18, navBar, listPage);
+
         // link V0 to V (Régime uniforme)
         const V0 = await calcPage.getInputById("V0");
         await calcPage.setParamMode(V0, "link");
@@ -215,15 +211,15 @@ describe("ngHyd − calculate with linked parameters", () => {
 
     it(" − direct links : parameter linked to a variated extra result", async () => {
         // create a Régime uniforme
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(3);
+        await openCalculator(3, navBar, listPage);
+
         // vary LargeurBerge
         const LargeurBerge = await calcPage.getInputById("LargeurBerge");
         await calcPage.setParamMode(LargeurBerge, "var");
 
         // create a Jet
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(18);
+        await openCalculator(18, navBar, listPage);
+
         // link V0 to V (Régime uniforme)
         const V0 = await calcPage.getInputById("V0");
         await calcPage.setParamMode(V0, "link");
@@ -309,26 +305,21 @@ describe("ngHyd − calculate with linked parameters", () => {
 
     it(" − a link target parameter should not be able to link to another parameter", async () => {
         // create 1st PAB-Chute
-        await navBar.clickNewCalculatorButton();
-        await browser.pause(200);
-        await listPage.clickMenuEntryForCalcType(12);
-        await browser.pause(200);
+        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
-        await navBar.clickNewCalculatorButton();
-        await browser.pause(200);
-        await listPage.clickMenuEntryForCalcType(12);
-        await browser.pause(200);
+        await openCalculator(12, navBar, listPage);
 
         // back to 1st calculator
         await navBar.clickCalculatorTab(0);
         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
@@ -344,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 ee185aaa7edf94f01e03acb3fcbfe63d09108acc..bf82481cbe80b61d60a73cce4869fbd023f35216 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/check-translations.e2e-spec.ts b/e2e/check-translations.e2e-spec.ts
index 97f01714a72cd2ba261eac52a2190d5a05925c27..7921b6116c8ebe3cb81a83b24765c7454ab4266d 100644
--- a/e2e/check-translations.e2e-spec.ts
+++ b/e2e/check-translations.e2e-spec.ts
@@ -5,6 +5,7 @@ import { PreferencesPage } from "./preferences.po";
 import { SideNav } from "./sidenav.po";
 import { testedCalcTypes } from "./tested_calctypes";
 import { browser, $, $$, expect } from '@wdio/globals'
+import { openCalculator } from "./util.po";
 
 /**
  * For all calculators, try to calculate every parameter: check that only one parameter
@@ -63,7 +64,7 @@ describe("ngHyd − check translation of all calculators", () => {
                 for (const ct of calcTypes) {
                     it(" − check translations of calculator type [" + ct + "]", async () => {
                         // click calculator button (instanciate)
-                        await listPage.clickMenuEntryForCalcType(ct);
+                        await openCalculator(ct, navBar, listPage);
 
                         // just click the "compute" button with default values
                         // check that "compute" button is active
diff --git a/e2e/cloisons.e2e-spec.ts b/e2e/cloisons.e2e-spec.ts
index b134960bfd240b05afadedcf7d3c30652146adbc..948a8103f88e3e5206bb9cdf2ae0c1206ba2d094 100644
--- a/e2e/cloisons.e2e-spec.ts
+++ b/e2e/cloisons.e2e-spec.ts
@@ -2,7 +2,7 @@ import { ListPage } from "./list.po";
 import { CalculatorPage } from "./calculator.po";
 import { Navbar } from "./navbar.po";
 import { PreferencesPage } from "./preferences.po";
-import { changeSelectValue } from "./util.po";
+import { changeSelectValue, openCalculator } from "./util.po";
 import { browser, $, $$, expect } from '@wdio/globals'
 
 /**
@@ -29,11 +29,9 @@ describe("ngHyd − cloisons", () => {
     });
 
     it("when all parent Nub parameters are linked, Structure parameter modes should be alterable without problem", async () => {
-        await navBar.clickNewCalculatorButton();
-
         // 1. create target module for linked parameters
-        await listPage.clickMenuEntryForCalcType(10); // Cloisons
-        await browser.pause(300);
+        await openCalculator(10, navBar, listPage);
+
         // 2. create module to test
         await calcPage.clickCloneCalcButton();
         await browser.pause(300);
@@ -50,10 +48,10 @@ describe("ngHyd − cloisons", () => {
         // 4. change LoiDebit
         await changeSelectValue(await calcPage.getSelectById("select_loidebit"), 1);
         await browser.pause(300);
-        
+
         // 5. check number of inputs in CALC mode
         expect(await calcPage.getCheckedCalcModeButtons().length).toBe(1);
-        
+
         // 6. try calculating the module
         const btn = await calcPage.getCalculateButton()
         await btn.click();
diff --git a/e2e/clone-all-calc.e2e-spec.ts b/e2e/clone-all-calc.e2e-spec.ts
index 290067e9a4001376fc817edac5627f395dad3232..91e0763fa0f37267a266c18e4512039def8eeae3 100644
--- a/e2e/clone-all-calc.e2e-spec.ts
+++ b/e2e/clone-all-calc.e2e-spec.ts
@@ -3,7 +3,7 @@ import { CalculatorPage } from "./calculator.po";
 import { Navbar } from "./navbar.po";
 import { PreferencesPage } from "./preferences.po";
 import { testedCalcTypes } from "./tested_calctypes";
-import { newSession, scrollPageToTop } from "./util.po";
+import { newSession, openCalculator, scrollPageToTop } from "./util.po";
 import { browser, $, $$, expect } from '@wdio/globals'
 import { SideNav } from "./sidenav.po";
 
@@ -49,8 +49,7 @@ describe("ngHyd − clone all calculators with all possible <select> values", ()
                     await newSession(navBar, sideNav);
 
                     // click calculator button (instanciate)
-                    await listPage.clickMenuEntryForCalcType(ct);
-                    await browser.pause(200);
+                    await openCalculator(ct, navBar, listPage);
 
                     // get all select IDs outside Structures
                     // get select IDs inside Structures
diff --git a/e2e/clone-calc.e2e-spec.ts b/e2e/clone-calc.e2e-spec.ts
index e6eff73a3478581468e3d6a5b9146b62a0ce829a..a6d425c3a1df5c12f3a9c0e273366c2c3fd05765 100644
--- a/e2e/clone-calc.e2e-spec.ts
+++ b/e2e/clone-calc.e2e-spec.ts
@@ -2,7 +2,7 @@ import { ListPage } from "./list.po";
 import { CalculatorPage } from "./calculator.po";
 import { Navbar } from "./navbar.po";
 import { PreferencesPage } from "./preferences.po";
-import { changeSelectValue, scrollPageToTop } from "./util.po";
+import { changeSelectValue, openCalculator, scrollPageToTop } from "./util.po";
 import { browser, $, $$, expect } from '@wdio/globals'
 
 /**
@@ -11,14 +11,14 @@ import { browser, $, $$, expect } from '@wdio/globals'
 describe("ngHyd − clone a calculator", () => {
     let listPage: ListPage;
     let calcPage: CalculatorPage;
-    let navbar: Navbar;
+    let navBar: Navbar;
     let prefPage: PreferencesPage;
 
     beforeAll(async () => {
         listPage = new ListPage();
         calcPage = new CalculatorPage();
         prefPage = new PreferencesPage();
-        navbar = new Navbar();
+        navBar = new Navbar();
     });
 
     beforeEach(async () => {
@@ -29,22 +29,17 @@ describe("ngHyd − clone a calculator", () => {
     });
 
     it("when cloning a calculator, the clone should have the same values for all parameters", async () => {
-        await navbar.clickNewCalculatorButton();
         // 1. create target modules for linked parameter
-        await listPage.clickMenuEntryForCalcType(3); // Régime uniforme
-        await browser.pause(500);
+        await openCalculator(3, navBar, listPage);
+
         const debitRU = await calcPage.getInputById("calc_Q"); // "Débit" is calculated by default
         await calcPage.setParamMode(debitRU, "fix");
         await browser.pause(500);
 
-        await navbar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(4); // Courbe de remous
-        await browser.pause(500);
+        await openCalculator(4, navBar, listPage);
 
         // 2. create source module to clone
-        await navbar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(2); // Section paramétrée
-        await browser.pause(500);
+        await openCalculator(2, navBar, listPage);
 
         // 3. change and store source parameter values
         const sourceValues = {
@@ -71,8 +66,8 @@ describe("ngHyd − clone a calculator", () => {
         await browser.pause(500);
 
         // 4. check existence of the cloned module
-        expect(await navbar.getAllCalculatorTabs().length).toBe(4);
-        await navbar.clickCalculatorTab(3); // n°3 should be the latest
+        expect(await navBar.getAllCalculatorTabs().length).toBe(4);
+        await navBar.clickCalculatorTab(3); // n°3 should be the latest
         await browser.pause(500);
 
         // 5. compare values
diff --git a/e2e/compute-reset-chained-links.e2e-spec.ts b/e2e/compute-reset-chained-links.e2e-spec.ts
index e0577d24622ae9ca1377df71733759f5cf4b6a10..89ef7a886f27dc66506025fcb12b133fe443f857 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 4e2521c53a33ccd0cfd54ccd0ff1ee10ac58603a..e001fbcb0fa050f9d88d98e16a9e1c00a698132d 100644
--- a/e2e/cote-amont-aval-bief.e2e-spec.ts
+++ b/e2e/cote-amont-aval-bief.e2e-spec.ts
@@ -3,7 +3,7 @@ import { Navbar } from "./navbar.po";
 import { ListPage } from "./list.po";
 import { CalculatorPage } from "./calculator.po";
 import { browser, $, $$, expect } from '@wdio/globals'
-import { newSession } from "./util.po";
+import { newSession, openCalculator } from "./util.po";
 import { SideNav } from "./sidenav.po";
 
 describe("ngHyd − up/downstream elevations of a reach", () => {
@@ -31,10 +31,7 @@ describe("ngHyd − up/downstream elevations of a reach", () => {
 
     it("check hydraulic details availability - flow calculation", async () => {
         // open "up/downstream elevations of a reach" calculator
-        await navBar.clickNewCalculatorButton();
-        await browser.pause(200);
-        await listPage.clickMenuEntryForCalcType(21);
-        await browser.pause(200);
+        await openCalculator(21, navBar, listPage);
 
         // set upstream flow in calculate mode
         const flowCalcBtn = await $(
@@ -43,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);
@@ -72,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,12 +82,10 @@ describe("ngHyd − up/downstream elevations of a reach", () => {
         await newSession(navBar, sideNav);
 
         // open "up/downstream elevations of a reach" calculator
-        // await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(21);
-        await browser.pause(200);
+        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);
@@ -113,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/courbe-remous-empty-fields.e2e-spec.ts b/e2e/courbe-remous-empty-fields.e2e-spec.ts
index 39a08fd4c5ac6fb89200a4df93ba2280eb1abc88..e393d7e8499ee73ba84678c9edb493ccd8cb5f41 100644
--- a/e2e/courbe-remous-empty-fields.e2e-spec.ts
+++ b/e2e/courbe-remous-empty-fields.e2e-spec.ts
@@ -3,6 +3,7 @@ import { Navbar } from "./navbar.po";
 import { CalculatorPage } from "./calculator.po";
 import { PreferencesPage } from "./preferences.po";
 import { browser, $, $$, expect } from '@wdio/globals'
+import { openCalculator } from "./util.po";
 
 describe("Check fields are empty in 'backwater curves' calculator when created with 'empty fields' option", () => {
     let listPage: ListPage;
@@ -26,9 +27,7 @@ describe("Check fields are empty in 'backwater curves' calculator when created w
 
     it("", async () => {
         // open "backwater curves" calculator
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(4);
-        await browser.pause(200);
+        await openCalculator(4, navBar, listPage);
 
         await calcPage.checkEmptyOrFilledFields(["LargeurBerge", "Ks", "Long", "YB", "ZF1", "ZF2", "Q", "Z1", "Z2", "Dx"],
             [true, true, true, true, true, true, true, true, true, true]);
diff --git a/e2e/diagramme-modules.e2e-spec.ts b/e2e/diagramme-modules.e2e-spec.ts
index 5d2adae7f74da96e95e05d4beb90afbdfb21453c..ab65b0149556a8207dcfed36c30c643b7e6c4bdd 100644
--- a/e2e/diagramme-modules.e2e-spec.ts
+++ b/e2e/diagramme-modules.e2e-spec.ts
@@ -3,6 +3,7 @@ import { ListPage } from "./list.po";
 import { SideNav } from "./sidenav.po";
 import { PreferencesPage } from "./preferences.po";
 import { browser, $, $$, expect } from '@wdio/globals'
+import { openCalculator } from "./util.po";
 
 /**
  * convert Mermaid formatted id ("flowchat-id-xx") to id
@@ -38,9 +39,7 @@ describe("modules diagram", () => {
         //browser.manage().window().setPosition(2000, 30);
 
         // open predam calculator
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(30);
-        await browser.pause(200);
+        await openCalculator(30, navBar, listPage);
 
         // open modules diagram
         await navBar.clickMenuButton();
diff --git a/e2e/documentation.e2e-spec.ts b/e2e/documentation.e2e-spec.ts
index 39ae0c60f025163f8c826bd5b5d6aab464b97ef4..9f1ba6935d85127c6052815ecd74810d17256bad 100644
--- a/e2e/documentation.e2e-spec.ts
+++ b/e2e/documentation.e2e-spec.ts
@@ -3,6 +3,7 @@ import { CalculatorPage } from "./calculator.po";
 import { Navbar } from "./navbar.po";
 import { PreferencesPage } from "./preferences.po";
 import { browser, $, $$, expect } from '@wdio/globals'
+import { openCalculator } from "./util.po";
 
 describe("documentation − ", () => {
     let listPage: ListPage;
@@ -26,13 +27,8 @@ describe("documentation − ", () => {
         await prefPage.changeLanguage(lang);
         await browser.pause(200);
 
-        // start page
-        await navBar.clickNewCalculatorButton();
-        await browser.pause(200);
-
         // open "fish ladder: fall" calculator
-        await listPage.clickMenuEntryForCalcType(12);
-        await browser.pause(200);
+        await openCalculator(12, navBar, listPage);
 
         // click help
         await calcPage.getCalculatorHelpButton().click();
diff --git a/e2e/duplicate-results.e2e-spec.ts b/e2e/duplicate-results.e2e-spec.ts
index ae36dcc5414fd8d58c3d37d83aa878ba75e56fcc..b567a214421f1ff0ff86081c7b2cc4988efc15ab 100644
--- a/e2e/duplicate-results.e2e-spec.ts
+++ b/e2e/duplicate-results.e2e-spec.ts
@@ -3,6 +3,7 @@ import { Navbar } from "./navbar.po";
 import { ListPage } from "./list.po";
 import { CalculatorPage } from "./calculator.po";
 import { browser, $, $$, expect } from '@wdio/globals'
+import { openCalculator } from "./util.po";
 
 describe("ngHyd − check that results are not duplicated", () => {
     let prefPage: PreferencesPage;
@@ -27,9 +28,7 @@ describe("ngHyd − check that results are not duplicated", () => {
 
     it("in 'baffle fishway: setup' calculator", async () => {
         // open baffle fishway setup calculator
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(28);
-        await browser.pause(200);
+        await openCalculator(28, navBar, listPage);
 
         // run calculation
         const calcButton = await calcPage.getCalculateButton();
@@ -39,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/lechapt-calmon.e2e-spec.ts b/e2e/lechapt-calmon.e2e-spec.ts
index 3d4eaf9b90f5e739f9336df426d5f31cccc6fd3e..1be7ef7ba17a2ed3af25a26c67770b08970b0cfd 100644
--- a/e2e/lechapt-calmon.e2e-spec.ts
+++ b/e2e/lechapt-calmon.e2e-spec.ts
@@ -2,7 +2,7 @@ import { ListPage } from "./list.po";
 import { CalculatorPage } from "./calculator.po";
 import { PreferencesPage } from "./preferences.po";
 import { Navbar } from "./navbar.po";
-import { changeSelectValue } from "./util.po";
+import { changeSelectValue, openCalculator } from "./util.po";
 import { browser, $, $$, expect } from '@wdio/globals'
 
 /**
@@ -31,13 +31,8 @@ describe("Lechapt&Calmon - ", () => {
     });
 
     async function setup() {
-        // start page
-        await navBar.clickNewCalculatorButton();
-        await browser.pause(200);
-
         // open Lechapt-Calmon (pressure loss) calculator
-        await listPage.clickMenuEntryForCalcType(35);
-        await browser.pause(200);
+        await openCalculator(35, navBar, listPage);
     }
 
     it("when material is modified, results should change", async () => {
diff --git a/e2e/link-parallel-devices.e2e-spec.ts b/e2e/link-parallel-devices.e2e-spec.ts
index 5bae9aa32ad4168954a5f71e71516edd8edffedd..97a1b8c9d349d45ec1cd4c33e702b6b191a223ef 100644
--- a/e2e/link-parallel-devices.e2e-spec.ts
+++ b/e2e/link-parallel-devices.e2e-spec.ts
@@ -3,7 +3,7 @@ import { CalculatorPage } from "./calculator.po";
 import { PreferencesPage } from "./preferences.po";
 import { Navbar } from "./navbar.po";
 import { browser, $, $$, expect } from '@wdio/globals'
-import { newSession } from "./util.po";
+import { newSession, openCalculator } from "./util.po";
 import { SideNav } from "./sidenav.po";
 
 describe("ngHyd − parallel structures with multiple linked parameters − ", () => {
@@ -29,31 +29,30 @@ describe("ngHyd − parallel structures with multiple linked parameters − ", (
     });
 
     it("when creating Parallel Structures, devices should be linkable to one another", async () => {
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(8);
-        await browser.pause(200);
+        await openCalculator(8, navBar, listPage);
+
         const addBtn = await calcPage.getAddStructureButton();
         await addBtn.click();
         await browser.pause(200);
         const nb1 = await calcPage.getAllLinkButtons().length;
         expect(nb1).toBe(8); // link buttons on children but not on parent
     });
-    
+
     it("when creating Cloisons, devices should be linkable to one another", async () => {
         await newSession(navBar, sideNav);
-        await listPage.clickMenuEntryForCalcType(10);
-        await browser.pause(200);
+        await openCalculator(10, navBar, listPage);
+
         const addBtn = await calcPage.getAddStructureButton();
         await addBtn.click();
         await browser.pause(200);
         const nb2 = await calcPage.getAllLinkButtons().length;
         expect(nb2).toBe(6); // link buttons on children but not on parent
     });
-    
+
     it("when creating Dever, devices should be linkable to one another", async () => {
         await newSession(navBar, sideNav);
-        await listPage.clickMenuEntryForCalcType(9);
-        await browser.pause(200);
+        await openCalculator(9, navBar, listPage);
+
         const addBtn = await calcPage.getAddStructureButton();
         await addBtn.click();
         await browser.pause(200);
diff --git a/e2e/link-to-deleted-module.e2e-spec.ts b/e2e/link-to-deleted-module.e2e-spec.ts
index fe62a73bcf039b92bf1828087f6b85f5a38c62ba..85aeea4eeb6041c6370c89cbcda8833787bbab28 100644
--- a/e2e/link-to-deleted-module.e2e-spec.ts
+++ b/e2e/link-to-deleted-module.e2e-spec.ts
@@ -3,7 +3,7 @@ import { ListPage } from "./list.po";
 import { Navbar } from "./navbar.po";
 import { PreferencesPage } from "./preferences.po";
 import { browser, $, $$, expect } from '@wdio/globals'
-import { newSession } from "./util.po";
+import { newSession, openCalculator } from "./util.po";
 import { SideNav } from "./sidenav.po";
 
 describe("linked parameter - ", () => {
@@ -64,8 +64,7 @@ describe("linked parameter - ", () => {
         await newSession(navBar, sideNav);
 
         // open "fish ladder: fall" calculator
-        await listPage.clickMenuEntryForCalcType(12);
-        await browser.pause(200);
+        await openCalculator(12, navBar, listPage);
 
         // clone calculator
         await calcPage.clickCloneCalcButton();
diff --git a/e2e/linked-parameter-section-type.e2e-spec.ts b/e2e/linked-parameter-section-type.e2e-spec.ts
index d663d2d9e281a030700de7322a4887e77b1a9e6c..c6a63f70f91a7b5fa0520aa99b4349a94e86b19f 100644
--- a/e2e/linked-parameter-section-type.e2e-spec.ts
+++ b/e2e/linked-parameter-section-type.e2e-spec.ts
@@ -2,7 +2,7 @@ import { ListPage } from "./list.po";
 import { Navbar } from "./navbar.po";
 import { PreferencesPage } from "./preferences.po";
 import { CalculatorPage } from "./calculator.po";
-import { changeSelectValue } from "./util.po";
+import { changeSelectValue, openCalculator } from "./util.po";
 import { browser } from "@wdio/globals";
 
 describe("linked parameter in calculator with section - ", () => {
@@ -29,23 +29,20 @@ describe("linked parameter in calculator with section - ", () => {
         // browser.manage().window().setPosition(2000, 30);
 
         // open first "parametric section" calculator
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(2);
-        await browser.pause(200);
+        await openCalculator(2, navBar, listPage);
 
         // open second "parametric section" calculator
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(2);
-        await browser.pause(200);
+        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 b8fb8a83e9fdd610613eb6826e0fcf1f34e6660e..29c1cc67a55630e5e206bdc31245a59f78cd8630 100644
--- a/e2e/load-save-session.e2e-spec.ts
+++ b/e2e/load-save-session.e2e-spec.ts
@@ -4,7 +4,7 @@ import { CalculatorPage } from "./calculator.po";
 import { Navbar } from "./navbar.po";
 import { SideNav } from "./sidenav.po";
 import { PreferencesPage } from "./preferences.po";
-import { changeSelectValue, expectNumber, loadSession } from "./util.po";
+import { changeSelectValue, expectNumber, loadSession, openCalculator } from "./util.po";
 import { browser, $, $$, expect } from '@wdio/globals'
 
 const fs = require("fs");
@@ -14,7 +14,7 @@ const os = require("os");
 let startPage: AppPage;
 let listPage: ListPage;
 let calcPage: CalculatorPage;
-let navbar: Navbar;
+let navBar: Navbar;
 let sidenav: SideNav;
 let prefPage: PreferencesPage;
 
@@ -62,7 +62,7 @@ describe("ngHyd − save and load sessions", () => {
         startPage = new AppPage();
         listPage = new ListPage();
         calcPage = new CalculatorPage();
-        navbar = new Navbar();
+        navBar = new Navbar();
         sidenav = new SideNav();
         prefPage = new PreferencesPage();
     });
@@ -74,19 +74,19 @@ describe("ngHyd − save and load sessions", () => {
     it("when loading session-6-calc.test.json file from home page, 6 calculators should be loaded", async () => {
         await startPage.navigateTo();
 
-        await loadSession(navbar, sidenav, "./session/session-6-calc.test.json");
+        await loadSession(navBar, sidenav, "./session/session-6-calc.test.json");
         await browser.pause(1000);
 
-        expect(await navbar.getAllCalculatorTabs().length).toBe(6);
+        expect(await navBar.getAllCalculatorTabs().length).toBe(6);
     });
 
     it("when loading session-optional-params.test.json file from home page, the calculator should be loaded", async () => {
         await startPage.navigateTo();
 
-        await loadSession(navbar, sidenav, "./session/session-optional-params.test.json");
+        await loadSession(navBar, sidenav, "./session/session-optional-params.test.json");
         await browser.pause(200);
 
-        expect(await navbar.getAllCalculatorTabs().length).toBe(1);
+        expect(await navBar.getAllCalculatorTabs().length).toBe(1);
     });
 
     it("when saving a calculator, the current parameter values should be found in the file", async () => {
@@ -94,10 +94,8 @@ describe("ngHyd − save and load sessions", () => {
         await prefPage.navigateTo();
         await prefPage.disableEvilEmptyFields();
         await browser.pause(200);
-        await navbar.clickNewCalculatorButton();
 
-        await listPage.clickMenuEntryForCalcType(2); // Section paramétrée
-        await browser.pause(200);
+        await openCalculator(2, navBar, listPage); // Section paramétrée
 
         await changeSelectValue(await calcPage.getSelectById("select_section"), 2); // mode "trapezoidal"
 
@@ -136,27 +134,25 @@ describe("ngHyd − save and load sessions", () => {
                     await prefPage.disableEvilEmptyFields();
                     await browser.pause(200);
 
-                    // start page
-                    await navbar.clickNewCalculatorButton();
-                    await browser.pause(200);
+                    // // start page
+                    // await navBar.clickNewCalculatorButton();
+                    // await browser.pause(200);
                 }
                 else {
                     // empty session
-                    await navbar.clickMenuButton();
+                    await navBar.clickMenuButton();
                     await browser.pause(500);
                     await sidenav.clickNewSessionButton();
                     await browser.pause(200);
                 }
 
                 // open calculator
-                await listPage.clickMenuEntryForCalcType(ct);
-                await browser.pause(200);
+                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);
@@ -177,12 +173,12 @@ describe("ngHyd − save and load sessions", () => {
                         await browser.pause(500);
 
                         // load session
-                        await loadSession(navbar, sidenav, filename);
+                        await loadSession(navBar, sidenav, filename);
                         await browser.pause(500);
                         // the displayed calculator is now the loaded one
 
                         // check the calculator has been loaded
-                        expectNumber(`calc ${ct} select ${selId} : num calcs`, await navbar.getCalculatorEntriesCount(), 2);
+                        expectNumber(`calc ${ct} select ${selId} : num calcs`, await navBar.getCalculatorEntriesCount(), 2);
 
                         // check the select in the loaded session points to the same option
                         const sel2 = await calcPage.getSelectById(selId);
@@ -193,16 +189,16 @@ describe("ngHyd − save and load sessions", () => {
                         expectNumber(`calc ${ct} select ${selId} : opt '${optTxt2}' index`, ind2, nextInd);
 
                         // close last calculator (the loaded one)
-                        await navbar.middleClickCalculatorTab(1);
+                        await navBar.middleClickCalculatorTab(1);
                         await browser.pause(200);
 
                         // check last calculator has been closed
-                        expectNumber(`calc ${ct} select ${selId} : num calcs(2)`, await navbar.getCalculatorEntriesCount(), 1);
+                        expectNumber(`calc ${ct} select ${selId} : num calcs(2)`, await navBar.getCalculatorEntriesCount(), 1);
 
                         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/macrorugo-remous.e2e-spec.ts b/e2e/macrorugo-remous.e2e-spec.ts
index d2c17b03b7dd07aa6c120460c625d955ffe8c1f7..14815aa4f559c507d99dea34621d1cedc90cd10f 100644
--- a/e2e/macrorugo-remous.e2e-spec.ts
+++ b/e2e/macrorugo-remous.e2e-spec.ts
@@ -2,10 +2,10 @@ import { ListPage } from "./list.po";
 import { PreferencesPage } from "./preferences.po";
 import { Navbar } from "./navbar.po";
 import { browser, $, $$, expect } from '@wdio/globals'
-import { isElementDisplayed } from "./util.po";
+import { isElementDisplayed, openCalculator } from "./util.po";
 import { CalculatorPage } from "./calculator.po";
 
-//TODO à réactiver après fusion de #618 dans devel
+//TODO à réactiver après fusion de nghyd#609 jalhyd#325 dans devel
 xdescribe("MacroRugoRemous - ", () => {
     let prefPage: PreferencesPage;
     let listPage: ListPage;
@@ -28,13 +28,8 @@ xdescribe("MacroRugoRemous - ", () => {
     });
 
     it("check select empty message is present when no PAM is in the session", async () => {
-        // start page
-        await navBar.clickNewCalculatorButton();
-        await browser.pause(200);
-
         // MacroRugoRemous calculator
-        await listPage.clickMenuEntryForCalcType(37);
-        browser.pause(200);
+        await openCalculator(37, navBar, listPage);
 
         // const emptyMsg = element(by.css("div .message-when-empty"));
         const emptyMsg = await $("div .message-when-empty");
@@ -42,40 +37,25 @@ xdescribe("MacroRugoRemous - ", () => {
     });
 
     it("check select empty message is not present when a PAM exists in the session", async () => {
-        // start page
-        await navBar.clickNewCalculatorButton();
-        await browser.pause(200);
-
         // PAM calculator
-        await listPage.clickMenuEntryForCalcType(11);
-        browser.pause(200);
+        await openCalculator(11, navBar, listPage);
 
         await navBar.clickNewCalculatorButton();
         await browser.pause(200);
 
         // MacroRugoRemous calculator
-        await listPage.clickMenuEntryForCalcType(37);
-        browser.pause(200);
+        await openCalculator(37, navBar, listPage);
 
         const emptyMsg = $("div .message-when-empty");
         expect(await isElementDisplayed(emptyMsg)).toBe(false);
     });
 
     it("check select error message when target PAM has no variated parameter", async () => {
-        // start page
-        await navBar.clickNewCalculatorButton();
-        await browser.pause(200);
-
         // PAM calculator
-        await listPage.clickMenuEntryForCalcType(11);
-        browser.pause(200);
+        await openCalculator(11, navBar, listPage);
 
         // MacroRugoRemous calculator
-        await navBar.clickNewCalculatorButton();
-        await browser.pause(200);
-
-        await listPage.clickMenuEntryForCalcType(37);
-        browser.pause(200);
+        await openCalculator(37, navBar, listPage);
 
         const errorMsg = await $("div .select-error-message");
         expect(await isElementDisplayed(errorMsg)).toBe(false);
@@ -96,11 +76,7 @@ xdescribe("MacroRugoRemous - ", () => {
         await browser.pause(200);
 
         // MacroRugoRemous calculator
-        await navBar.clickNewCalculatorButton();
-        await browser.pause(200);
-
-        await listPage.clickMenuEntryForCalcType(37);
-        browser.pause(200);
+        await openCalculator(37, navBar, listPage);
 
         const errorMsg = await $("div .select-error-message");
         expect(await isElementDisplayed(errorMsg)).toBe(true);
diff --git a/e2e/notes.e2e-spec.ts b/e2e/notes.e2e-spec.ts
index de60a26f285925b53db452aab19383731933465b..6a3139ea5cec8d68ef7e5b41a13489343110e822 100644
--- a/e2e/notes.e2e-spec.ts
+++ b/e2e/notes.e2e-spec.ts
@@ -3,32 +3,32 @@ import { Navbar } from "./navbar.po";
 import { ListPage } from "./list.po";
 import { SideNav } from "./sidenav.po";
 import { browser, $, $$, expect } from '@wdio/globals'
+import { newSession, openApplication, openCalculator } from "./util.po";
 
 describe("check calculator notes", () => {
     let startPage: AppPage;
     let navBar: Navbar;
     let listPage: ListPage;
-    let sidenav: SideNav;
+    let sideNav: SideNav;
 
     beforeAll(() => {
         startPage = new AppPage();
         navBar = new Navbar();
         listPage = new ListPage();
-        sidenav = new SideNav();
+        sideNav = new SideNav();
     });
 
     it(" - notes should display properly when opened from a calculator", async () => {
-        await startPage.navigateTo();
-        await browser.pause(500);
+        await openApplication(startPage);
+        await newSession(navBar, sideNav);
 
         // open PAB: chute calculator
-        await listPage.clickMenuEntryForCalcType(12);
-        await browser.pause(200);
+        await openCalculator(12, navBar, listPage);
 
         // open notes
         await navBar.clickMenuButton();
         await browser.pause(500);
-        await sidenav.clickNotesButton();
+        await sideNav.clickNotesButton();
         await browser.pause(200);
 
         // input some text
@@ -44,7 +44,7 @@ describe("check calculator notes", () => {
         // reopen notes
         await navBar.clickMenuButton();
         await browser.pause(200);
-        await sidenav.clickNotesButton();
+        await sideNav.clickNotesButton();
         await browser.pause(200);
 
         // check text
@@ -54,17 +54,16 @@ describe("check calculator notes", () => {
     });
 
     it(" - notes should display properly when opened from modules diagram", async () => {
-        await startPage.navigateTo();
-        await browser.pause(500);
+        await openApplication(startPage);
+        await newSession(navBar, sideNav);
 
         // open PAB: chute calculator
-        await listPage.clickMenuEntryForCalcType(12);
-        await browser.pause(200);
+        await openCalculator(12, navBar, listPage);
 
         // open notes
         await navBar.clickMenuButton();
         await browser.pause(500);
-        await sidenav.clickNotesButton();
+        await sideNav.clickNotesButton();
         await browser.pause(200);
 
         // input some text
@@ -76,7 +75,7 @@ describe("check calculator notes", () => {
         // open modules diagram
         await navBar.clickMenuButton();
         await browser.pause(500);
-        await sidenav.clickDiagramButton();
+        await sideNav.clickDiagramButton();
         await browser.pause(200);
 
         // open notes
diff --git a/e2e/pab-cloisons-empty-fields.e2e-spec.ts b/e2e/pab-cloisons-empty-fields.e2e-spec.ts
index 81e107f2b7b8e7676cd1168c5242c24bef9ccca2..d1443fb781cda8a0d46b70bab98c06930dafdc30 100644
--- a/e2e/pab-cloisons-empty-fields.e2e-spec.ts
+++ b/e2e/pab-cloisons-empty-fields.e2e-spec.ts
@@ -3,6 +3,7 @@ import { PreferencesPage } from "./preferences.po";
 import { CalculatorPage } from "./calculator.po";
 import { Navbar } from "./navbar.po";
 import { browser, $, $$, expect } from '@wdio/globals'
+import { openCalculator } from "./util.po";
 
 /**
  * enable evil option "empty fields on module creation"
@@ -44,9 +45,7 @@ describe("ngHyd - check the cross walls calculator has empty fields - ", () => {
 
     it("in the 'generate fish ladder' dialog", async () => {
         // open cross walls calculator
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(10);
-        await browser.pause(200);
+        await openCalculator(10, navBar, listPage);
 
         // fill inputs
         await fillInput(calcPage, "Z1");
@@ -66,7 +65,7 @@ describe("ngHyd - check the cross walls calculator has empty fields - ", () => {
         // click "generate PAB" button
         const genButton = await calcPage.getGeneratePabButton();
         await genButton.click();
-        await browser.pause(1000);
+        await browser.pause(2000);
 
         await calcPage.checkEmptyOrFilledFields(["generatePabNbBassins"], [true]);
     });
@@ -95,9 +94,7 @@ describe("ngHyd - check the cross walls calculator has no empty field - ", () =>
 
     it("after calculation", async () => {
         // open cross walls calculator
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(10);
-        await browser.pause(200);
+        await openCalculator(10, navBar, listPage);
 
         // fill inputs
         await fillInput(calcPage, "Z1");
diff --git a/e2e/pab.e2e-spec.ts b/e2e/pab.e2e-spec.ts
index a46cf7912e2861152fe2ef2ea30aecff55c44afb..4871aebe43f464b7e38e5f40f91a8c1aefad222b 100644
--- a/e2e/pab.e2e-spec.ts
+++ b/e2e/pab.e2e-spec.ts
@@ -4,7 +4,7 @@ import { Navbar } from "./navbar.po";
 import { AppPage } from "./app.po";
 import { SideNav } from "./sidenav.po";
 import { PreferencesPage } from "./preferences.po";
-import { changeSelectValue, loadSession, newSession, scrollPageToTop } from "./util.po";
+import { changeSelectValue, loadSession, newSession, openCalculator, scrollPageToTop } from "./util.po";
 import { browser, $, $$, expect } from '@wdio/globals'
 
 /**
@@ -37,8 +37,8 @@ describe("ngHyd − Passe à Bassins", () => {
 
         it("when PAB is created from scratch", async () => {
             // create PAB
-            await navBar.clickNewCalculatorButton();
-            await listPage.clickMenuEntryForCalcType(15);
+            await openCalculator(15, navBar, listPage);
+
             // check that pab-table is present
             const innerFieldsets = await $$(".pab-data-table");
             expect(await innerFieldsets.length).toBe(1);
@@ -58,16 +58,16 @@ describe("ngHyd − Passe à Bassins", () => {
 
         it("complete example of all PAB modules", async () => {
             // PAB - chute
-            await navBar.clickNewCalculatorButton();
-            await listPage.clickMenuEntryForCalcType(12);
+            await openCalculator(12, navBar, listPage);
+
             const c_Z1 = await calcPage.getInputById("Z1");
             await c_Z1.setValue("78.27");
             const c_Z2 = await calcPage.getInputById("Z2");
             await c_Z2.setValue("74.86");
 
             // PAB - nombre
-            await navBar.clickNewCalculatorButton();
-            await listPage.clickMenuEntryForCalcType(13);
+            await openCalculator(13, navBar, listPage);
+
             const n_DHT = await calcPage.getInputById("DHT");
             await calcPage.setParamMode(n_DHT, "link");
             const n_DH = await calcPage.getInputById("DH");
@@ -77,8 +77,8 @@ describe("ngHyd − Passe à Bassins", () => {
             await n_N.setValue("15");
 
             // PAB - dimensions
-            await navBar.clickNewCalculatorButton();
-            await listPage.clickMenuEntryForCalcType(5);
+            await openCalculator(5, navBar, listPage);
+
             const d_V = await calcPage.getInputById("V");
             await calcPage.setParamMode(d_V, "cal");
             const d_Y = await calcPage.getInputById("Y");
@@ -89,8 +89,8 @@ describe("ngHyd − Passe à Bassins", () => {
             await d_W.setValue("2.5");
 
             // PAB - puissance dissipée (volume)
-            await navBar.clickNewCalculatorButton();
-            await listPage.clickMenuEntryForCalcType(6);
+            await openCalculator(6, navBar, listPage);
+
             const p_DH = await calcPage.getInputById("DH");
             await calcPage.setParamMode(p_DH, "link");
             const p_Q = await calcPage.getInputById("Q");
@@ -102,8 +102,8 @@ describe("ngHyd − Passe à Bassins", () => {
             await p_PV.setValue("150");
 
             // PAB - cloisons
-            await navBar.clickNewCalculatorButton();
-            await listPage.clickMenuEntryForCalcType(10);
+            await openCalculator(10, navBar, listPage);
+
             const cl_LB = await calcPage.getInputById("LB");
             await calcPage.setParamMode(cl_LB, "link");
             const cl_BB = await calcPage.getInputById("BB");
@@ -162,11 +162,10 @@ describe("ngHyd − Passe à Bassins", () => {
             await newSession(navBar, sideNav);
 
             // create many Cloisons
-            await listPage.clickMenuEntryForCalcType(10);
-            await navBar.clickNewCalculatorButton();
-            await listPage.clickMenuEntryForCalcType(10);
-            await navBar.clickNewCalculatorButton();
-            await listPage.clickMenuEntryForCalcType(10);
+            await openCalculator(10, navBar, listPage);
+            await openCalculator(10, navBar, listPage);
+            await openCalculator(10, navBar, listPage);
+
             // choose one of them and change its parameters
             await navBar.clickCalculatorTab(1);
             const Z1 = await calcPage.getInputById("Z1");
diff --git a/e2e/parallel-structures.e2e-spec.ts b/e2e/parallel-structures.e2e-spec.ts
index f5f12df4bf09e7a6295d865effd4f949a11a0613..5c4fafa5572f3f90a35b94cbbdbcd45eed4317ed 100644
--- a/e2e/parallel-structures.e2e-spec.ts
+++ b/e2e/parallel-structures.e2e-spec.ts
@@ -3,7 +3,7 @@ import { Navbar } from "./navbar.po";
 import { CalculatorPage } from "./calculator.po";
 import { PreferencesPage } from "./preferences.po";
 import { AppPage } from "./app.po";
-import { loadSession } from "./util.po";
+import { loadSession, openCalculator } from "./util.po";
 import { SideNav } from "./sidenav.po";
 import { browser, $, $$, expect } from '@wdio/globals'
 
@@ -33,10 +33,7 @@ describe("Parallel structures - ", () => {
 
         it("check calculated parameter remains the same when copying a structure", async () => {
                 // open "fish ladder: cross walls" calculator
-                await navBar.clickNewCalculatorButton();
-                await browser.pause(200);
-                await listPage.clickMenuEntryForCalcType(10);
-                await browser.pause(200);
+                await openCalculator(10, navBar, listPage);
 
                 // check L in first structure calc toggle is not checked
                 const L1 = await calcPage.getInputById("0_L");
diff --git a/e2e/prebarrages-results.e2e-spec.ts b/e2e/prebarrages-results.e2e-spec.ts
index b7e83b5126a6df649dd4ff40a3d9163c2b0a7a30..82ea0875b5501926371368077d298c1145bc7985 100644
--- a/e2e/prebarrages-results.e2e-spec.ts
+++ b/e2e/prebarrages-results.e2e-spec.ts
@@ -3,7 +3,7 @@ import { CalculatorPage } from "./calculator.po";
 import { Navbar } from "./navbar.po";
 import { PreferencesPage } from "./preferences.po";
 import { browser, $, $$, expect } from '@wdio/globals'
-import { loadSession, scrollToElement } from "./util.po";
+import { loadSession, openCalculator, scrollToElement } from "./util.po";
 import { SideNav } from "./sidenav.po";
 
 /**
@@ -35,10 +35,7 @@ describe("Prébarrages results - ", () => {
 
     it("every module shoud have results", async () => {
         // create prébarrage calculator
-        await navBar.clickNewCalculatorButton();
-        await browser.pause(200);
-        await listPage.clickMenuEntryForCalcType(30);
-        await browser.pause(200);
+        await openCalculator(30, navBar, listPage);
 
         // run calculation
         const calcButton = await calcPage.getCalculateButton();
diff --git a/e2e/predam-empty-fields.e2e-spec.ts b/e2e/predam-empty-fields.e2e-spec.ts
index 66ad0806c7097a60474f2e873dbdc02dc17ea55c..096898b2234c61c7af0179ab297b2f6272ea6471 100644
--- a/e2e/predam-empty-fields.e2e-spec.ts
+++ b/e2e/predam-empty-fields.e2e-spec.ts
@@ -3,6 +3,7 @@ import { ListPage } from "./list.po";
 import { Navbar } from "./navbar.po";
 import { PreferencesPage } from "./preferences.po"
 import { browser, $, $$, expect } from '@wdio/globals'
+import { openCalculator } from "./util.po";
 
 /**
  * check that fields are empty on creation
@@ -29,11 +30,8 @@ describe("ngHyd − check that predam fields are empty", () => {
     });
 
     it("on creation", async () => {
-        //browser.manage().window().setPosition(2000, 30);
         // open predam calculator
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(30);
-        await browser.pause(200);
+        await openCalculator(30, navBar, listPage);
 
         // check upstream inputs
         await calcPage.checkEmptyInput("Q");
@@ -68,9 +66,7 @@ describe("ngHyd − check that predam fields are empty", () => {
 
     it("when a basin is added", async () => {
         // open predam calculator
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(30);
-        await browser.pause(200);
+        await openCalculator(30, navBar, listPage);
 
         // add basin
         const addBasinBtn = await $("#add-basin");
@@ -90,9 +86,7 @@ describe("ngHyd − check that predam fields are empty", () => {
 
     it("when a wall is added", async () => {
         // open predam calculator
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(30);
-        await browser.pause(200);
+        await openCalculator(30, navBar, listPage);
 
         // add wall
         const addWallBtn = await $("#add-wall");
diff --git a/e2e/predam-log.e2e-spec.ts b/e2e/predam-log.e2e-spec.ts
index 07c936d1e62a863c69faf2e90a69623da2c44d80..b2119b4895a22f131afd23dfb677b293991d6e92 100644
--- a/e2e/predam-log.e2e-spec.ts
+++ b/e2e/predam-log.e2e-spec.ts
@@ -3,7 +3,7 @@ import { ListPage } from "./list.po";
 import { Navbar } from "./navbar.po";
 import { PreferencesPage } from "./preferences.po"
 import { browser, $, $$, expect } from '@wdio/globals'
-import { changeSelectValue, loadSession, scrollToElement } from "./util.po";
+import { changeSelectValue, loadSession, openCalculator, scrollToElement } from "./util.po";
 import { AppPage } from "./app.po";
 import { SideNav } from "./sidenav.po";
 
@@ -37,9 +37,7 @@ describe("predams - ", () => {
         await prefPage.setIterationCount(5);
 
         // open predam calculator
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(30);
-        await browser.pause(200);
+        await openCalculator(30, navBar, listPage);
 
         // run calculation
         const calcButton = await calcPage.getCalculateButton();
diff --git a/e2e/predam.e2e-spec.ts b/e2e/predam.e2e-spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..335d1c0302a662c476484a6c650a04b66df68fdf
--- /dev/null
+++ b/e2e/predam.e2e-spec.ts
@@ -0,0 +1,60 @@
+import { browser, $, $$, expect } from '@wdio/globals'
+import { PreferencesPage } from './preferences.po';
+import { Navbar } from './navbar.po';
+import { CalculatorPage } from './calculator.po';
+import { changeSelectValue, scrollToElement } from './util.po';
+
+describe("predams - ", () => {
+    let prefPage: PreferencesPage;
+    let navBar: Navbar;
+    let calcPage: CalculatorPage;
+
+    beforeAll(() => {
+        prefPage = new PreferencesPage();
+        navBar = new Navbar();
+        calcPage = new CalculatorPage();
+    });
+
+    beforeEach(async () => {
+        // disable evil option "empty fields on module creation"
+        await prefPage.setEmptyFields(false);
+        await navBar.clickNewCalculatorButton();
+        await browser.pause(200);
+    });
+
+    it("bug nghyd#620", async () => {
+        // open predams example
+        const examples = await $$("#examples-list .load-example");
+        await examples[6].click();
+        await browser.pause(200);
+
+        // select "Amont-B1" basin
+        const nodes = await $$("g.nodes > g");
+        await nodes[8].click();
+        await browser.pause(200);
+
+        // modify 1st structure discharge law
+        const sel = await calcPage.getSelectById("select_loidebit");
+        await changeSelectValue(sel, 3); // Larinier
+        await browser.pause(200);
+
+        // check 2nd structure ZDV
+        const inpZDV2 = await calcPage.getInputById("1_ZDV");
+        expect(await inpZDV2.getValue()).toEqual("96.25")
+
+        // run computation
+        const calcBtn = await calcPage.getCalculateButton();
+        await calcBtn.click();
+        await browser.pause(300);
+
+        // back to inputs tab
+        const resSelectors = await $$("#pb-data-results-selector div div");
+        scrollToElement(resSelectors[0]);
+        await browser.pause(200);
+        await resSelectors[0].click();
+        await browser.pause(200);
+
+        // check 2nd structure ZDV didn't change
+        expect(await inpZDV2.getValue()).toEqual("96.25")
+    });
+});
diff --git a/e2e/preferences.po.ts b/e2e/preferences.po.ts
index 57f921dd1a82ccab94ffe320daf0f57a9161d67f..91d98abcc5984d2a1a4de208e5f7b81cae46ef51 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/pressure-loss-empty-fields.e2e-spec.ts b/e2e/pressure-loss-empty-fields.e2e-spec.ts
index 53b14e380df59c89b104452c73f91959f2f5d36b..8278f2474890b22875753d16e5b3d127638c527a 100644
--- a/e2e/pressure-loss-empty-fields.e2e-spec.ts
+++ b/e2e/pressure-loss-empty-fields.e2e-spec.ts
@@ -2,7 +2,7 @@ import { ListPage } from "./list.po";
 import { Navbar } from "./navbar.po";
 import { CalculatorPage } from "./calculator.po";
 import { PreferencesPage } from "./preferences.po";
-import { changeSelectValue } from "./util.po";
+import { changeSelectValue, openCalculator } from "./util.po";
 import { browser, $, $$, expect } from '@wdio/globals'
 
 describe("Check fields are empty in 'pressure loss' calculator when created with 'empty fields' option -", () => {
@@ -11,7 +11,7 @@ describe("Check fields are empty in 'pressure loss' calculator when created with
     let calcPage: CalculatorPage;
     let prefPage: PreferencesPage;
 
-    beforeAll( () => {
+    beforeAll(() => {
         listPage = new ListPage();
         navBar = new Navbar();
         calcPage = new CalculatorPage();
@@ -27,9 +27,7 @@ describe("Check fields are empty in 'pressure loss' calculator when created with
 
     it("with Lechapt-Calmon pressure loss law", async () => {
         // open "pressure loss" calculator
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(35);
-        await browser.pause(200);
+        await openCalculator(35, navBar, listPage);
 
         // select Lechapt-Calmon pressure loss law
         const materialSelect = await calcPage.getSelectById("select_pressurelosstype");
diff --git a/e2e/pressure-loss.e2e-spec.ts b/e2e/pressure-loss.e2e-spec.ts
index 1e8d1e21f81ddf411485abbb0a51dc1842f7115e..66537c8e85134ad145cfa87ce99cea7031787809 100644
--- a/e2e/pressure-loss.e2e-spec.ts
+++ b/e2e/pressure-loss.e2e-spec.ts
@@ -2,7 +2,7 @@ import { ListPage } from "./list.po";
 import { Navbar } from "./navbar.po";
 import { CalculatorPage } from "./calculator.po";
 import { PreferencesPage } from "./preferences.po";
-import { changeSelectValue } from "./util.po";
+import { changeSelectValue, openCalculator } from "./util.po";
 import { browser, $, $$, expect } from '@wdio/globals'
 
 describe("Pressure loss - ", () => {
@@ -28,9 +28,7 @@ describe("Pressure loss - ", () => {
     describe("modify pressure loss law displays the appropriate fields - ", () => {
         it("Lechapt&Calmon", async () => {
             // open "pressure loss" calculator
-            await navBar.clickNewCalculatorButton();
-            await listPage.clickMenuEntryForCalcType(35);
-            await browser.pause(200);
+            await openCalculator(35, navBar, listPage);
 
             // select Lechapt-Calmon pressure loss law
             const materialSelect = await calcPage.getSelectById("select_pressurelosstype");
@@ -50,9 +48,7 @@ describe("Pressure loss - ", () => {
 
         it("Strickler", async () => {
             // open "pressure loss" calculator
-            await navBar.clickNewCalculatorButton();
-            await listPage.clickMenuEntryForCalcType(35);
-            await browser.pause(200);
+            await openCalculator(35, navBar, listPage);
 
             // select Strickler pressure loss law
             const materialSelect = await calcPage.getSelectById("select_pressurelosstype");
diff --git a/e2e/regime-uniforme-empty-fields.e2e-spec.ts b/e2e/regime-uniforme-empty-fields.e2e-spec.ts
index f9178310462e7c65f697d186e21a2ba7c37d08a1..4725067b5c2146c32a0ec8ad2ec1fcfded425f21 100644
--- a/e2e/regime-uniforme-empty-fields.e2e-spec.ts
+++ b/e2e/regime-uniforme-empty-fields.e2e-spec.ts
@@ -3,6 +3,7 @@ import { Navbar } from "./navbar.po";
 import { CalculatorPage } from "./calculator.po";
 import { PreferencesPage } from "./preferences.po";
 import { browser, $, $$, expect } from '@wdio/globals'
+import { openCalculator } from "./util.po";
 
 describe("Check fields are empty in 'uniform flow' calculator when created with 'empty fields' option", () => {
     let listPage: ListPage;
@@ -26,9 +27,7 @@ describe("Check fields are empty in 'uniform flow' calculator when created with
 
     it("", async () => {
         // open "uniform flow" calculator
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(3);
-        await browser.pause(200);
+        await openCalculator(3, navBar, listPage);
 
         expect(await calcPage.checkEmptyOrFilledFields(["LargeurBerge", "Ks", "If", "YB", "Q", "Y"], [true, true, true, true, true, true]))
     });
diff --git a/e2e/remous.e2e-spec.ts b/e2e/remous.e2e-spec.ts
index 48cdcf57f154fe10f148783afd61e1683bdc499e..2fd14288e7bd9089a98b758b35e12112227d1fb1 100644
--- a/e2e/remous.e2e-spec.ts
+++ b/e2e/remous.e2e-spec.ts
@@ -3,7 +3,7 @@ import { CalculatorPage } from "./calculator.po";
 import { Navbar } from "./navbar.po";
 import { PreferencesPage } from "./preferences.po";
 import { SideNav } from "./sidenav.po";
-import { changeSelectValue, loadSession } from "./util.po";
+import { changeSelectValue, loadSession, openCalculator } from "./util.po";
 import { browser, $, $$, expect } from '@wdio/globals'
 
 /**
@@ -32,11 +32,9 @@ describe("ngHyd − remous", () => {
     });
 
     it("when leaving calculated remous page then coming back to it, logs should not be duplicated", async () => {
-        await navBar.clickNewCalculatorButton();
 
         // 1. create new Remous
-        await listPage.clickMenuEntryForCalcType(4);
-        await browser.pause(300);
+        await openCalculator(4, navBar, listPage);
 
         // 2. calculate it, there should be 6 messages in the log
         const calcBtn = await calcPage.getCalculateButton()
@@ -59,11 +57,8 @@ describe("ngHyd − remous", () => {
     });
 
     it("Calculation with large bed width should run successfully", async () => {
-        await navBar.clickNewCalculatorButton();
-
         // 1. create new Remous
-        await listPage.clickMenuEntryForCalcType(4);
-        await browser.pause(300);
+        await openCalculator(4, navBar, listPage);
 
         // 2. Set to trapezoidal section with bank slope of 2m/m and 20 meter width bed
         await changeSelectValue(await calcPage.getSelectById("select_section"), 2);
diff --git a/e2e/reset-param-mode.e2e-spec.ts b/e2e/reset-param-mode.e2e-spec.ts
index 1a1c7ac6ff11db6050bdc8e921057f6a6a87220c..b686e0c33eb8d48c1e7c60f77c7434a84fa0a3d0 100644
--- a/e2e/reset-param-mode.e2e-spec.ts
+++ b/e2e/reset-param-mode.e2e-spec.ts
@@ -1,33 +1,36 @@
 import { ListPage } from "./list.po";
 import { browser, $, $$, expect } from '@wdio/globals'
-import { newSession } from "./util.po";
+import { newSession, openApplication, openCalculator } from "./util.po";
 import { Navbar } from "./navbar.po";
 import { SideNav } from "./sidenav.po";
 import { CalculatorPage } from "./calculator.po";
+import { AppPage } from "./app.po";
 
 /**
  * Parameter mode should be set to its previous mode (fixed/var/...) when cancel is pressed
  * in variable mode edition dialog
  */
 describe("ngHyd - check parameter mode is set to its previous value - ", () => {
+    let startPage: AppPage;
     let listPage: ListPage;
     let navBar: Navbar;
     let sideNav: SideNav;
     let calcPage: CalculatorPage;
 
     beforeAll(() => {
+        startPage = new AppPage();
         listPage = new ListPage();
+        navBar = new Navbar();
+        sideNav = new SideNav();
         calcPage = new CalculatorPage();
     });
 
     it("when min/max/list values dialog is cancelled on 'fish ladder: fall' calculator", async () => {
-        // start page
-        await listPage.navigateTo();
-        await browser.pause(300);
+        await openApplication(startPage);
+        await newSession(navBar, sideNav);
 
         // open 'PAB fall' calculator
-        await listPage.clickMenuEntryForCalcType(12);
-        await browser.pause(200);
+        await openCalculator(12, navBar, listPage);
 
         // click "calc" radio on Z1 parameter
         const z1calcbtn = await calcPage.getInputRadioButtonFromId("Z1", "cal");
@@ -52,13 +55,11 @@ describe("ngHyd - check parameter mode is set to its previous value - ", () => {
     });
 
     it("when min/max/list values dialog is cancelled on 'fish ladder' calculator", async () => {
-        // start page
-        await listPage.navigateTo();
-        await browser.pause(300);
+        await openApplication(startPage);
+        await newSession(navBar, sideNav);
 
         // open PAB calculator
-        await listPage.clickMenuEntryForCalcType(15);
-        await browser.pause(500);
+        await openCalculator(15, navBar, listPage);
 
         // "fixed" radio on Q parameter
         const qfixbtn = await calcPage.getInputRadioButtonFromId("Q", "fix");
diff --git a/e2e/reset-results.e2e-spec.ts b/e2e/reset-results.e2e-spec.ts
index 175af9a9bda3bf65c89edfd6b3c1fb1d9b97480b..b99ce82ac5f36ac5d6b369aa1efc338b25a5c2cd 100644
--- a/e2e/reset-results.e2e-spec.ts
+++ b/e2e/reset-results.e2e-spec.ts
@@ -4,6 +4,7 @@ import { CalculatorPage } from "./calculator.po";
 import { PreferencesPage } from "./preferences.po";
 import { SideNav } from "./sidenav.po";
 import { browser, $, $$, expect } from '@wdio/globals'
+import { openCalculator } from "./util.po";
 
 describe("Check results are reset after application settings modification - ", () => {
     let listPage: ListPage;
@@ -31,15 +32,12 @@ describe("Check results are reset after application settings modification - ", (
 
     async function runTestWithParameter(param: string, val1: number, val2: number) {
         // set starting compute precision
-        const input = await prefPage.getInputFromName(param);
+        let input = await prefPage.getInputFromName(param);
         await input.clearValue();
         await input.setValue(val1.toString());
 
         // open "fish ladder: fall" calculator
-        await navBar.clickNewCalculatorButton();
-        await browser.pause(200);
-        await listPage.clickMenuEntryForCalcType(12);
-        await browser.pause(200);
+        await openCalculator(12, navBar, listPage);
 
         // click "compute" button
         const calcButton = await calcPage.getCalculateButton();
@@ -59,6 +57,7 @@ describe("Check results are reset after application settings modification - ", (
         await browser.pause(200);
 
         // modify compute precision
+        input = await prefPage.getInputFromName(param);
         await input.setValue(val2.toString());
         await browser.pause(500);
 
diff --git a/e2e/section-empty-fields.e2e-spec.ts b/e2e/section-empty-fields.e2e-spec.ts
index 5d867024c690a0aa19da2f2552c95cf0d2b63735..73496834c2901472c70314df451fa9cf015c4d62 100644
--- a/e2e/section-empty-fields.e2e-spec.ts
+++ b/e2e/section-empty-fields.e2e-spec.ts
@@ -3,6 +3,7 @@ import { Navbar } from "./navbar.po";
 import { CalculatorPage } from "./calculator.po";
 import { PreferencesPage } from "./preferences.po";
 import { browser, $, $$, expect } from '@wdio/globals'
+import { openCalculator } from "./util.po";
 
 describe("Check fields are empty in 'parametric section' calculator when created with 'empty fields' option", () => {
     let listPage: ListPage;
@@ -26,9 +27,7 @@ describe("Check fields are empty in 'parametric section' calculator when created
 
     it("", async () => {
         // open "parametric section" calculator
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(2);
-        await browser.pause(200);
+        await openCalculator(2, navBar, listPage);
 
         expect(await calcPage.checkEmptyOrFilledFields(["LargeurBerge", "Ks", "If", "YB", "Q", "Y"], [true, true, true, true, true, true]));
     });
diff --git a/e2e/select-default-value.e2e-spec.ts b/e2e/select-default-value.e2e-spec.ts
index 058408310ab9cfd9a9a115c23a6d24eb75e1d10e..5658675d1d72bd571a68881711133d4b778b62eb 100644
--- a/e2e/select-default-value.e2e-spec.ts
+++ b/e2e/select-default-value.e2e-spec.ts
@@ -3,6 +3,7 @@ import { ListPage } from "./list.po";
 import { Navbar } from "./navbar.po";
 import { PreferencesPage } from "./preferences.po";
 import { browser, $, $$, expect } from '@wdio/globals'
+import { openCalculator } from "./util.po";
 
 describe("check the select default value - ", () => {
     let prefPage: PreferencesPage;
@@ -29,9 +30,7 @@ describe("check the select default value - ", () => {
 
     it("in the 'backwater curve' calculator", async () => {
         // open backwater curve calculator
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(4);
-        await browser.pause(200);
+        await openCalculator(4, navBar, listPage);
 
         // in the calculator configuration file, the default resolution method is 'Trapezes'.
         // let's check this...
@@ -42,9 +41,7 @@ describe("check the select default value - ", () => {
 
     it("in the 'up/downstream elevations of a reach' calculator", async () => {
         // open "up/downstream elevations of a reach" calculator
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(21);
-        await browser.pause(200);
+        await openCalculator(21, navBar, listPage);
 
         // in the calculator configuration file, the default section method is 'Rectangulaire'.
         // let's check this...
diff --git a/e2e/solveur.e2e-spec.ts b/e2e/solveur.e2e-spec.ts
index 88fe956ea6404352486c138ba7e6de213de1e619..b4e37f8202b76d040aea9ead11e0bf2aa4eef2f8 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)");
     });
@@ -77,16 +78,12 @@ describe("Solveur - ", () => {
         await newSession(navBar, sideNav);
 
         // 1. create empty Solveur
-        openCalculator(22, navBar, listPage);
+        await openCalculator(22, navBar, listPage);
 
         // 2. create PAB:Chute, PAB:Nombre and PAB:Puissance linked to one another
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(12); // PAB:Chute
-        await browser.pause(500);
-        await navBar.clickNewCalculatorButton();
+        await openCalculator(12, navBar, listPage); // PAB:Chute
+        await openCalculator(13, navBar, listPage); // PAB:Nombre
 
-        await listPage.clickMenuEntryForCalcType(13); // PAB:Nombre
-        await browser.pause(500);
         // link DHT to PAB:Chute.DH
         const dht = await calcPage.getInputById("DHT");
         await calcPage.setParamMode(dht, "link");
@@ -94,9 +91,8 @@ describe("Solveur - ", () => {
         const dh_nombre = await calcPage.getInputById("DH");
         await calcPage.setParamMode(dh_nombre, "cal");
 
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(6); // PAB:Puissance
-        await browser.pause(500);
+        await openCalculator(6, navBar, listPage); // PAB:Puissance
+
         // link DH to PAB:Nombre.DH
         const dh_puiss = await calcPage.getInputById("DH");
         await calcPage.setParamMode(dh_puiss, "link");
diff --git a/e2e/translation.e2e-spec.ts b/e2e/translation.e2e-spec.ts
index d87a45a7bb449bbf130778b3656b64b56236842f..16c41d2d4f10b93bd6842e0adde31c9b896637c4 100644
--- a/e2e/translation.e2e-spec.ts
+++ b/e2e/translation.e2e-spec.ts
@@ -4,20 +4,19 @@ import { CalculatorPage } from "./calculator.po";
 import { PreferencesPage } from "./preferences.po";
 import { SideNav } from "./sidenav.po";
 import { browser, $, $$, expect } from '@wdio/globals'
+import { openCalculator } from "./util.po";
 
 describe("Check translation", () => {
     let listPage: ListPage;
     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 () => {
@@ -31,9 +30,7 @@ describe("Check translation", () => {
         await prefPage.changeLanguage(1); // fr
 
         // open "fish ladder: fall" calculator
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(12);
-        await browser.pause(200);
+        await openCalculator(12, navBar, listPage);
 
         // set Z2 to variated mode
         const inpZ2 = await calcPage.getInputById("Z2");
@@ -44,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();
@@ -76,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 ec4a1c033b66cb66ab8daf209b96b23c1c6db958..d0c59aa917a73f7ecfd97bd45a610aa1f3d70712 100644
--- a/e2e/util.po.ts
+++ b/e2e/util.po.ts
@@ -3,6 +3,7 @@ import { Navbar } from './navbar.po';
 import { SideNav } from './sidenav.po';
 import { ListPage } from './list.po';
 import { AppPage } from './app.po';
+
 /**
  * scroll page to make element visible
  */
@@ -84,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 2e88357fc5878b2b66d55996f98d8ddaafc1cf7d..46281237e21e21f5f797871feece1c30e3697821 100644
--- a/e2e/valeurs-erronees.e2e-spec.ts
+++ b/e2e/valeurs-erronees.e2e-spec.ts
@@ -3,6 +3,7 @@ import { ListPage } from "./list.po";
 import { Navbar } from "./navbar.po";
 import { PreferencesPage } from "./preferences.po";
 import { browser, $, $$, expect } from '@wdio/globals'
+import { openCalculator } from "./util.po";
 
 describe("ngHyd - check invalid values are removed - ", () => {
     let listPage: ListPage;
@@ -27,24 +28,21 @@ describe("ngHyd - check invalid values are removed - ", () => {
 
     it("when switching to another calculator", async () => {
         // open PAB dimensions calculator
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(5);
-        await browser.pause(200);
+        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
-        await navBar.clickNewCalculatorButton();
-        await listPage.clickMenuEntryForCalcType(12);
-        await browser.pause(200);
+        await openCalculator(12, navBar, listPage);
 
         // back to first calculator
         await navBar.openNthCalculator(0);
         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("");
 
diff --git a/e2e/variable-param-cancel.e2e-spec.ts b/e2e/variable-param-cancel.e2e-spec.ts
index fedb54603dc2310d6837c5584cb09b9cd99754f4..d141b2d2eb845558c0570ac7ef75132336c47f05 100644
--- a/e2e/variable-param-cancel.e2e-spec.ts
+++ b/e2e/variable-param-cancel.e2e-spec.ts
@@ -1,29 +1,36 @@
-import { brotliCompress } from "zlib";
 import { CalculatorPage } from "./calculator.po";
 import { ListPage } from "./list.po";
 import { browser, $, $$, expect } from '@wdio/globals'
+import { newSession, openApplication, openCalculator } from "./util.po";
+import { Navbar } from "./navbar.po";
+import { AppPage } from "./app.po";
+import { SideNav } from "./sidenav.po";
 
 /**
  * Check that a cancel button is present in min/max/list edition dialog
  * for variable parameters
  */
 describe("ngHyd - check cancel button for variable parameters - ", () => {
+    let startPage: AppPage;
     let listPage: ListPage;
     let calcPage: CalculatorPage;
+    let navBar: Navbar;
+    let sideNav: SideNav;
 
     beforeAll(() => {
+        startPage = new AppPage();
         listPage = new ListPage();
         calcPage = new CalculatorPage();
+        navBar = new Navbar();
+        sideNav = new SideNav();
     });
 
     it("when min/max/list values dialog opens, a cancel button should be present", async () => {
-        // start page
-        await listPage.navigateTo();
-        await browser.pause(200);
+        await openApplication(startPage);
+        await newSession(navBar, sideNav);
 
         // open PAB chute
-        await listPage.clickMenuEntryForCalcType(12);
-        await browser.pause(200);
+        await openCalculator(12, navBar, listPage);
 
         // click "var" radio on Z1 parameter
         const z1btn = await calcPage.getInputRadioButtonFromId("Z1", "var");
diff --git a/src/app/formulaire/elements/fieldset.ts b/src/app/formulaire/elements/fieldset.ts
index 73e6b8535049442f73d2a8ac0dd748d32a53feeb..179920686e21ec6afe1b3af5234d5d7a1f25fd9f 100644
--- a/src/app/formulaire/elements/fieldset.ts
+++ b/src/app/formulaire/elements/fieldset.ts
@@ -218,29 +218,6 @@ export class FieldSet extends FormulaireElement implements IProperties {
             this.clearFields();
             this.parseFields();
         }
-        else {
-            const nub = this.parentForm.currentNub;
-            for (const e of this.parentForm.allFormElements) {
-                if (e instanceof NgParameter) {
-                    const p: ParamDefinition = nub.getParameter(e.symbol);
-                    switch (e.paramDefinition.valueMode) {
-                        case ParamValueMode.SINGLE:
-                            e.setValue(this, p.singleValue);
-                            break;
-
-                        case ParamValueMode.MINMAX:
-                            e.setMinValue(this, p.min);
-                            e.setMaxValue(this, p.max);
-                            e.setStepValue(this, p.step);
-                            break;
-
-                        case ParamValueMode.LISTE:
-                            e.setValueList(this, p.valueList);
-                            break;
-                    }
-                }
-            }
-        }
 
         this.updateLocalisation();