diff --git a/e2e/calculate-all-params.e2e-spec.ts b/e2e/calculate-all-params.e2e-spec.ts
index 39129ac615e92f804560d9bd3db5f34e8d14f98b..9003678bdf375829abd642fb6555a3d8ff243914 100644
--- a/e2e/calculate-all-params.e2e-spec.ts
+++ b/e2e/calculate-all-params.e2e-spec.ts
@@ -4,6 +4,7 @@ import { Navbar } from "./navbar.po";
 import { PreferencesPage } from "./preferences.po";
 import { browser, element, by } from "protractor";
 import { testedCalcTypes } from "./tested_calctypes";
+import { scrollPageToTop } from "./util.po";
 
 /**
  * For all calculators, try to calculate every parameter: check that only one parameter
@@ -65,7 +66,7 @@ describe("ngHyd − calculate all parameters of all calculators", async () => {
                         // that the calculable parameters are shown
                         if (ct === 30 && i > 0) {
                             // prevents "Element is not clickable at point"
-                            await browser.executeScript("window.scrollTo(0, 0);");
+                            await scrollPageToTop();
                             const inputLink = element(by.css("#pb-data-results-selector .drs-item a"));
                             await inputLink.click();
                         }
diff --git a/e2e/calculator.po.ts b/e2e/calculator.po.ts
index 400f4b0abbc88cf80c09be86d6a159f9362823ea..f816fd4ffd45dc6062143335262fa4657cabdb2e 100644
--- a/e2e/calculator.po.ts
+++ b/e2e/calculator.po.ts
@@ -1,4 +1,5 @@
 import { by, element, ElementFinder, browser } from "protractor";
+import { scrollPageToTop } from "./util.po";
 
 export class CalculatorPage {
 
@@ -287,7 +288,7 @@ export class CalculatorPage {
         const container = await this.findParentContainer(elt);
         // find radio buttons
         const button = container.element(by.css("mat-button-toggle.radio_" + mode + " > button"));
-        await browser.executeScript("window.scrollTo(0, 0);"); // sometimes button slides behind navbar and click() fails
+        await scrollPageToTop(); // sometimes button slides behind navbar and click() fails
         await button.click();
         // for "var" mode, close the modal
         if (mode === "var") {
diff --git a/e2e/clone-all-calc.e2e-spec.ts b/e2e/clone-all-calc.e2e-spec.ts
index e55c8b3f461791ffad1b8207ee81070e7c2b8879..ca352163c6d9e521ff65dd44fc3fc3160867356a 100644
--- a/e2e/clone-all-calc.e2e-spec.ts
+++ b/e2e/clone-all-calc.e2e-spec.ts
@@ -4,6 +4,7 @@ import { Navbar } from "./navbar.po";
 import { browser } from "protractor";
 import { PreferencesPage } from "./preferences.po";
 import { testedCalcTypes } from "./tested_calctypes";
+import { scrollPageToTop } from "./util.po";
 
 /**
  * Clone calculators
@@ -48,7 +49,7 @@ describe("ngHyd − clone all calculators with all possible <select> values", ()
                 const sourceValues = await calcPage.storeAllInputValues();
 
                 // clone calculator
-                await browser.executeScript("window.scrollTo(0, 0);");
+                await scrollPageToTop();
                 await calcPage.clickCloneCalcButton();
                 await browser.sleep(300);
 
diff --git a/e2e/clone-calc.e2e-spec.ts b/e2e/clone-calc.e2e-spec.ts
index c09edd3c8681301af749ec21aeda27dc34e51a54..038a90e661a28a6526a9b143f407842f3bed4329 100644
--- a/e2e/clone-calc.e2e-spec.ts
+++ b/e2e/clone-calc.e2e-spec.ts
@@ -4,6 +4,7 @@ import { CalculatorPage } from "./calculator.po";
 import { Navbar } from "./navbar.po";
 import { browser } from "protractor";
 import { PreferencesPage } from "./preferences.po";
+import { scrollPageToTop } from "./util.po";
 
 /**
  * Clone calculators
@@ -66,7 +67,7 @@ describe("ngHyd − clone a calculator", () => {
         await browser.sleep(500);
 
         // otherwise clickCloneCalcButton() fails with "Element is not clickable at point"
-        await browser.executeScript("window.scrollTo(0, 0);");
+        await scrollPageToTop();
         await calcPage.clickCloneCalcButton();
         await browser.sleep(500);
 
diff --git a/e2e/pab.e2e-spec.ts b/e2e/pab.e2e-spec.ts
index 2f75f8df9d326d084d4302160a18b7ff431de7ac..866f67fb57da855a5c8ce10d407efd3da5616ffc 100644
--- a/e2e/pab.e2e-spec.ts
+++ b/e2e/pab.e2e-spec.ts
@@ -5,6 +5,7 @@ import { browser, by, element } from "protractor";
 import { AppPage } from "./app.po";
 import { SideNav } from "./sidenav.po";
 import { PreferencesPage } from "./preferences.po";
+import { scrollPageToTop } from "./util.po";
 
 /**
  * Clone calculators
@@ -124,7 +125,7 @@ describe("ngHyd − Passe à Bassins", () => {
             await calcButtonCl.click();
 
             // make sure "Generate PAB" button is visible (it might be hidden behind navbar)
-            await browser.executeScript("window.scrollTo(0, 0);");
+            await scrollPageToTop();
             // generate PAB
             const genButton = calcPage.getGeneratePabButton();
             await genButton.isPresent();
@@ -182,7 +183,7 @@ describe("ngHyd − Passe à Bassins", () => {
             await calcButtonCl.click();
 
             // make sure "Generate PAB" button is visible (it might be hidden behind navbar)
-            await browser.executeScript("window.scrollTo(0, 0);");
+            await scrollPageToTop();
             // create PAB from it, changing modal parameters
             const genButton = calcPage.getGeneratePabButton();
             await genButton.click();
diff --git a/e2e/solveur.e2e-spec.ts b/e2e/solveur.e2e-spec.ts
index a542f32ba20103af9ac8f1e42e886e1df209998e..89ca70d6ed4b357ddf9999ae61b08f9b4c4e5a9c 100644
--- a/e2e/solveur.e2e-spec.ts
+++ b/e2e/solveur.e2e-spec.ts
@@ -5,6 +5,7 @@ import { Navbar } from "./navbar.po";
 import { browser, by, element } from "protractor";
 import { SideNav } from "./sidenav.po";
 import { PreferencesPage } from "./preferences.po";
+import { scrollPageToTop } from "./util.po";
 
 /**
  * Clone calculators
@@ -124,8 +125,8 @@ describe("Solveur - ", () => {
         const hasResults = await calcPage.hasResults();
         expect(hasResults).toBe(true);
 
-        // otherwise clickCloneCalcButton() fails with "Element is not clickable at point"
-        await browser.executeScript("window.scrollTo(0, 0);");
+        await scrollPageToTop(); // otherwise clickCloneCalcButton() fails with "Element is not clickable at point"
+
         await calcPage.clickCloneCalcButton();
         await browser.sleep(500);
 
diff --git a/e2e/util.po.ts b/e2e/util.po.ts
new file mode 100644
index 0000000000000000000000000000000000000000..65d5cc7cfc37b472a2a62190d7b7a471886ba1ee
--- /dev/null
+++ b/e2e/util.po.ts
@@ -0,0 +1,8 @@
+import { browser } from "protractor";
+
+/**
+ * scroll page to top
+ */
+export async function scrollPageToTop() {
+    await browser.executeScript("window.scrollTo(0, 0);");
+}