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..5a5306f41d3e805e528bfcb5c144b37f9a25aae1 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,20 +305,14 @@ 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");
         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);
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/cote-amont-aval-bief.e2e-spec.ts b/e2e/cote-amont-aval-bief.e2e-spec.ts
index 4e2521c53a33ccd0cfd54ccd0ff1ee10ac58603a..a4788ee9b1fb1f4de5f38bb456eb7c55a4d4343d 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 $(
@@ -84,9 +81,7 @@ 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");
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..f9f58b730fe3ef870fbc278e4e7f22b5ff73c047 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();
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..538aea3b49af2c05097fe045cb343339fe5f11c2 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,14 +29,10 @@ 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");
diff --git a/e2e/load-save-session.e2e-spec.ts b/e2e/load-save-session.e2e-spec.ts
index b8fb8a83e9fdd610613eb6826e0fcf1f34e6660e..23765fbecfc7f21777d812d974a766e8488758ab 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,21 +134,20 @@ 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();
@@ -177,12 +174,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,11 +190,11 @@ 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);
 
diff --git a/e2e/macrorugo-remous.e2e-spec.ts b/e2e/macrorugo-remous.e2e-spec.ts
index 48ff606adaabbb3b3c771f600f7177d8d9dcd4f7..1908b6a19a758818f4a2593ce64aa3d3004bd6b5 100644
--- a/e2e/macrorugo-remous.e2e-spec.ts
+++ b/e2e/macrorugo-remous.e2e-spec.ts
@@ -31,13 +31,8 @@ describe("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");
@@ -45,40 +40,25 @@ describe("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 @@ describe("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/ouvrages-empty-fields.e2e-spec.ts b/e2e/ouvrages-empty-fields.e2e-spec.ts
index 24078502a66f73fe9559fde6eee826a9fc10b755..a9f876f4d1500fdb5421c020f81a11210747e2cf 100644
--- a/e2e/ouvrages-empty-fields.e2e-spec.ts
+++ b/e2e/ouvrages-empty-fields.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'
 
 /**
@@ -32,13 +32,8 @@ describe("ngHyd - check that created/cloned structures have empty fields - ", ()
     });
 
     async function setup() {
-        // start page
-        await navBar.clickNewCalculatorButton();
-        await browser.pause(200);
-
         // open structures calculator
-        await listPage.clickMenuEntryForCalcType(8);
-        await browser.pause(200);
+        await openCalculator(8, navBar, listPage);
     }
 
     it("when a structure calculator is created", async () => {
diff --git a/e2e/pab-cloisons-empty-fields.e2e-spec.ts b/e2e/pab-cloisons-empty-fields.e2e-spec.ts
index 81e107f2b7b8e7676cd1168c5242c24bef9ccca2..afe34020c1d212c88aeeace74b56231e992b1530 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");
@@ -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 28f88a928f0135cb1d009e516268ad570fe95319..c7ec40745f7783b6f6552afdee8396d68e9fda6d 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("Z1");
             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");
@@ -160,11 +160,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 54ebb02952312ad799e8a46d01de02c1611f098a..1316a9ddb8f393fa469d397337994c00392ff636 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 09c79d23b2f5527fdb744664d70aa3023ce6a2ee..f988a8dbbca2f0b248cc17401a08440a3ea2acdc 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 { scrollToElement } from "./util.po";
+import { openCalculator, scrollToElement } from "./util.po";
 
 /**
  * Clone calculators
@@ -32,10 +32,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 11326ca7b30206e7257009c10ad00cdef48ee4bc..856a67c893e1c552aea365793083ca3f954698d2 100644
--- a/e2e/predam-log.e2e-spec.ts
+++ b/e2e/predam-log.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 that low iteration count leads to log messages", () => {
     let listPage: ListPage;
@@ -30,9 +31,7 @@ describe("check that low iteration count leads to log messages", () => {
         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/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..fad95d5f0bcfbf26c3c2b2773b10d451ecb6179e 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;
@@ -36,10 +37,7 @@ describe("Check results are reset after application settings modification - ", (
         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();
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..6bacf6639fb7a516f4d728e04d592eb3bf55f78d 100644
--- a/e2e/solveur.e2e-spec.ts
+++ b/e2e/solveur.e2e-spec.ts
@@ -77,16 +77,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 +90,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..dffdf4997574859ff23c57f1d8d593020ba74eed 100644
--- a/e2e/translation.e2e-spec.ts
+++ b/e2e/translation.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 translation", () => {
     let listPage: ListPage;
@@ -31,9 +32,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");
diff --git a/e2e/util.po.ts b/e2e/util.po.ts
index c6cd6471e9815ede92cd6f774a44838232c03ab9..079bbce3db1df52f162a34c9084de0554f8ad86e 100644
--- a/e2e/util.po.ts
+++ b/e2e/util.po.ts
@@ -2,6 +2,7 @@ import { browser, $, $$, expect } from '@wdio/globals'
 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
@@ -58,6 +59,17 @@ export async function newSession(navBar: Navbar, sideNav: SideNav) {
     }
 }
 
+/**
+ * open application if necessary (ie. if no URL has been open)
+ */
+export async function openApplication(startPage: AppPage) {
+    const url = await browser.getUrl();
+    if (url.indexOf("localhost") === -1) {
+        await startPage.navigateTo();
+        await browser.pause(500);
+    }
+}
+
 export async function openCalculator(id: number, navBar: Navbar, listPage: ListPage) {
     const ncButton = await navBar.getNewCalculatorButton();
     if (await ncButton.isExisting()) {
diff --git a/e2e/valeurs-erronees.e2e-spec.ts b/e2e/valeurs-erronees.e2e-spec.ts
index 2e88357fc5878b2b66d55996f98d8ddaafc1cf7d..a332dced979579aa5eab52fcb5847e138e554ace 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,18 +28,14 @@ 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");
         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);
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");