diff --git a/docs/developers-guide/e2e-tests.md b/docs/developers-guide/e2e-tests.md
index 20965b135c594dd741ea98da2a1b936310c06743..8c5c3a61de11ff43704b099deb961098abc126e8 100644
--- a/docs/developers-guide/e2e-tests.md
+++ b/docs/developers-guide/e2e-tests.md
@@ -38,7 +38,7 @@ describe("homepage",() => {
 
 We strongly prefer using selectors like `cy.findByText()` and `cy.findByLabelText()` from [`@testing-library/cypress`](https://github.com/testing-library/cypress-testing-library) since they encourage writing tests that don't depend on implementation details like CSS class names.
 
-Try to avoid repeatedly testing pieces of the application incidentally. For example, if you want to test something about the query builder, jump straight there using a URL like `cy.visit("/question/new?database=1&table=2");` rather than starting from the home page, clicking "Ask a question", etc.
+Try to avoid repeatedly testing pieces of the application incidentally. For example, if you want to test something about the query builder, jump straight there using a helper like `openOrdersTable()` rather than starting from the home page, clicking "New", then "Question", etc.
 
 ## Cypress Documentation
 
diff --git a/frontend/test/metabase-visual/notebook/notebook.cy.spec.js b/frontend/test/metabase-visual/notebook/notebook.cy.spec.js
index 29eacf3bcc6d572eeecf6aef1bf9808d4ee85f49..38b9043d0778fa8d0a947fc3caf1cabd442e40f1 100644
--- a/frontend/test/metabase-visual/notebook/notebook.cy.spec.js
+++ b/frontend/test/metabase-visual/notebook/notebook.cy.spec.js
@@ -87,8 +87,9 @@ describe("visual tests > notebook > Run buttons", () => {
 
   // This tests that the run buttons are the correct size on the Native query page
   it("in Native Query render correctly", () => {
-    cy.visit("/question/new");
-    cy.findByText("Native query").click();
+    cy.visit("/");
+    cy.findByText("New").click();
+    cy.findByText("SQL query").click();
 
     // Check that we're on the blank question page
     cy.findByText("Here's where your results will appear");
diff --git a/frontend/test/metabase/scenarios/admin/datamodel/field.cy.spec.js b/frontend/test/metabase/scenarios/admin/datamodel/field.cy.spec.js
index 8803187efca336353f99315a932452721c9cc034..e5dd65dd0a28f1697d2333fd2b6cf2bca9b64cbe 100644
--- a/frontend/test/metabase/scenarios/admin/datamodel/field.cy.spec.js
+++ b/frontend/test/metabase/scenarios/admin/datamodel/field.cy.spec.js
@@ -3,6 +3,7 @@ import {
   withDatabase,
   visitAlias,
   popover,
+  startNewQuestion,
 } from "__support__/e2e/cypress";
 
 import { SAMPLE_DATABASE } from "__support__/e2e/cypress_sample_database";
@@ -131,8 +132,7 @@ describe.skip("scenarios > admin > datamodel > field", () => {
       cy.findByText("Saved!");
 
       // check that it appears in QB
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
+      startNewQuestion();
       cy.findByText("sqlite").click();
       cy.findByText("Number With Nulls").click();
       cy.findByText("nothin");
diff --git a/frontend/test/metabase/scenarios/binning/binning-reproductions.cy.spec.js b/frontend/test/metabase/scenarios/binning/binning-reproductions.cy.spec.js
index 0bd9bbe1b2f112fccdcb1353deb3fa66f0d06517..79b6ddff217a9dce9cfebdc325f8c5800f46c1bd 100644
--- a/frontend/test/metabase/scenarios/binning/binning-reproductions.cy.spec.js
+++ b/frontend/test/metabase/scenarios/binning/binning-reproductions.cy.spec.js
@@ -203,8 +203,9 @@ describe("binning related reproductions", () => {
       );
     });
 
-    it("should work for simple question", () => {
-      openSummarizeOptions("Simple question");
+    it("should work for simple mode", () => {
+      openSummarizeOptions("Simple mode");
+
       changeBinningForDimension({
         name: "Average of Subtotal",
         fromBinning: "Auto binned",
@@ -214,8 +215,8 @@ describe("binning related reproductions", () => {
       cy.get(".bar");
     });
 
-    it("should work for custom question", () => {
-      openSummarizeOptions("Custom question");
+    it("should work for notebook mode", () => {
+      openSummarizeOptions("Notebook mode");
 
       cy.findByText("Pick the metric you want to see").click();
       cy.findByText("Count of rows").click();
@@ -252,13 +253,11 @@ describe("binning related reproductions", () => {
         },
       });
 
-      cy.intercept("POST", "/api/dataset").as("dataset");
-
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
+      startNewQuestion();
       cy.findByText("Saved Questions").click();
       cy.findByText("SQL Binning").click();
-      cy.wait("@dataset");
+
+      visualize();
       summarize();
     });
 
@@ -298,12 +297,12 @@ describe("binning related reproductions", () => {
 });
 
 function openSummarizeOptions(questionType) {
-  cy.visit("/question/new");
-  cy.findByText(questionType).click();
+  startNewQuestion();
   cy.findByText("Saved Questions").click();
   cy.findByText("16379").click();
 
-  if (questionType === "Simple question") {
+  if (questionType === "Simple mode") {
+    visualize();
     summarize();
   }
 }
diff --git a/frontend/test/metabase/scenarios/binning/qb-explicit-joins.cy.spec.js b/frontend/test/metabase/scenarios/binning/qb-explicit-joins.cy.spec.js
index 6acb9f26a42e7b72d43d567feea061fc890b1ead..a154818f65cbd27e926643d906707a9ef1578613 100644
--- a/frontend/test/metabase/scenarios/binning/qb-explicit-joins.cy.spec.js
+++ b/frontend/test/metabase/scenarios/binning/qb-explicit-joins.cy.spec.js
@@ -65,13 +65,13 @@ describe("scenarios > binning > from a saved QB question with explicit joins", (
     cy.intercept("POST", "/api/dataset").as("dataset");
   });
 
-  context("via simple question", () => {
+  context("via simple mode", () => {
     beforeEach(() => {
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
+      startNewQuestion();
       cy.findByText("Saved Questions").click();
       cy.findByText("QB Binning").click();
-      cy.wait("@dataset");
+
+      visualize();
       summarize();
     });
 
@@ -128,7 +128,7 @@ describe("scenarios > binning > from a saved QB question with explicit joins", (
     });
   });
 
-  context("via custom question", () => {
+  context("via notebook mode", () => {
     beforeEach(() => {
       startNewQuestion();
       cy.findByText("Saved Questions").click();
@@ -197,10 +197,10 @@ describe("scenarios > binning > from a saved QB question with explicit joins", (
 
   context("via column popover", () => {
     beforeEach(() => {
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
+      startNewQuestion();
       cy.findByText("Saved Questions").click();
       cy.findByText("QB Binning").click();
+      visualize();
     });
 
     it("should work for time series", () => {
@@ -298,6 +298,10 @@ function assertQueryBuilderState({
 
   cy.findByText(title);
 
+  cy.get(".y-axis-label")
+    .invoke("text")
+    .should("eq", "Count");
+
   values &&
     cy.get(".axis.x").within(() => {
       values.forEach(value => {
diff --git a/frontend/test/metabase/scenarios/binning/sql.cy.spec.js b/frontend/test/metabase/scenarios/binning/sql.cy.spec.js
index c067b1e6ff4306578a205522cda81c8c06c8bb24..a948ad061534457d5a10c2af64c6ca489b523cc1 100644
--- a/frontend/test/metabase/scenarios/binning/sql.cy.spec.js
+++ b/frontend/test/metabase/scenarios/binning/sql.cy.spec.js
@@ -34,11 +34,10 @@ describe("scenarios > binning > from a saved sql question", () => {
 
   context("via simple question", () => {
     beforeEach(() => {
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
+      startNewQuestion();
       cy.findByText("Saved Questions").click();
       cy.findByText("SQL Binning").click();
-      cy.wait("@dataset");
+      visualize();
       cy.findByTextEnsureVisible("LONGITUDE");
       summarize();
     });
@@ -163,11 +162,10 @@ describe("scenarios > binning > from a saved sql question", () => {
 
   context("via column popover", () => {
     beforeEach(() => {
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
+      startNewQuestion();
       cy.findByText("Saved Questions").click();
       cy.findByText("SQL Binning").click();
-      cy.wait("@dataset");
+      visualize();
       cy.findByTextEnsureVisible("LONGITUDE");
     });
 
diff --git a/frontend/test/metabase/scenarios/collections/collections.cy.spec.js b/frontend/test/metabase/scenarios/collections/collections.cy.spec.js
index e16b48c9fc062ce626951c99b40ecf138343ed85..94242c1a7b2937daab65ea6f6e14cf1914c2e961 100644
--- a/frontend/test/metabase/scenarios/collections/collections.cy.spec.js
+++ b/frontend/test/metabase/scenarios/collections/collections.cy.spec.js
@@ -7,6 +7,7 @@ import {
   navigationSidebar,
   closeNavigationSidebar,
   openNavigationSidebar,
+  startNewQuestion,
 } from "__support__/e2e/cypress";
 import { displaySidebarChildOf } from "./helpers/e2e-collections-sidebar.js";
 import { USERS, USER_GROUPS } from "__support__/e2e/cypress_data";
@@ -415,8 +416,7 @@ describe("scenarios > collection_defaults", () => {
         cy.findByText("Orders");
       });
 
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
+      startNewQuestion();
       popover().within(() => {
         cy.findByText("Saved Questions").click();
         // Note: collection name's first letter is capitalized
diff --git a/frontend/test/metabase/scenarios/dashboard/x-rays.cy.spec.js b/frontend/test/metabase/scenarios/dashboard/x-rays.cy.spec.js
index 7fdde07f9bc84a3e09b23e7520777e26da4cfeb4..6d901219753e9462f0fd851a64fc1b728ee2cfe5 100644
--- a/frontend/test/metabase/scenarios/dashboard/x-rays.cy.spec.js
+++ b/frontend/test/metabase/scenarios/dashboard/x-rays.cy.spec.js
@@ -4,6 +4,8 @@ import {
   visitQuestionAdhoc,
   popover,
   summarize,
+  visualize,
+  startNewQuestion,
 } from "__support__/e2e/cypress";
 
 import { SAMPLE_DB_ID } from "__support__/e2e/cypress_data";
@@ -82,10 +84,10 @@ describe("scenarios > x-rays", () => {
         native: { query: "select * from people" },
       });
 
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
+      startNewQuestion();
       cy.findByText("Saved Questions").click();
       cy.findByText("15655").click();
+      visualize();
       summarize();
       getDimensionByName({ name: "SOURCE" }).click();
       cy.button("Done").click();
diff --git a/frontend/test/metabase/scenarios/downloads/downloads.cy.spec.js b/frontend/test/metabase/scenarios/downloads/downloads.cy.spec.js
index dcd655dbacd72c3b753c13a141e92c6d0d2012e5..3cff4561c63f33f363d062a2417a5dc67279c136 100644
--- a/frontend/test/metabase/scenarios/downloads/downloads.cy.spec.js
+++ b/frontend/test/metabase/scenarios/downloads/downloads.cy.spec.js
@@ -1,4 +1,9 @@
-import { restore, downloadAndAssert } from "__support__/e2e/cypress";
+import {
+  restore,
+  downloadAndAssert,
+  startNewQuestion,
+  visualize,
+} from "__support__/e2e/cypress";
 
 const testCases = ["csv", "xlsx"];
 
@@ -10,11 +15,11 @@ describe("scenarios > question > download", () => {
 
   testCases.forEach(fileType => {
     it(`downloads ${fileType} file`, () => {
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
+      startNewQuestion();
       cy.findByText("Saved Questions").click();
       cy.findByText("Orders, Count").click();
 
+      visualize();
       cy.contains("18,760");
 
       downloadAndAssert({ fileType }, sheet => {
diff --git a/frontend/test/metabase/scenarios/native/data_ref.cy.spec.js b/frontend/test/metabase/scenarios/native/data_ref.cy.spec.js
index 59ea230305c14b8f49df3ca0fd7c11abac4c48b7..d1d7d09ab71aef0ca8fc91772bf3380fbd35d768 100644
--- a/frontend/test/metabase/scenarios/native/data_ref.cy.spec.js
+++ b/frontend/test/metabase/scenarios/native/data_ref.cy.spec.js
@@ -1,4 +1,4 @@
-import { restore } from "__support__/e2e/cypress";
+import { restore, openNativeEditor } from "__support__/e2e/cypress";
 
 describe("scenarios > native question > data reference sidebar", () => {
   beforeEach(() => {
@@ -7,8 +7,7 @@ describe("scenarios > native question > data reference sidebar", () => {
   });
 
   it("should load needed data", () => {
-    cy.visit("/question/new");
-    cy.findByText("Native query").click();
+    openNativeEditor();
     cy.icon("reference").click();
     // Force-clicking was needed here because Cypress complains that "ORDERS" is covered by a <div>
     // TODO: Maybe re-think the structure of that component because that div seems unnecessary anyway
diff --git a/frontend/test/metabase/scenarios/native/native-mysql.cy.spec.js b/frontend/test/metabase/scenarios/native/native-mysql.cy.spec.js
index b2d0ae9de19a713d33eef1cc503cd4f9c1248d3e..48b3864f7aca523bfd21d2248d6614e33c4d20d9 100644
--- a/frontend/test/metabase/scenarios/native/native-mysql.cy.spec.js
+++ b/frontend/test/metabase/scenarios/native/native-mysql.cy.spec.js
@@ -1,4 +1,4 @@
-import { restore, modal } from "__support__/e2e/cypress";
+import { restore, modal, openNativeEditor } from "__support__/e2e/cypress";
 
 const MYSQL_DB_NAME = "QA MySQL8";
 
@@ -9,15 +9,11 @@ describe("scenatios > question > native > mysql", () => {
 
     restore("mysql-8");
     cy.signInAsAdmin();
-
-    cy.visit("/question/new");
-    cy.contains("Native query").click();
-    cy.contains(MYSQL_DB_NAME).click();
   });
 
   it("can write a native MySQL query with a field filter", () => {
     // Write Native query that includes a filter
-    cy.get(".ace_content").type(
+    openNativeEditor({ databaseName: MYSQL_DB_NAME }).type(
       `SELECT TOTAL, CATEGORY FROM ORDERS LEFT JOIN PRODUCTS ON ORDERS.PRODUCT_ID = PRODUCTS.ID [[WHERE PRODUCTS.ID = {{id}}]];`,
       {
         parseSpecialCharSequences: false,
@@ -48,7 +44,9 @@ describe("scenatios > question > native > mysql", () => {
   });
 
   it("can save a native MySQL query", () => {
-    cy.get(".ace_content").type(`SELECT * FROM ORDERS`);
+    openNativeEditor({ databaseName: MYSQL_DB_NAME }).type(
+      `SELECT * FROM ORDERS`,
+    );
     cy.get(".NativeQueryEditor .Icon-play").click();
 
     cy.wait("@dataset");
diff --git a/frontend/test/metabase/scenarios/native/snippets/snippet-permissions.cy.spec.js b/frontend/test/metabase/scenarios/native/snippets/snippet-permissions.cy.spec.js
index a526f8a1af48900e3aafa80e7b4fc5a522773076..cd90f222a56a6c04eaf87efb268aff44e8eafc61 100644
--- a/frontend/test/metabase/scenarios/native/snippets/snippet-permissions.cy.spec.js
+++ b/frontend/test/metabase/scenarios/native/snippets/snippet-permissions.cy.spec.js
@@ -13,8 +13,7 @@ describeEE("scenarios > question > snippets", () => {
   });
 
   it("can create a snippet", () => {
-    cy.visit("/question/new");
-    cy.contains("Native query").click();
+    openNativeEditor();
     cy.icon("snippet").click();
     cy.contains("Create a snippet").click();
     modal().within(() => {
@@ -66,8 +65,7 @@ describeEE("scenarios > question > snippets", () => {
     });
 
     // Grant access
-    cy.visit("/question/new");
-    cy.contains("Native query").click();
+    openNativeEditor();
     cy.icon("snippet").click();
 
     cy.findByTestId("sidebar-right")
@@ -111,9 +109,6 @@ describeEE("scenarios > question > snippets", () => {
   });
 
   it("should let you create a snippet folder and move a snippet into it", () => {
-    cy.visit("/question/new");
-    cy.contains("Native query").click();
-
     // create snippet via API
     cy.request("POST", "/api/native-query-snippet", {
       content: "snippet 1",
@@ -121,6 +116,8 @@ describeEE("scenarios > question > snippets", () => {
       collection_id: null,
     });
 
+    openNativeEditor();
+
     // create folder
     cy.icon("snippet").click();
     cy.findByTestId("sidebar-right")
diff --git a/frontend/test/metabase/scenarios/onboarding/reference/databases.cy.spec.js b/frontend/test/metabase/scenarios/onboarding/reference/databases.cy.spec.js
index 560d9bb0b474e06527038ddedb68103a7733791e..9f86804137b2e158b7b38fa49457e857cc95497e 100644
--- a/frontend/test/metabase/scenarios/onboarding/reference/databases.cy.spec.js
+++ b/frontend/test/metabase/scenarios/onboarding/reference/databases.cy.spec.js
@@ -1,4 +1,4 @@
-import { popover, restore } from "__support__/e2e/cypress";
+import { popover, restore, startNewQuestion } from "__support__/e2e/cypress";
 
 describe("scenarios > reference > databases", () => {
   beforeEach(() => {
@@ -69,8 +69,7 @@ describe("scenarios > reference > databases", () => {
     });
 
     it("should sort databases in new UI based question data selection popover", () => {
-      checkQuestionSourceDatabasesOrder("Simple question");
-      checkQuestionSourceDatabasesOrder("Custom question");
+      checkQuestionSourceDatabasesOrder();
     });
 
     it.skip("should sort databases in new native question data selection popover", () => {
@@ -97,8 +96,7 @@ function checkQuestionSourceDatabasesOrder(question_type) {
       ? ".List-item-title"
       : ".List-section-title";
 
-  cy.visit("/question/new");
-  cy.findByText(question_type).click();
+  startNewQuestion();
   popover().within(() => {
     cy.get(selector)
       .as("databaseName")
diff --git a/frontend/test/metabase/scenarios/permissions/reproductions/13347-cannot-select-saved-question-in-database-without-data-permissions.cy.spec.js b/frontend/test/metabase/scenarios/permissions/reproductions/13347-cannot-select-saved-question-in-database-without-data-permissions.cy.spec.js
index 592a193edf7d386a2a925b18e521f7f713dec07c..b9b67103d9022aa2f041117e447b5a159d86ae0c 100644
--- a/frontend/test/metabase/scenarios/permissions/reproductions/13347-cannot-select-saved-question-in-database-without-data-permissions.cy.spec.js
+++ b/frontend/test/metabase/scenarios/permissions/reproductions/13347-cannot-select-saved-question-in-database-without-data-permissions.cy.spec.js
@@ -1,4 +1,8 @@
-import { restore, withDatabase } from "__support__/e2e/cypress";
+import {
+  restore,
+  withDatabase,
+  startNewQuestion,
+} from "__support__/e2e/cypress";
 import { USER_GROUPS } from "__support__/e2e/cypress_data";
 
 const { ALL_USERS_GROUP } = USER_GROUPS;
@@ -44,8 +48,7 @@ describe.skip("issue 13347", () => {
     it(`${test.toUpperCase()} version:\n should be able to select question (from "Saved Questions") which belongs to the database user doesn't have data-permissions for (metabase#13347)`, () => {
       cy.signIn("none");
 
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
+      startNewQuestion();
       cy.findByText("Saved Questions").click();
 
       test === "QB" ? cy.findByText("Q1").click() : cy.findByText("Q2").click();
diff --git a/frontend/test/metabase/scenarios/question/loading.cy.spec.js b/frontend/test/metabase/scenarios/question/loading.cy.spec.js
index aa8dfa6dfde6df0357b9b5d3c5b5f57bbe0c5e30..42fede8808fc6fe8e72e4786d67c10aaeba34d66 100644
--- a/frontend/test/metabase/scenarios/question/loading.cy.spec.js
+++ b/frontend/test/metabase/scenarios/question/loading.cy.spec.js
@@ -1,4 +1,4 @@
-import { restore } from "__support__/e2e/cypress";
+import { restore, startNewQuestion } from "__support__/e2e/cypress";
 
 describe("scenarios > question > loading behavior", () => {
   beforeEach(() => {
@@ -16,8 +16,7 @@ describe("scenarios > question > loading behavior", () => {
     });
     // let the other preload happen since it matches the actual call from the component
     cy.route({ url: "/api/database?saved=true" }).as("fetch1");
-    cy.visit("/question/new");
-    cy.contains("Simple question").click();
+    startNewQuestion();
 
     cy.route({ url: "/api/database/1/schemas" }).as("fetch2");
     cy.route({ url: "/api/database/1/schema/PUBLIC" }).as("fetch3");
diff --git a/frontend/test/metabase/scenarios/question/nested.cy.spec.js b/frontend/test/metabase/scenarios/question/nested.cy.spec.js
index fbfb99ef1e41c7ba4b9cb864bcedd2d661769cab..7dacf269c68f4f27fbaf8c1594f12bcd0a2341b0 100644
--- a/frontend/test/metabase/scenarios/question/nested.cy.spec.js
+++ b/frontend/test/metabase/scenarios/question/nested.cy.spec.js
@@ -8,6 +8,7 @@ import {
   getDimensionByName,
   summarize,
   visitDashboard,
+  startNewQuestion,
 } from "__support__/e2e/cypress";
 
 import { SAMPLE_DB_ID } from "__support__/e2e/cypress_data";
@@ -47,6 +48,10 @@ describe("scenarios > question > nested (metabase#12568)", () => {
       { loadMetadata: true, interceptAlias: "secondCardQuery" },
     );
 
+    startNewQuestion();
+
+    cy.contains("Saved Questions").click();
+
     // [quarantine] The whole CI was timing out
     // Create a complex native question
     // cy.createNativeQuestion({
@@ -83,10 +88,8 @@ describe("scenarios > question > nested (metabase#12568)", () => {
   });
 
   it("should allow Distribution on a Saved Simple Question", () => {
-    cy.visit("/question/new");
-    cy.contains("Simple question").click();
-    cy.contains("Saved Questions").click();
     cy.contains("GH_12568: Simple").click();
+    visualize();
     cy.contains("Count").click();
     cy.contains("Distribution").click();
     cy.contains("Count by Count: Auto binned");
@@ -94,10 +97,8 @@ describe("scenarios > question > nested (metabase#12568)", () => {
   });
 
   it("should allow Sum over time on a Saved Simple Question", () => {
-    cy.visit("/question/new");
-    cy.contains("Simple question").click();
-    cy.contains("Saved Questions").click();
     cy.contains("GH_12568: Simple").click();
+    visualize();
     cy.contains("Count").click();
     cy.contains("Sum over time").click();
     cy.contains("Sum of Count");
@@ -105,10 +106,8 @@ describe("scenarios > question > nested (metabase#12568)", () => {
   });
 
   it("should allow Distribution on a Saved SQL Question", () => {
-    cy.visit("/question/new");
-    cy.contains("Simple question").click();
-    cy.contains("Saved Questions").click();
     cy.contains("GH_12568: SQL").click();
+    visualize();
     cy.contains("COUNT").click();
     cy.contains("Distribution").click();
     cy.contains("Count by COUNT: Auto binned");
@@ -117,10 +116,8 @@ describe("scenarios > question > nested (metabase#12568)", () => {
 
   // [quarantine] The whole CI was timing out
   it.skip("should allow Sum over time on a Saved SQL Question", () => {
-    cy.visit("/question/new");
-    cy.contains("Simple question").click();
-    cy.contains("Saved Questions").click();
     cy.contains("GH_12568: SQL").click();
+    visualize();
     cy.contains("COUNT").click();
     cy.contains("Sum over time").click();
     cy.contains("Sum of COUNT");
@@ -129,10 +126,8 @@ describe("scenarios > question > nested (metabase#12568)", () => {
 
   // [quarantine] The whole CI was timing out
   it.skip("should allow Distribution on a Saved complex SQL Question", () => {
-    cy.visit("/question/new");
-    cy.contains("Simple question").click();
-    cy.contains("Saved Questions").click();
     cy.contains("GH_12568: Complex SQL").click();
+    visualize();
     cy.contains("Items Sold").click();
     cy.contains("Distribution").click();
     cy.contains("Count by Items Sold: Auto binned");
@@ -292,8 +287,7 @@ describe("scenarios > question > nested", () => {
       "Related issue [#14629](https://github.com/metabase/metabase/issues/14629)",
     );
 
-    cy.server();
-    cy.route("POST", "/api/dataset").as("dataset");
+    cy.intercept("POST", "/api/dataset").as("dataset");
 
     cy.log("Remap Product ID's display value to `title`");
     remapDisplayValueToFK({
@@ -308,14 +302,14 @@ describe("scenarios > question > nested", () => {
     });
 
     // Try to use saved question as a base for a new / nested question
-    cy.visit("/question/new");
-    cy.findByText("Simple question").click();
+    startNewQuestion();
     cy.findByText("Saved Questions").click();
     cy.findByText("Orders (remapped)").click();
 
-    cy.wait("@dataset").then(xhr => {
-      expect(xhr.response.body.error).not.to.exist;
+    visualize(response => {
+      expect(response.body.error).not.to.exist;
     });
+
     cy.findAllByText("Awesome Concrete Shoes");
   });
 
@@ -342,14 +336,14 @@ describe("scenarios > question > nested", () => {
         ordersJoinProducts(QUESTION_NAME);
 
         // Start new question from a saved one
-        cy.visit("/question/new");
-        cy.findByText("Simple question").click();
+        startNewQuestion();
         cy.findByText("Saved Questions").click();
         cy.findByText(QUESTION_NAME).click();
 
-        cy.wait("@dataset").then(xhr => {
-          expect(xhr.response.body.error).not.to.exist;
+        visualize(response => {
+          expect(response.body.error).not.to.exist;
         });
+
         cy.contains("37.65");
       });
 
@@ -365,32 +359,30 @@ describe("scenarios > question > nested", () => {
         );
 
         // Start new question from already saved nested question
-        cy.visit("/question/new");
-        cy.findByText("Simple question").click();
+        startNewQuestion();
         cy.findByText("Saved Questions").click();
         cy.findByText(SECOND_QUESTION_NAME).click();
 
-        cy.wait("@dataset").then(xhr => {
-          expect(xhr.response.body.error).not.to.exist;
+        visualize(response => {
+          expect(response.body.error).not.to.exist;
         });
+
         cy.contains("37.65");
       });
     });
   });
 
   it("'distribution' should work on a joined table from a saved question (metabase#14787)", () => {
-    cy.intercept("POST", "/api/dataset").as("dataset");
-
     // Set the display really wide and really tall to avoid any scrolling
     cy.viewport(1600, 1200);
 
     ordersJoinProducts("14787");
     // This repro depends on these exact steps - it has to be opened from the saved questions
-    cy.visit("/question/new");
-    cy.findByText("Simple question").click();
+    startNewQuestion();
     cy.findByText("Saved Questions").click();
     cy.findByText("14787").click();
-    cy.wait("@dataset");
+
+    visualize();
 
     // The column title
     cy.findByText("Products → Category").click();
@@ -398,6 +390,7 @@ describe("scenarios > question > nested", () => {
     cy.wait("@dataset");
 
     summarize();
+
     cy.findByText("Group by")
       .parent()
       .within(() => {
@@ -431,8 +424,6 @@ describe("scenarios > question > nested", () => {
 
   ["count", "average"].forEach(test => {
     it(`${test.toUpperCase()}:\n should be able to use aggregation functions on saved native question (metabase#15397)`, () => {
-      cy.intercept("POST", "/api/dataset").as("dataset");
-
       cy.createNativeQuestion(
         {
           name: "15397",
@@ -444,12 +435,11 @@ describe("scenarios > question > nested", () => {
         { loadMetadata: true },
       );
 
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
+      startNewQuestion();
       cy.findByText("Saved Questions").click();
       cy.findByText("15397").click();
 
-      cy.wait("@dataset");
+      visualize();
       summarize();
 
       if (test === "average") {
@@ -528,10 +518,10 @@ describe("scenarios > question > nested", () => {
       cy.get(".ScalarValue").findByText(value);
 
       // Start new question based on the saved one
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
+      startNewQuestion();
       cy.findByText("Saved Questions").click();
       cy.findByText(name).click();
+      visualize();
       cy.get(".ScalarValue").findByText(value);
     }
   });
diff --git a/frontend/test/metabase/scenarios/question/new.cy.spec.js b/frontend/test/metabase/scenarios/question/new.cy.spec.js
index 5a1521d5abe367e52f47cbb4bfc1b05647ee5ef2..7872f16f435d32baa6b0bfc067e8e08fbf5e7ad1 100644
--- a/frontend/test/metabase/scenarios/question/new.cy.spec.js
+++ b/frontend/test/metabase/scenarios/question/new.cy.spec.js
@@ -39,14 +39,9 @@ describe("scenarios > question > new", () => {
       });
     }
 
-    // First test UI for Simple question
-    cy.visit("/question/new");
-    cy.findByText("Simple question").click();
-    cy.findByText("Pick your data");
-    cy.findByText("Sample3").isVisibleInPopover();
-
-    // Then move to the Custom question UI
     startNewQuestion();
+
+    cy.contains("Pick your starting data");
     cy.findByText("Sample3").isVisibleInPopover();
   });
 
@@ -71,31 +66,6 @@ describe("scenarios > question > new", () => {
   });
 
   describe("data picker search", () => {
-    describe("on a (simple) question page", () => {
-      beforeEach(() => {
-        cy.visit("/question/new");
-        cy.findByText("Simple question").click();
-        cy.findByPlaceholderText("Search for a table…").type("Ord");
-      });
-
-      it("should allow to search saved questions", () => {
-        cy.findByText("Orders, Count").click();
-        cy.findByText("18,760");
-      });
-
-      it("should allow to search and select tables", () => {
-        cy.findAllByText("Orders")
-          .closest("li")
-          .findByText("Table in")
-          .parent()
-          .findByTestId("search-result-item-name")
-          .click();
-        cy.url().should("include", "question#");
-        cy.findByText("Sample Database");
-        cy.findByText("Orders");
-      });
-    });
-
     describe("on a (custom) question page", () => {
       beforeEach(() => {
         startNewQuestion();
@@ -135,31 +105,6 @@ describe("scenarios > question > new", () => {
   });
 
   describe("saved question picker", () => {
-    describe("on a (simple) question page", () => {
-      beforeEach(() => {
-        cy.visit("/question/new");
-        cy.findByText("Simple question").click();
-        cy.findByText("Saved Questions").click();
-      });
-
-      it("should display the collection tree on the left side", () => {
-        popover().findByText("Our analytics");
-      });
-
-      it("should display the saved questions list on the right side", () => {
-        cy.findByText("Orders, Count, Grouped by Created At (year)");
-        cy.findByText("Orders");
-        cy.findByText("Orders, Count").click();
-        cy.findByText("18,760");
-      });
-
-      it("should perform a search scoped to saved questions", () => {
-        cy.findByPlaceholderText("Search for a question…").type("Grouped");
-        cy.findByText("Orders, Count, Grouped by Created At (year)").click();
-        cy.findByText("1,994");
-      });
-    });
-
     describe("on a (custom) question page", () => {
       beforeEach(() => {
         startNewQuestion();
@@ -223,14 +168,6 @@ describe("scenarios > question > new", () => {
   });
 
   describe("ask a (simple) question", () => {
-    it("should load orders table", () => {
-      cy.visit("/question/new");
-      cy.contains("Simple question").click();
-      cy.contains("Sample Database").click();
-      cy.contains("Orders").click();
-      cy.contains("37.65");
-    });
-
     it.skip("should handle (removing) multiple metrics when one is sorted (metabase#13990)", () => {
       cy.intercept("POST", `/api/dataset`).as("dataset");
 
@@ -412,7 +349,7 @@ describe("scenarios > question > new", () => {
 
     it("summarizing by distinct datetime should allow granular selection (metabase#13098)", () => {
       // Go straight to orders table in custom questions
-      cy.visit("/question/new?database=1&table=2&mode=notebook");
+      openOrdersTable({ mode: "notebook" });
 
       summarize({ mode: "notebook" });
       popover().within(() => {
diff --git a/frontend/test/metabase/scenarios/question/query-external.cy.spec.js b/frontend/test/metabase/scenarios/question/query-external.cy.spec.js
index 1cbd59a2d77a75b57c2984dc3b9154ce08ae295c..39e93ca08f57a11e4c9697ab049465229424ede7 100644
--- a/frontend/test/metabase/scenarios/question/query-external.cy.spec.js
+++ b/frontend/test/metabase/scenarios/question/query-external.cy.spec.js
@@ -1,4 +1,4 @@
-import { restore } from "__support__/e2e/cypress";
+import { restore, startNewQuestion, visualize } from "__support__/e2e/cypress";
 
 const supportedDatabases = [
   {
@@ -23,12 +23,11 @@ supportedDatabases.forEach(({ database, snapshotName, dbName }) => {
     });
 
     it(`can query ${database} database`, () => {
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
+      startNewQuestion();
       cy.findByText(dbName).click();
       cy.findByText("Orders").click();
 
-      cy.wait("@dataset");
+      visualize();
       cy.contains("37.65");
     });
   });
diff --git a/frontend/test/metabase/scenarios/question/reproductions/13263-postgres-show-row-details-on-pk-click.js b/frontend/test/metabase/scenarios/question/reproductions/13263-postgres-show-row-details-on-pk-click.js
index 216964b5a56f71e9c6de2f06752de72524ad6fa7..2e5193598ddf93a911f931733fd0e9bb7480efdd 100644
--- a/frontend/test/metabase/scenarios/question/reproductions/13263-postgres-show-row-details-on-pk-click.js
+++ b/frontend/test/metabase/scenarios/question/reproductions/13263-postgres-show-row-details-on-pk-click.js
@@ -1,4 +1,4 @@
-import { restore } from "__support__/e2e/cypress";
+import { restore, startNewQuestion, visualize } from "__support__/e2e/cypress";
 
 const PG_DB_NAME = "QA Postgres12";
 
@@ -8,12 +8,10 @@ export function issue13263() {
       restore("postgres-12");
       cy.signInAsAdmin();
 
-      cy.visit("/question/new");
-      cy.findByText("Simple question").click();
-      cy.findByText(PG_DB_NAME)
-        .should("be.visible")
-        .click();
+      startNewQuestion();
+      cy.findByTextEnsureVisible(PG_DB_NAME).click();
       cy.findByTextEnsureVisible("Orders").click();
+      visualize();
     });
 
     it("should show row details when clicked on its entity key (metabase#13263)", () => {
diff --git a/frontend/test/metabase/scenarios/question/reproductions/14957-unable-to-save-question-before-query-executed.js b/frontend/test/metabase/scenarios/question/reproductions/14957-unable-to-save-question-before-query-executed.js
index e80cebb96bbe00d7441805cb0c4bc88a23d5e2eb..3b2e96eeced0f64c4b8570980bbfdf941ff7c111 100644
--- a/frontend/test/metabase/scenarios/question/reproductions/14957-unable-to-save-question-before-query-executed.js
+++ b/frontend/test/metabase/scenarios/question/reproductions/14957-unable-to-save-question-before-query-executed.js
@@ -1,4 +1,4 @@
-import { restore, modal } from "__support__/e2e/cypress";
+import { restore, modal, openNativeEditor } from "__support__/e2e/cypress";
 
 const PG_DB_NAME = "QA Postgres12";
 
@@ -7,16 +7,12 @@ export function issue14957() {
     beforeEach(() => {
       restore("postgres-12");
       cy.signInAsAdmin();
-
-      cy.visit("/question/new");
-      cy.findByText("Native query").click();
-      cy.findByText(PG_DB_NAME)
-        .should("be.visible")
-        .click();
     });
 
     it("should save a question before query has been executed (metabase#14957)", () => {
-      cy.get(".ace_content").type("select pg_sleep(60)");
+      openNativeEditor({ databaseName: PG_DB_NAME }).type(
+        "select pg_sleep(60)",
+      );
 
       cy.findByText("Save").click();
 
diff --git a/frontend/test/metabase/scenarios/question/saved.cy.spec.js b/frontend/test/metabase/scenarios/question/saved.cy.spec.js
index edfb85c188b0a2c609e95376a9fa3fd875d614c6..94cffd40c0b6fc47310fceceb0b872a607c3566a 100644
--- a/frontend/test/metabase/scenarios/question/saved.cy.spec.js
+++ b/frontend/test/metabase/scenarios/question/saved.cy.spec.js
@@ -5,6 +5,8 @@ import {
   openOrdersTable,
   summarize,
   visitQuestion,
+  startNewQuestion,
+  visualize,
 } from "__support__/e2e/cypress";
 
 describe("scenarios > question > saved", () => {
@@ -134,15 +136,15 @@ describe("scenarios > question > saved", () => {
     cy.findByText(/This is a question/i).should("not.exist");
   });
 
-  it("should be able to use integer filter on a saved native query (metabase#15808)", () => {
+  it("should be able to use integer filter on a nested query based on a saved native question (metabase#15808)", () => {
     cy.createNativeQuestion({
       name: "15808",
       native: { query: "select * from products" },
     });
-    cy.visit("/question/new");
-    cy.findByText("Simple question").click();
+    startNewQuestion();
     cy.findByText("Saved Questions").click();
     cy.findByText("15808").click();
+    visualize();
     cy.findAllByText("Filter")
       .first()
       .click();
diff --git a/frontend/test/metabase/scenarios/visualizations/drillthroughs/chart_drill.cy.spec.js b/frontend/test/metabase/scenarios/visualizations/drillthroughs/chart_drill.cy.spec.js
index 813ef62d3a2bb61fee0dcdca24ee7f8c6de165df..0d827c64c52494d7af755297deb225b3a4a1b1e9 100644
--- a/frontend/test/metabase/scenarios/visualizations/drillthroughs/chart_drill.cy.spec.js
+++ b/frontend/test/metabase/scenarios/visualizations/drillthroughs/chart_drill.cy.spec.js
@@ -9,6 +9,7 @@ import {
   summarize,
   visitQuestion,
   visitDashboard,
+  startNewQuestion,
 } from "__support__/e2e/cypress";
 
 import { USER_GROUPS, SAMPLE_DB_ID } from "__support__/e2e/cypress_data";
@@ -281,8 +282,7 @@ describe("scenarios > visualizations > drillthroughs > chart drill", () => {
     // There's a slight hiccup in the UI with nested questions when we Summarize by City below.
     // Because there's only 5 rows, it automatically switches to the chart, but issues another
     // dataset request. So we wait for the dataset to load.
-    cy.server();
-    cy.route("POST", "/api/dataset").as("dataset");
+    cy.intercept("POST", "/api/dataset").as("dataset");
 
     // People in CA
     cy.createQuestion({
@@ -290,8 +290,7 @@ describe("scenarios > visualizations > drillthroughs > chart drill", () => {
       query: { "source-table": PEOPLE_ID, limit: 5 },
     });
     // Build a new question off that grouping by City
-    cy.visit("/question/new");
-    cy.contains("Simple question").click();
+    startNewQuestion();
     cy.contains("Saved Questions").click();
     cy.contains("CA People").click();
     cy.contains("Hudson Borer");