diff --git a/test/helpers/selenium-helper.js b/test/helpers/selenium-helper.js
index 99320f577083bfaaaca08c425c0dda9ab921cd43..4b0d5440876a3d1a6c0012a0e6b8fa02d6c05dd7 100644
--- a/test/helpers/selenium-helper.js
+++ b/test/helpers/selenium-helper.js
@@ -8,6 +8,11 @@ const {By, until, Button} = webdriver;
 
 const USE_HEADLESS = process.env.USE_HEADLESS !== 'no';
 
+// The main reason for this timeout is so that we can control the timeout message and report details;
+// if we hit the Jasmine default timeout then we get a terse message that we can't control.
+// The Jasmine default timeout is 30 seconds so make sure this is lower.
+const DEFAULT_TIMEOUT_MILLISECONDS = 20 * 1000;
+
 class SeleniumHelper {
     constructor () {
         bindAll(this, [
@@ -26,8 +31,11 @@ class SeleniumHelper {
         ]);
     }
 
-    elementIsVisible (element) {
-        return this.driver.wait(until.elementIsVisible(element));
+    elementIsVisible (element, {
+        message = 'elementIsVisible timed out',
+        timeout = DEFAULT_TIMEOUT_MILLISECONDS
+    } = {}) {
+        return this.driver.wait(until.elementIsVisible(element), timeout, message);
     }
 
     get scope () {
@@ -79,8 +87,11 @@ class SeleniumHelper {
         return this.driver;
     }
 
-    findByXpath (xpath) {
-        return this.driver.wait(until.elementLocated(By.xpath(xpath), 5 * 1000));
+    findByXpath (xpath, {
+        message = `findByXpath timed out for path: ${xpath}`,
+        timeout = DEFAULT_TIMEOUT_MILLISECONDS
+    } = {}) {
+        return this.driver.wait(until.elementLocated(By.xpath(xpath)), timeout, message);
     }
 
     findByText (text, scope) {
@@ -120,8 +131,11 @@ class SeleniumHelper {
         return this.clickXpath(`//button//*[contains(text(), '${text}')]`);
     }
 
-    waitUntilGone (element) {
-        return this.driver.wait(until.stalenessOf(element));
+    waitUntilGone (element, {
+        message = 'waitUntilGone timed out',
+        timeout = DEFAULT_TIMEOUT_MILLISECONDS
+    } = {}) {
+        return this.driver.wait(until.stalenessOf(element), timeout, message);
     }
 
     getLogs (whitelist) {