This is an automated email from the ASF dual-hosted git repository.

benjobs pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/incubator-streampark.git


The following commit(s) were added to refs/heads/dev by this push:
     new cf433de57 [Feature-3862] Add Flink On Yarn Clusters e2e test (#3868)
cf433de57 is described below

commit cf433de57806ab3f8f3f25c9c168b09bf0e9a239
Author: xiangzihao <[email protected]>
AuthorDate: Tue Jul 16 14:09:05 2024 +0800

    [Feature-3862] Add Flink On Yarn Clusters e2e test (#3868)
    
    * add feature 3862
---
 .github/workflows/e2e.yml                          |   6 +
 .../src/views/flink/cluster/Add.vue                |   6 +-
 streampark-e2e/pom.xml                             |   4 +-
 .../e2e/cases/Flink116OnYarnClusterDeployTest.java | 158 +++++++++++++++++++++
 .../e2e/cases/Flink117OnYarnClusterDeployTest.java | 158 +++++++++++++++++++++
 .../e2e/cases/Flink118OnYarnClusterDeployTest.java | 158 +++++++++++++++++++++
 .../org/apache/streampark/e2e/pages/LoginPage.java |   8 +-
 .../streampark/e2e/pages/common/CommonFactory.java |  63 ++++++++
 .../streampark/e2e/pages/common/Constants.java     |   4 +
 .../streampark/e2e/pages/common/NavBarPage.java    |   8 +-
 .../e2e/pages/flink/ApacheFlinkPage.java           |  15 +-
 .../streampark/e2e/pages/flink/FlinkHomePage.java  |  10 +-
 .../pages/flink/applications/ApplicationForm.java  |   5 +-
 .../pages/flink/applications/ApplicationsPage.java |  31 ++--
 .../pages/flink/applications/FlinkSQLEditor.java   |   6 +-
 .../applications/FlinkSQLYarnApplicationForm.java  |   5 +-
 .../pages/flink/clusters/ClusterDetailForm.java    |  81 +++++++++++
 .../CommonForm.java}                               |  45 ++++--
 .../pages/flink/clusters/FlinkClustersPage.java    | 151 ++++++++++++++++++++
 .../e2e/pages/flink/clusters/YarnSessionForm.java  |  72 ++++++++++
 .../e2e/pages/resource/ProjectsPage.java           |  17 ++-
 .../e2e/pages/resource/ResourcePage.java           |   9 +-
 .../streampark/e2e/pages/resource/UploadsPage.java |  16 +--
 .../e2e/pages/resource/VariablesPage.java          |  10 +-
 .../e2e/pages/system/MemberManagementPage.java     |  14 +-
 .../e2e/pages/system/RoleManagementPage.java       |   7 +-
 .../streampark/e2e/pages/system/SystemPage.java    |  13 +-
 .../e2e/pages/system/TeamManagementPage.java       |  10 +-
 .../e2e/pages/system/TokenManagementPage.java      |  10 +-
 .../e2e/pages/system/UserManagementPage.java       |  10 +-
 .../resources/docker/flink-1.16-on-yarn/Dockerfile |   1 +
 .../resources/docker/flink-1.17-on-yarn/Dockerfile |   1 +
 .../resources/docker/flink-1.18-on-yarn/Dockerfile |   1 +
 33 files changed, 991 insertions(+), 122 deletions(-)

diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml
index 5374fc941..ec81ff7dd 100644
--- a/.github/workflows/e2e.yml
+++ b/.github/workflows/e2e.yml
@@ -126,6 +126,12 @@ jobs:
             class: org.apache.streampark.e2e.cases.TeamManagementTest
           - name: MemberManagementTest
             class: org.apache.streampark.e2e.cases.MemberManagementTest
+          - name: Flink116OnYarnClusterDeployTest
+            class: 
org.apache.streampark.e2e.cases.Flink116OnYarnClusterDeployTest
+          - name: Flink117OnYarnClusterDeployTest
+            class: 
org.apache.streampark.e2e.cases.Flink117OnYarnClusterDeployTest
+          - name: Flink118OnYarnClusterDeployTest
+            class: 
org.apache.streampark.e2e.cases.Flink118OnYarnClusterDeployTest
           - name: FlinkSQL116OnYarnTest
             class: org.apache.streampark.e2e.cases.FlinkSQL116OnYarnTest
           - name: FlinkSQL117OnYarnTest
diff --git 
a/streampark-console/streampark-console-webapp/src/views/flink/cluster/Add.vue 
b/streampark-console/streampark-console-webapp/src/views/flink/cluster/Add.vue
index a17cc09f3..c3224a03c 100644
--- 
a/streampark-console/streampark-console-webapp/src/views/flink/cluster/Add.vue
+++ 
b/streampark-console/streampark-console-webapp/src/views/flink/cluster/Add.vue
@@ -53,8 +53,8 @@
         const status = parseInt(res.status);
         if (status === 0) {
           const resp = await fetchCreateCluster(params);
-          if (resp.data.code == 200) {
-            Swal.fire({
+          if (resp) {
+            await Swal.fire({
               icon: 'success',
               title: values.clusterName.concat(
                 
t('setting.flinkCluster.operateMessage.createFlinkSessionClusterSuccessful'),
@@ -64,7 +64,7 @@
             });
             go('/flink/cluster');
           } else {
-            Swal.fire(
+            await Swal.fire(
               'Failed',
               
t('setting.flinkCluster.operateMessage.createFlinkSessionClusterFailed'),
               'error',
diff --git a/streampark-e2e/pom.xml b/streampark-e2e/pom.xml
index 6999ce384..7030fc961 100644
--- a/streampark-e2e/pom.xml
+++ b/streampark-e2e/pom.xml
@@ -31,8 +31,8 @@
     </modules>
 
     <properties>
-        <maven.compiler.source>8</maven.compiler.source>
-        <maven.compiler.target>8</maven.compiler.target>
+        <maven.compiler.source>11</maven.compiler.source>
+        <maven.compiler.target>11</maven.compiler.target>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 
         <junit.version>5.8.1</junit.version>
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/cases/Flink116OnYarnClusterDeployTest.java
 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/cases/Flink116OnYarnClusterDeployTest.java
new file mode 100644
index 000000000..4493ced4e
--- /dev/null
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/cases/Flink116OnYarnClusterDeployTest.java
@@ -0,0 +1,158 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.streampark.e2e.cases;
+
+import org.apache.streampark.e2e.core.StreamPark;
+import org.apache.streampark.e2e.pages.LoginPage;
+import org.apache.streampark.e2e.pages.common.Constants;
+import org.apache.streampark.e2e.pages.flink.ApacheFlinkPage;
+import org.apache.streampark.e2e.pages.flink.FlinkHomePage;
+import org.apache.streampark.e2e.pages.flink.clusters.ClusterDetailForm;
+import org.apache.streampark.e2e.pages.flink.clusters.FlinkClustersPage;
+import org.apache.streampark.e2e.pages.flink.clusters.YarnSessionForm;
+
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.remote.RemoteWebDriver;
+import org.testcontainers.shaded.org.awaitility.Awaitility;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@StreamPark(composeFiles = "docker/flink-1.16-on-yarn/docker-compose.yaml")
+public class Flink116OnYarnClusterDeployTest {
+
+    private static RemoteWebDriver browser;
+
+    private static final String userName = "admin";
+
+    private static final String password = "streampark";
+
+    private static final String teamName = "default";
+
+    private static final String flinkName = "flink-1.16.3";
+
+    private static final String flinkHome = "/flink-1.16.3";
+
+    private static final String flinkDescription = "description test";
+
+    private static final String flinkClusterName = "flink_1.16.3_cluster_e2e";
+
+    private static final String flinkClusterNameEdited = 
"flink_1.16.3_cluster_e2e_edited";
+
+    private static final ClusterDetailForm.ExecutionMode executionMode = 
ClusterDetailForm.ExecutionMode.YARN_SESSION;
+
+    @BeforeAll
+    public static void setup() {
+        FlinkHomePage flinkHomePage = new LoginPage(browser)
+            .login(userName, password, teamName)
+            .goToNav(ApacheFlinkPage.class)
+            .goToTab(FlinkHomePage.class);
+
+        flinkHomePage.createFlinkHome(flinkName, flinkHome, flinkDescription);
+
+        flinkHomePage.goToNav(ApacheFlinkPage.class)
+            .goToTab(FlinkClustersPage.class);
+    }
+
+    @Test
+    @Order(10)
+    public void testCreateFlinkCluster() {
+        final FlinkClustersPage flinkClustersPage = new 
FlinkClustersPage(browser);
+
+        flinkClustersPage.createFlinkCluster()
+            .<YarnSessionForm>addCluster(executionMode)
+            .resolveOrder(YarnSessionForm.ResolveOrder.CHILD_FIRST)
+            .clusterName(flinkClusterName)
+            .flinkVersion(flinkName)
+            .submit();
+
+        Awaitility.await()
+            .untilAsserted(
+                () -> assertThat(flinkClustersPage.flinkClusterList())
+                    .as("Flink clusters list should contain newly-created 
application")
+                    .extracting(WebElement::getText)
+                    .anyMatch(it -> it.contains(flinkClusterName)));
+    }
+
+    @Test
+    @Order(20)
+    public void testEditFlinkCluster() {
+        final FlinkClustersPage flinkClustersPage = new 
FlinkClustersPage(browser);
+
+        flinkClustersPage.editFlinkCluster(flinkClusterName)
+            .<YarnSessionForm>addCluster(executionMode)
+            .clusterName(flinkClusterNameEdited)
+            .submit();
+
+        Awaitility.await()
+            .untilAsserted(
+                () -> assertThat(flinkClustersPage.flinkClusterList())
+                    .as("Flink clusters list should contain edited 
application")
+                    .extracting(WebElement::getText)
+                    .anyMatch(it -> it.contains(flinkClusterNameEdited)));
+    }
+
+    @Test
+    @Order(30)
+    public void testStartFlinkCluster() {
+        final FlinkClustersPage flinkClustersPage = new 
FlinkClustersPage(browser);
+
+        flinkClustersPage.startFlinkCluster(flinkClusterNameEdited);
+
+        Awaitility.await()
+            .untilAsserted(
+                () -> assertThat(flinkClustersPage.flinkClusterList())
+                    .as("Flink clusters list should contain running 
application")
+                    .extracting(WebElement::getText)
+                    .anyMatch(it -> it.contains("RUNNING")));
+    }
+
+    @Test
+    @Order(40)
+    public void testStopFlinkCluster() {
+        final FlinkClustersPage flinkClustersPage = new 
FlinkClustersPage(browser);
+
+        flinkClustersPage.stopFlinkCluster(flinkClusterNameEdited);
+
+        Awaitility.await()
+            .untilAsserted(
+                () -> assertThat(flinkClustersPage.flinkClusterList())
+                    .as("Flink clusters list should contain canceled 
application")
+                    .extracting(WebElement::getText)
+                    .anyMatch(it -> it.contains("CANCELED")));
+    }
+
+    @Test
+    @Order(50)
+    public void testDeleteFlinkCluster() {
+        final FlinkClustersPage flinkClustersPage = new 
FlinkClustersPage(browser);
+
+        flinkClustersPage.deleteFlinkCluster(flinkClusterNameEdited);
+
+        Awaitility.await()
+            .untilAsserted(
+                () -> {
+                    browser.navigate().refresh();
+                    Thread.sleep(Constants.DEFAULT_SLEEP_MILLISECONDS);
+                    assertThat(flinkClustersPage.flinkClusterList())
+                        .noneMatch(it -> 
it.getText().contains(flinkClusterNameEdited));
+                });
+    }
+}
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/cases/Flink117OnYarnClusterDeployTest.java
 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/cases/Flink117OnYarnClusterDeployTest.java
new file mode 100644
index 000000000..1e336ea8e
--- /dev/null
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/cases/Flink117OnYarnClusterDeployTest.java
@@ -0,0 +1,158 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.streampark.e2e.cases;
+
+import org.apache.streampark.e2e.core.StreamPark;
+import org.apache.streampark.e2e.pages.LoginPage;
+import org.apache.streampark.e2e.pages.common.Constants;
+import org.apache.streampark.e2e.pages.flink.ApacheFlinkPage;
+import org.apache.streampark.e2e.pages.flink.FlinkHomePage;
+import org.apache.streampark.e2e.pages.flink.clusters.ClusterDetailForm;
+import org.apache.streampark.e2e.pages.flink.clusters.FlinkClustersPage;
+import org.apache.streampark.e2e.pages.flink.clusters.YarnSessionForm;
+
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.remote.RemoteWebDriver;
+import org.testcontainers.shaded.org.awaitility.Awaitility;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@StreamPark(composeFiles = "docker/flink-1.17-on-yarn/docker-compose.yaml")
+public class Flink117OnYarnClusterDeployTest {
+
+    private static RemoteWebDriver browser;
+
+    private static final String userName = "admin";
+
+    private static final String password = "streampark";
+
+    private static final String teamName = "default";
+
+    private static final String flinkName = "flink-1.17.2";
+
+    private static final String flinkHome = "/flink-1.17.2";
+
+    private static final String flinkDescription = "description test";
+
+    private static final String flinkClusterName = "flink_1.17.2_cluster_e2e";
+
+    private static final String flinkClusterNameEdited = 
"flink_1.17.2_cluster_e2e_edited";
+
+    private static final ClusterDetailForm.ExecutionMode executionMode = 
ClusterDetailForm.ExecutionMode.YARN_SESSION;
+
+    @BeforeAll
+    public static void setup() {
+        FlinkHomePage flinkHomePage = new LoginPage(browser)
+            .login(userName, password, teamName)
+            .goToNav(ApacheFlinkPage.class)
+            .goToTab(FlinkHomePage.class);
+
+        flinkHomePage.createFlinkHome(flinkName, flinkHome, flinkDescription);
+
+        flinkHomePage.goToNav(ApacheFlinkPage.class)
+            .goToTab(FlinkClustersPage.class);
+    }
+
+    @Test
+    @Order(10)
+    public void testCreateFlinkCluster() {
+        final FlinkClustersPage flinkClustersPage = new 
FlinkClustersPage(browser);
+
+        flinkClustersPage.createFlinkCluster()
+            .<YarnSessionForm>addCluster(executionMode)
+            .resolveOrder(YarnSessionForm.ResolveOrder.CHILD_FIRST)
+            .clusterName(flinkClusterName)
+            .flinkVersion(flinkName)
+            .submit();
+
+        Awaitility.await()
+            .untilAsserted(
+                () -> assertThat(flinkClustersPage.flinkClusterList())
+                    .as("Flink clusters list should contain newly-created 
application")
+                    .extracting(WebElement::getText)
+                    .anyMatch(it -> it.contains(flinkClusterName)));
+    }
+
+    @Test
+    @Order(20)
+    public void testEditFlinkCluster() {
+        final FlinkClustersPage flinkClustersPage = new 
FlinkClustersPage(browser);
+
+        flinkClustersPage.editFlinkCluster(flinkClusterName)
+            .<YarnSessionForm>addCluster(executionMode)
+            .clusterName(flinkClusterNameEdited)
+            .submit();
+
+        Awaitility.await()
+            .untilAsserted(
+                () -> assertThat(flinkClustersPage.flinkClusterList())
+                    .as("Flink clusters list should contain edited 
application")
+                    .extracting(WebElement::getText)
+                    .anyMatch(it -> it.contains(flinkClusterNameEdited)));
+    }
+
+    @Test
+    @Order(30)
+    public void testStartFlinkCluster() {
+        final FlinkClustersPage flinkClustersPage = new 
FlinkClustersPage(browser);
+
+        flinkClustersPage.startFlinkCluster(flinkClusterNameEdited);
+
+        Awaitility.await()
+            .untilAsserted(
+                () -> assertThat(flinkClustersPage.flinkClusterList())
+                    .as("Flink clusters list should contain running 
application")
+                    .extracting(WebElement::getText)
+                    .anyMatch(it -> it.contains("RUNNING")));
+    }
+
+    @Test
+    @Order(40)
+    public void testStopFlinkCluster() {
+        final FlinkClustersPage flinkClustersPage = new 
FlinkClustersPage(browser);
+
+        flinkClustersPage.stopFlinkCluster(flinkClusterNameEdited);
+
+        Awaitility.await()
+            .untilAsserted(
+                () -> assertThat(flinkClustersPage.flinkClusterList())
+                    .as("Flink clusters list should contain canceled 
application")
+                    .extracting(WebElement::getText)
+                    .anyMatch(it -> it.contains("CANCELED")));
+    }
+
+    @Test
+    @Order(50)
+    public void testDeleteFlinkCluster() {
+        final FlinkClustersPage flinkClustersPage = new 
FlinkClustersPage(browser);
+
+        flinkClustersPage.deleteFlinkCluster(flinkClusterNameEdited);
+
+        Awaitility.await()
+            .untilAsserted(
+                () -> {
+                    browser.navigate().refresh();
+                    Thread.sleep(Constants.DEFAULT_SLEEP_MILLISECONDS);
+                    assertThat(flinkClustersPage.flinkClusterList())
+                        .noneMatch(it -> 
it.getText().contains(flinkClusterNameEdited));
+                });
+    }
+}
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/cases/Flink118OnYarnClusterDeployTest.java
 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/cases/Flink118OnYarnClusterDeployTest.java
new file mode 100644
index 000000000..cd8ab4e20
--- /dev/null
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/cases/Flink118OnYarnClusterDeployTest.java
@@ -0,0 +1,158 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.streampark.e2e.cases;
+
+import org.apache.streampark.e2e.core.StreamPark;
+import org.apache.streampark.e2e.pages.LoginPage;
+import org.apache.streampark.e2e.pages.common.Constants;
+import org.apache.streampark.e2e.pages.flink.ApacheFlinkPage;
+import org.apache.streampark.e2e.pages.flink.FlinkHomePage;
+import org.apache.streampark.e2e.pages.flink.clusters.ClusterDetailForm;
+import org.apache.streampark.e2e.pages.flink.clusters.FlinkClustersPage;
+import org.apache.streampark.e2e.pages.flink.clusters.YarnSessionForm;
+
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.remote.RemoteWebDriver;
+import org.testcontainers.shaded.org.awaitility.Awaitility;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@StreamPark(composeFiles = "docker/flink-1.18-on-yarn/docker-compose.yaml")
+public class Flink118OnYarnClusterDeployTest {
+
+    private static RemoteWebDriver browser;
+
+    private static final String userName = "admin";
+
+    private static final String password = "streampark";
+
+    private static final String teamName = "default";
+
+    private static final String flinkName = "flink-1.18.1";
+
+    private static final String flinkHome = "/flink-1.18.1";
+
+    private static final String flinkDescription = "description test";
+
+    private static final String flinkClusterName = "flink_1.18.1_cluster_e2e";
+
+    private static final String flinkClusterNameEdited = 
"flink_1.18.1_cluster_e2e_edited";
+
+    private static final ClusterDetailForm.ExecutionMode executionMode = 
ClusterDetailForm.ExecutionMode.YARN_SESSION;
+
+    @BeforeAll
+    public static void setup() {
+        FlinkHomePage flinkHomePage = new LoginPage(browser)
+            .login(userName, password, teamName)
+            .goToNav(ApacheFlinkPage.class)
+            .goToTab(FlinkHomePage.class);
+
+        flinkHomePage.createFlinkHome(flinkName, flinkHome, flinkDescription);
+
+        flinkHomePage.goToNav(ApacheFlinkPage.class)
+            .goToTab(FlinkClustersPage.class);
+    }
+
+    @Test
+    @Order(10)
+    public void testCreateFlinkCluster() {
+        final FlinkClustersPage flinkClustersPage = new 
FlinkClustersPage(browser);
+
+        flinkClustersPage.createFlinkCluster()
+            .<YarnSessionForm>addCluster(executionMode)
+            .resolveOrder(YarnSessionForm.ResolveOrder.CHILD_FIRST)
+            .clusterName(flinkClusterName)
+            .flinkVersion(flinkName)
+            .submit();
+
+        Awaitility.await()
+            .untilAsserted(
+                () -> assertThat(flinkClustersPage.flinkClusterList())
+                    .as("Flink clusters list should contain newly-created 
application")
+                    .extracting(WebElement::getText)
+                    .anyMatch(it -> it.contains(flinkClusterName)));
+    }
+
+    @Test
+    @Order(20)
+    public void testEditFlinkCluster() {
+        final FlinkClustersPage flinkClustersPage = new 
FlinkClustersPage(browser);
+
+        flinkClustersPage.editFlinkCluster(flinkClusterName)
+            .<YarnSessionForm>addCluster(executionMode)
+            .clusterName(flinkClusterNameEdited)
+            .submit();
+
+        Awaitility.await()
+            .untilAsserted(
+                () -> assertThat(flinkClustersPage.flinkClusterList())
+                    .as("Flink clusters list should contain edited 
application")
+                    .extracting(WebElement::getText)
+                    .anyMatch(it -> it.contains(flinkClusterNameEdited)));
+    }
+
+    @Test
+    @Order(30)
+    public void testStartFlinkCluster() {
+        final FlinkClustersPage flinkClustersPage = new 
FlinkClustersPage(browser);
+
+        flinkClustersPage.startFlinkCluster(flinkClusterNameEdited);
+
+        Awaitility.await()
+            .untilAsserted(
+                () -> assertThat(flinkClustersPage.flinkClusterList())
+                    .as("Flink clusters list should contain running 
application")
+                    .extracting(WebElement::getText)
+                    .anyMatch(it -> it.contains("RUNNING")));
+    }
+
+    @Test
+    @Order(40)
+    public void testStopFlinkCluster() {
+        final FlinkClustersPage flinkClustersPage = new 
FlinkClustersPage(browser);
+
+        flinkClustersPage.stopFlinkCluster(flinkClusterNameEdited);
+
+        Awaitility.await()
+            .untilAsserted(
+                () -> assertThat(flinkClustersPage.flinkClusterList())
+                    .as("Flink clusters list should contain canceled 
application")
+                    .extracting(WebElement::getText)
+                    .anyMatch(it -> it.contains("CANCELED")));
+    }
+
+    @Test
+    @Order(50)
+    public void testDeleteFlinkCluster() {
+        final FlinkClustersPage flinkClustersPage = new 
FlinkClustersPage(browser);
+
+        flinkClustersPage.deleteFlinkCluster(flinkClusterNameEdited);
+
+        Awaitility.await()
+            .untilAsserted(
+                () -> {
+                    browser.navigate().refresh();
+                    Thread.sleep(Constants.DEFAULT_SLEEP_MILLISECONDS);
+                    assertThat(flinkClustersPage.flinkClusterList())
+                        .noneMatch(it -> 
it.getText().contains(flinkClusterNameEdited));
+                });
+    }
+}
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/LoginPage.java
 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/LoginPage.java
index 07a715c4d..b58b4b0bb 100644
--- 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/LoginPage.java
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/LoginPage.java
@@ -17,6 +17,7 @@
 
 package org.apache.streampark.e2e.pages;
 
+import org.apache.streampark.e2e.pages.common.Constants;
 import org.apache.streampark.e2e.pages.common.NavBarPage;
 
 import lombok.Getter;
@@ -30,7 +31,6 @@ import org.openqa.selenium.support.PageFactory;
 import org.openqa.selenium.support.ui.ExpectedConditions;
 import org.openqa.selenium.support.ui.WebDriverWait;
 
-import java.time.Duration;
 import java.util.List;
 
 @Getter
@@ -54,7 +54,7 @@ public final class LoginPage extends NavBarPage {
 
     @SneakyThrows
     public NavBarPage login(String username, String password, String teamName) 
{
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(ExpectedConditions.elementToBeClickable(buttonLogin));
 
         inputUsername().sendKeys(username);
@@ -62,7 +62,7 @@ public final class LoginPage extends NavBarPage {
         buttonLogin().click();
 
         try {
-            new WebDriverWait(driver, Duration.ofSeconds(10))
+            new WebDriverWait(driver, 
Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
                 
.until(ExpectedConditions.visibilityOfAllElements(teamForm.btnSelectTeamDropdown));
 
             teamForm.btnSelectTeamDropdown.click();
@@ -78,7 +78,7 @@ public final class LoginPage extends NavBarPage {
             log.warn("No team selection required:", e);
         }
 
-        new WebDriverWait(driver, Duration.ofSeconds(30))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(ExpectedConditions.urlContains("/flink/app"));
         return new NavBarPage(driver);
     }
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/common/CommonFactory.java
 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/common/CommonFactory.java
new file mode 100644
index 000000000..4a4769c04
--- /dev/null
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/common/CommonFactory.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.streampark.e2e.pages.common;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.Keys;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.time.Duration;
+
+public class CommonFactory {
+
+    public static void WebElementDeleteAndInput(WebElement element, String 
value) {
+        element.sendKeys(Keys.CONTROL + "a");
+        element.sendKeys(Keys.BACK_SPACE);
+        element.sendKeys(value);
+    }
+
+    public static void 
WebDriverWaitForElementVisibilityAndInvisibility(WebDriver driver, String msg) {
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
+            .until(
+                ExpectedConditions.visibilityOfElementLocated(
+                    By.xpath(String.format("//*[contains(text(),'%s')]",
+                        msg))));
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
+            .until(
+                ExpectedConditions.invisibilityOfElementLocated(
+                    By.xpath(String.format("//*[contains(text(),'%s')]",
+                        msg))));
+    }
+
+    public static void 
WebDriverWaitForElementVisibilityAndInvisibilityWithDuration(WebDriver driver, 
String msg,
+                                                                               
     Duration duration) {
+        new WebDriverWait(driver, duration)
+            .until(
+                ExpectedConditions.visibilityOfElementLocated(
+                    By.xpath(String.format("//*[contains(text(),'%s')]",
+                        msg))));
+        new WebDriverWait(driver, duration)
+            .until(
+                ExpectedConditions.invisibilityOfElementLocated(
+                    By.xpath(String.format("//*[contains(text(),'%s')]",
+                        msg))));
+    }
+}
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/common/Constants.java
 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/common/Constants.java
index bc9787ad7..7319fc283 100644
--- 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/common/Constants.java
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/common/Constants.java
@@ -19,10 +19,14 @@ package org.apache.streampark.e2e.pages.common;
 
 import lombok.experimental.UtilityClass;
 
+import java.time.Duration;
+
 @UtilityClass
 public class Constants {
 
     public static final Integer DEFAULT_SLEEP_MILLISECONDS = 2000;
 
     public static final Integer DEFAULT_PROJECT_BUILD_TIMEOUT_MINUTES = 5;
+
+    public static final Duration DEFAULT_WEBDRIVER_WAIT_DURATION = 
Duration.ofSeconds(10);
 }
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/common/NavBarPage.java
 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/common/NavBarPage.java
index 969e8643c..4b7dc1cdb 100644
--- 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/common/NavBarPage.java
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/common/NavBarPage.java
@@ -30,8 +30,6 @@ import org.openqa.selenium.support.PageFactory;
 import org.openqa.selenium.support.ui.ExpectedConditions;
 import org.openqa.selenium.support.ui.WebDriverWait;
 
-import java.time.Duration;
-
 @Getter
 public class NavBarPage {
 
@@ -56,7 +54,7 @@ public class NavBarPage {
 
     public <T extends NavBarItem> T goToNav(Class<T> nav) {
         if (nav == ApacheFlinkPage.class) {
-            new WebDriverWait(driver, Duration.ofSeconds(10))
+            new WebDriverWait(driver, 
Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
                 
.until(ExpectedConditions.elementToBeClickable(apacheFlinkTab));
             String tabOpenStateXpath =
                 "//span[contains(@class, 'ml-2') and contains(@class, 
'streampark-simple-menu-sub-title') and contains(text(), 'Apache 
Flink')]/../parent::li[contains(@class, 'streampark-menu-opened')]";
@@ -67,7 +65,7 @@ public class NavBarPage {
         }
 
         if (nav == SystemPage.class) {
-            new WebDriverWait(driver, Duration.ofSeconds(10))
+            new WebDriverWait(driver, 
Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
                 .until(ExpectedConditions.elementToBeClickable(systemTab));
             String tabOpenStateXpath =
                 "//span[contains(@class, 'ml-2') and contains(@class, 
'streampark-simple-menu-sub-title') and contains(text(), 
'System')]/../parent::li[contains(@class, 'streampark-menu-opened')]";
@@ -78,7 +76,7 @@ public class NavBarPage {
         }
 
         if (nav == ResourcePage.class) {
-            new WebDriverWait(driver, Duration.ofSeconds(10))
+            new WebDriverWait(driver, 
Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
                 .until(ExpectedConditions.elementToBeClickable(resourcesTab));
             String tabOpenStateXpath =
                 "//span[contains(@class, 'ml-2') and contains(@class, 
'streampark-simple-menu-sub-title') and contains(text(), 
'Resource')]/../parent::li[contains(@class, 'streampark-menu-opened')]";
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/ApacheFlinkPage.java
 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/ApacheFlinkPage.java
index 2453d1ce6..608b882dd 100644
--- 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/ApacheFlinkPage.java
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/ApacheFlinkPage.java
@@ -17,9 +17,11 @@
 
 package org.apache.streampark.e2e.pages.flink;
 
+import org.apache.streampark.e2e.pages.common.Constants;
 import org.apache.streampark.e2e.pages.common.NavBarPage;
 import org.apache.streampark.e2e.pages.common.NavBarPage.NavBarItem;
 import org.apache.streampark.e2e.pages.flink.applications.ApplicationsPage;
+import org.apache.streampark.e2e.pages.flink.clusters.FlinkClustersPage;
 
 import lombok.Getter;
 import org.openqa.selenium.WebElement;
@@ -28,8 +30,6 @@ import org.openqa.selenium.support.FindBy;
 import org.openqa.selenium.support.ui.ExpectedConditions;
 import org.openqa.selenium.support.ui.WebDriverWait;
 
-import java.time.Duration;
-
 @Getter
 public final class ApacheFlinkPage extends NavBarPage implements NavBarItem {
 
@@ -48,19 +48,26 @@ public final class ApacheFlinkPage extends NavBarPage 
implements NavBarItem {
 
     public <T extends ApacheFlinkPage.Tab> T goToTab(Class<T> tab) {
         if (tab == ApplicationsPage.class) {
-            new WebDriverWait(driver, Duration.ofSeconds(10))
+            new WebDriverWait(driver, 
Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
                 
.until(ExpectedConditions.elementToBeClickable(menuApplications));
             menuApplications.click();
             return tab.cast(new ApplicationsPage(driver));
         }
 
         if (tab == FlinkHomePage.class) {
-            new WebDriverWait(driver, Duration.ofSeconds(10))
+            new WebDriverWait(driver, 
Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
                 .until(ExpectedConditions.elementToBeClickable(menuFlinkHome));
             menuFlinkHome.click();
             return tab.cast(new FlinkHomePage(driver));
         }
 
+        if (tab == FlinkClustersPage.class) {
+            new WebDriverWait(driver, 
Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
+                .until(ExpectedConditions.elementToBeClickable(menuClusters));
+            menuClusters.click();
+            return tab.cast(new FlinkClustersPage(driver));
+        }
+
         throw new UnsupportedOperationException("Unknown tab: " + 
tab.getName());
     }
 
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/FlinkHomePage.java
 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/FlinkHomePage.java
index d50fd7757..6df50e1d4 100644
--- 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/FlinkHomePage.java
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/FlinkHomePage.java
@@ -17,6 +17,7 @@
 
 package org.apache.streampark.e2e.pages.flink;
 
+import org.apache.streampark.e2e.pages.common.Constants;
 import org.apache.streampark.e2e.pages.common.NavBarPage;
 
 import lombok.Getter;
@@ -29,7 +30,6 @@ import org.openqa.selenium.support.PageFactory;
 import org.openqa.selenium.support.ui.ExpectedConditions;
 import org.openqa.selenium.support.ui.WebDriverWait;
 
-import java.time.Duration;
 import java.util.List;
 
 @Getter
@@ -53,7 +53,7 @@ public class FlinkHomePage extends NavBarPage implements 
ApacheFlinkPage.Tab {
     public FlinkHomePage createFlinkHome(String flinkName, String flinkHome, 
String description) {
         waitForPageLoading();
 
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.elementToBeClickable(buttonCreateFlinkHome));
         buttonCreateFlinkHome.click();
         createFlinkHomeForm.inputFlinkName().sendKeys(flinkName);
@@ -113,17 +113,17 @@ public class FlinkHomePage extends NavBarPage implements 
ApacheFlinkPage.Tab {
     }
 
     private void waitForPageLoading() {
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(ExpectedConditions.urlContains("/flink/home"));
     }
 
     private void waitForClickFinish(String message) {
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(
                 ExpectedConditions.visibilityOfElementLocated(
                     By.xpath(String.format("//*[contains(text(),'%s')]",
                         message))));
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(
                 ExpectedConditions.invisibilityOfElementLocated(
                     By.xpath(String.format("//*[contains(text(),'%s')]",
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/applications/ApplicationForm.java
 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/applications/ApplicationForm.java
index 953480982..1f977301f 100644
--- 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/applications/ApplicationForm.java
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/applications/ApplicationForm.java
@@ -30,7 +30,6 @@ import org.openqa.selenium.support.PageFactory;
 import org.openqa.selenium.support.ui.ExpectedConditions;
 import org.openqa.selenium.support.ui.WebDriverWait;
 
-import java.time.Duration;
 import java.util.List;
 
 @Getter
@@ -79,10 +78,10 @@ public final class ApplicationForm {
                                           String flinkVersion,
                                           ApplicationsDynamicParams 
applicationsDynamicParams) {
         Thread.sleep(Constants.DEFAULT_SLEEP_MILLISECONDS);
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.elementToBeClickable(buttonDevelopmentModeDropdown));
         buttonDevelopmentModeDropdown.click();
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.visibilityOfAllElements(selectDevelopmentMode));
         switch (developmentMode) {
             case CUSTOM_CODE:
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/applications/ApplicationsPage.java
 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/applications/ApplicationsPage.java
index 3febb8f7b..57f105795 100644
--- 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/applications/ApplicationsPage.java
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/applications/ApplicationsPage.java
@@ -17,6 +17,7 @@
 
 package org.apache.streampark.e2e.pages.flink.applications;
 
+import org.apache.streampark.e2e.pages.common.Constants;
 import org.apache.streampark.e2e.pages.common.NavBarPage;
 import org.apache.streampark.e2e.pages.flink.ApacheFlinkPage;
 
@@ -30,9 +31,10 @@ import org.openqa.selenium.support.PageFactory;
 import org.openqa.selenium.support.ui.ExpectedConditions;
 import org.openqa.selenium.support.ui.WebDriverWait;
 
-import java.time.Duration;
 import java.util.List;
 
+import static 
org.apache.streampark.e2e.pages.common.CommonFactory.WebDriverWaitForElementVisibilityAndInvisibility;
+
 @Getter
 public class ApplicationsPage extends NavBarPage implements 
ApacheFlinkPage.Tab {
 
@@ -59,7 +61,7 @@ public class ApplicationsPage extends NavBarPage implements 
ApacheFlinkPage.Tab
         waitForPageLoading();
 
         buttonCreateApplication.click();
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(ExpectedConditions.urlContains("/flink/app/add"));
         return new ApplicationForm(driver);
     }
@@ -96,22 +98,22 @@ public class ApplicationsPage extends NavBarPage implements 
ApacheFlinkPage.Tab
 
         StartJobForm startJobForm = new StartJobForm();
         String startJobFormMessage = "Start Job";
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(
                 ExpectedConditions.visibilityOfElementLocated(
                     By.xpath(String.format("//*[contains(.,'%s')]",
                         startJobFormMessage))));
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.elementToBeClickable(startJobForm.radioFromSavepoint()));
         startJobForm.radioFromSavepoint().click();
         startJobForm.buttonSubmit().click();
         String startPopUpMessage = "The current job is starting";
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(
                 ExpectedConditions.visibilityOfElementLocated(
                     By.xpath(String.format("//*[contains(text(),'%s')]",
                         startPopUpMessage))));
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(
                 ExpectedConditions.invisibilityOfElementLocated(
                     By.xpath(String.format("//*[contains(text(),'%s')]",
@@ -151,32 +153,23 @@ public class ApplicationsPage extends NavBarPage 
implements ApacheFlinkPage.Tab
 
         CancelJobForm cancelJobForm = new CancelJobForm();
         String cancelJobFormMessage = "Stop Job";
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(
                 ExpectedConditions.visibilityOfElementLocated(
                     By.xpath(String.format("//*[contains(.,'%s')]",
                         cancelJobFormMessage))));
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.elementToBeClickable(cancelJobForm.radioFromSavepoint()));
         cancelJobForm.radioFromSavepoint().click();
         cancelJobForm.buttonSubmit().click();
         String cancelPopUpMessage = "The current job is canceling";
-        new WebDriverWait(driver, Duration.ofSeconds(10))
-            .until(
-                ExpectedConditions.visibilityOfElementLocated(
-                    By.xpath(String.format("//*[contains(text(),'%s')]",
-                        cancelPopUpMessage))));
-        new WebDriverWait(driver, Duration.ofSeconds(10))
-            .until(
-                ExpectedConditions.invisibilityOfElementLocated(
-                    By.xpath(String.format("//*[contains(text(),'%s')]",
-                        cancelPopUpMessage))));
+        WebDriverWaitForElementVisibilityAndInvisibility(driver, 
cancelPopUpMessage);
 
         return this;
     }
 
     private void waitForPageLoading() {
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(ExpectedConditions.urlContains("/flink/app"));
     }
 
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/applications/FlinkSQLEditor.java
 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/applications/FlinkSQLEditor.java
index 32a4f8fde..c40901187 100644
--- 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/applications/FlinkSQLEditor.java
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/applications/FlinkSQLEditor.java
@@ -17,6 +17,8 @@
 
 package org.apache.streampark.e2e.pages.flink.applications;
 
+import org.apache.streampark.e2e.pages.common.Constants;
+
 import lombok.Getter;
 import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.WebElement;
@@ -26,8 +28,6 @@ import org.openqa.selenium.support.PageFactory;
 import org.openqa.selenium.support.ui.ExpectedConditions;
 import org.openqa.selenium.support.ui.WebDriverWait;
 
-import java.time.Duration;
-
 @Getter
 public final class FlinkSQLEditor {
 
@@ -42,7 +42,7 @@ public final class FlinkSQLEditor {
     }
 
     public FlinkSQLEditor content(String content) {
-        new WebDriverWait(this.driver, Duration.ofSeconds(20))
+        new WebDriverWait(this.driver, 
Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(ExpectedConditions.elementToBeClickable(flinkSqlEditor));
 
         flinkSqlEditor.click();
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/applications/FlinkSQLYarnApplicationForm.java
 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/applications/FlinkSQLYarnApplicationForm.java
index 7544a84b8..d418b9688 100644
--- 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/applications/FlinkSQLYarnApplicationForm.java
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/applications/FlinkSQLYarnApplicationForm.java
@@ -17,6 +17,8 @@
 
 package org.apache.streampark.e2e.pages.flink.applications;
 
+import org.apache.streampark.e2e.pages.common.Constants;
+
 import lombok.Getter;
 import lombok.SneakyThrows;
 import org.openqa.selenium.WebDriver;
@@ -27,7 +29,6 @@ import org.openqa.selenium.support.PageFactory;
 import org.openqa.selenium.support.ui.ExpectedConditions;
 import org.openqa.selenium.support.ui.WebDriverWait;
 
-import java.time.Duration;
 import java.util.List;
 
 @Getter
@@ -53,7 +54,7 @@ public final class FlinkSQLYarnApplicationForm {
     @SneakyThrows
     public FlinkSQLYarnApplicationForm add(String flinkVersion, String 
flinkSql) {
         buttonFlinkVersionDropdown.click();
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.visibilityOfAllElements(selectFlinkVersion));
         selectFlinkVersion.stream()
             .filter(e -> e.getText().equalsIgnoreCase(flinkVersion))
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/clusters/ClusterDetailForm.java
 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/clusters/ClusterDetailForm.java
new file mode 100644
index 000000000..15ad80de6
--- /dev/null
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/clusters/ClusterDetailForm.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.streampark.e2e.pages.flink.clusters;
+
+import lombok.Getter;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.FindBy;
+import org.openqa.selenium.support.FindBys;
+import org.openqa.selenium.support.PageFactory;
+
+import java.util.List;
+
+@Getter
+public class ClusterDetailForm {
+
+    private WebDriver driver;
+
+    @FindBy(xpath = "//div[contains(@codefield, 
'executionMode')]//div[contains(@class, 'ant-select-selector')]")
+    private WebElement buttonExecutionModeDropdown;
+
+    @FindBys({
+            @FindBy(css = "[codefield=executionMode]"),
+            @FindBy(className = "ant-select-item-option-content")
+    })
+    private List<WebElement> selectExecutionMode;
+
+    public ClusterDetailForm(WebDriver driver) {
+        PageFactory.initElements(driver, this);
+
+        this.driver = driver;
+    }
+
+    @SuppressWarnings("unchecked")
+    public <T> T addCluster(ExecutionMode executionMode) {
+        buttonExecutionModeDropdown.click();
+        switch (executionMode) {
+            case YARN_SESSION:
+                selectExecutionMode.stream()
+                    .filter(e -> 
e.getText().equalsIgnoreCase(ExecutionMode.YARN_SESSION.desc()))
+                    .findFirst()
+                    .orElseThrow(() -> new IllegalArgumentException(
+                        String.format("Execution Mode not found: %s", 
executionMode.desc())))
+                    .click();
+                return (T) new YarnSessionForm(this);
+            default:
+                throw new UnsupportedOperationException(
+                    String.format("Unknown execution mode: %s", 
executionMode.desc()));
+        }
+    }
+
+    @Getter
+    public enum ExecutionMode {
+
+        REMOTE("remote"),
+        YARN_SESSION("yarn session"),
+        KUBERNETES_SESSION(
+            "kubernetes session");
+
+        private final String desc;
+
+        ExecutionMode(String desc) {
+            this.desc = desc;
+        }
+    }
+}
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/applications/FlinkSQLYarnApplicationForm.java
 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/clusters/CommonForm.java
similarity index 60%
copy from 
streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/applications/FlinkSQLYarnApplicationForm.java
copy to 
streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/clusters/CommonForm.java
index 7544a84b8..bf111a0c3 100644
--- 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/applications/FlinkSQLYarnApplicationForm.java
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/clusters/CommonForm.java
@@ -15,7 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.streampark.e2e.pages.flink.applications;
+package org.apache.streampark.e2e.pages.flink.clusters;
+
+import org.apache.streampark.e2e.pages.common.Constants;
 
 import lombok.Getter;
 import lombok.SneakyThrows;
@@ -24,17 +26,19 @@ import org.openqa.selenium.WebElement;
 import org.openqa.selenium.support.FindBy;
 import org.openqa.selenium.support.FindBys;
 import org.openqa.selenium.support.PageFactory;
-import org.openqa.selenium.support.ui.ExpectedConditions;
-import org.openqa.selenium.support.ui.WebDriverWait;
 
-import java.time.Duration;
 import java.util.List;
 
+import static 
org.apache.streampark.e2e.pages.common.CommonFactory.WebElementDeleteAndInput;
+
 @Getter
-public final class FlinkSQLYarnApplicationForm {
+public abstract class CommonForm {
 
     private WebDriver driver;
 
+    @FindBy(id = "form_item_clusterName")
+    private WebElement inputFlinkClusterName;
+
     @FindBy(xpath = "//div[contains(@codefield, 
'versionId')]//div[contains(@class, 'ant-select-selector')]")
     private WebElement buttonFlinkVersionDropdown;
 
@@ -44,25 +48,40 @@ public final class FlinkSQLYarnApplicationForm {
     })
     private List<WebElement> selectFlinkVersion;
 
-    public FlinkSQLYarnApplicationForm(WebDriver driver) {
-        this.driver = driver;
+    @FindBy(xpath = "//button[contains(@class, 
'ant-btn')]//span[contains(text(), 'Submit')]")
+    private WebElement buttonSubmit;
+
+    private final ClusterDetailForm parent;
+
+    CommonForm(ClusterDetailForm clusterDetailForm) {
+        final WebDriver driver = clusterDetailForm.driver();
 
         PageFactory.initElements(driver, this);
+
+        this.parent = clusterDetailForm;
+    }
+
+    public CommonForm clusterName(String clusterName) {
+        WebElementDeleteAndInput(inputFlinkClusterName, clusterName);
+        return this;
     }
 
     @SneakyThrows
-    public FlinkSQLYarnApplicationForm add(String flinkVersion, String 
flinkSql) {
+    public CommonForm flinkVersion(String flinkVersion) {
         buttonFlinkVersionDropdown.click();
-        new WebDriverWait(driver, Duration.ofSeconds(10))
-            
.until(ExpectedConditions.visibilityOfAllElements(selectFlinkVersion));
+        Thread.sleep(Constants.DEFAULT_SLEEP_MILLISECONDS);
         selectFlinkVersion.stream()
             .filter(e -> e.getText().equalsIgnoreCase(flinkVersion))
             .findFirst()
-            .orElseThrow(() -> new IllegalArgumentException("Flink version not 
found"))
+            .orElseThrow(() -> new 
IllegalArgumentException(String.format("Flink version not found: %s", 
flinkVersion)))
             .click();
 
-        new FlinkSQLEditor(driver).content(flinkSql);
-
         return this;
     }
+
+    public ClusterDetailForm submit() {
+        buttonSubmit.click();
+
+        return parent();
+    }
 }
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/clusters/FlinkClustersPage.java
 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/clusters/FlinkClustersPage.java
new file mode 100644
index 000000000..977f00a63
--- /dev/null
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/clusters/FlinkClustersPage.java
@@ -0,0 +1,151 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.streampark.e2e.pages.flink.clusters;
+
+import org.apache.streampark.e2e.pages.common.Constants;
+import org.apache.streampark.e2e.pages.common.NavBarPage;
+import org.apache.streampark.e2e.pages.flink.ApacheFlinkPage;
+
+import lombok.Getter;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.remote.RemoteWebDriver;
+import org.openqa.selenium.support.FindBy;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.time.Duration;
+import java.util.List;
+
+import static 
org.apache.streampark.e2e.pages.common.CommonFactory.WebDriverWaitForElementVisibilityAndInvisibility;
+import static 
org.apache.streampark.e2e.pages.common.CommonFactory.WebDriverWaitForElementVisibilityAndInvisibilityWithDuration;
+
+@Getter
+public class FlinkClustersPage extends NavBarPage implements 
ApacheFlinkPage.Tab {
+
+    @FindBy(xpath = "//span[contains(., 'Flink 
Cluster')]/..//button[contains(@class, 'ant-btn')]/span[contains(text(), 'Add 
New')]")
+    private WebElement buttonCreateFlinkCluster;
+
+    @FindBy(xpath = "//div[contains(@class, 'ant-spin-container')]")
+    private List<WebElement> flinkClusterList;
+
+    @FindBy(xpath = "//button[contains(@class, 'ant-btn')]/span[contains(., 
'Yes')]")
+    private WebElement deleteConfirmButton;
+
+    public FlinkClustersPage(RemoteWebDriver driver) {
+        super(driver);
+    }
+
+    public ClusterDetailForm createFlinkCluster() {
+        waitForPageLoading();
+
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
+            
.until(ExpectedConditions.elementToBeClickable(buttonCreateFlinkCluster));
+        buttonCreateFlinkCluster.click();
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
+            .until(ExpectedConditions.urlContains("/flink/add_cluster"));
+
+        return new ClusterDetailForm(driver);
+    }
+
+    public ClusterDetailForm editFlinkCluster(String flinkClusterName) {
+        waitForPageLoading();
+
+        flinkClusterList().stream()
+            .filter(it -> it.getText().contains(flinkClusterName))
+            .flatMap(
+                it -> it
+                    .findElements(
+                        By.className("anticon-edit"))
+                    .stream())
+            .filter(WebElement::isDisplayed)
+            .findFirst()
+            .orElseThrow(() -> new RuntimeException("No edit button in flink 
clusters list"))
+            .click();
+
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
+            .until(ExpectedConditions.urlContains("/flink/edit_cluster"));
+        return new ClusterDetailForm(driver);
+    }
+
+    public FlinkClustersPage startFlinkCluster(String flinkClusterName) {
+        waitForPageLoading();
+
+        flinkClusterList().stream()
+            .filter(it -> it.getText().contains(flinkClusterName))
+            .flatMap(
+                it -> it
+                    .findElements(
+                        By.className("anticon-play-circle"))
+                    .stream())
+            .filter(WebElement::isDisplayed)
+            .findFirst()
+            .orElseThrow(() -> new RuntimeException("No start button in flink 
clusters list"))
+            .click();
+
+        String startMessage = "The current cluster is started";
+        WebDriverWaitForElementVisibilityAndInvisibilityWithDuration(driver, 
startMessage, Duration.ofMinutes(1));
+        return this;
+    }
+
+    public FlinkClustersPage stopFlinkCluster(String flinkClusterName) {
+        waitForPageLoading();
+
+        flinkClusterList().stream()
+            .filter(it -> it.getText().contains(flinkClusterName))
+            .flatMap(
+                it -> it
+                    .findElements(
+                        By.className("anticon-pause-circle"))
+                    .stream())
+            .filter(WebElement::isDisplayed)
+            .findFirst()
+            .orElseThrow(() -> new RuntimeException("No stop button in flink 
clusters list"))
+            .click();
+
+        String stopMessage = "The current cluster is shutdown";
+        WebDriverWaitForElementVisibilityAndInvisibility(driver, stopMessage);
+        return this;
+    }
+
+    public FlinkClustersPage deleteFlinkCluster(String flinkName) {
+        waitForPageLoading();
+
+        flinkClusterList().stream()
+            .filter(it -> it.getText().contains(flinkName))
+            .flatMap(
+                it -> it
+                    .findElements(
+                        By.className("anticon-delete"))
+                    .stream())
+            .filter(WebElement::isDisplayed)
+            .findFirst()
+            .orElseThrow(() -> new RuntimeException("No delete button in flink 
clusters list"))
+            .click();
+
+        deleteConfirmButton.click();
+        String deleteMessage = "The current cluster is remove";
+        WebDriverWaitForElementVisibilityAndInvisibility(driver, 
deleteMessage);
+        return this;
+    }
+
+    private void waitForPageLoading() {
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
+            .until(ExpectedConditions.urlContains("/flink/cluster"));
+    }
+}
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/clusters/YarnSessionForm.java
 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/clusters/YarnSessionForm.java
new file mode 100644
index 000000000..cecde9c65
--- /dev/null
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/flink/clusters/YarnSessionForm.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.streampark.e2e.pages.flink.clusters;
+
+import lombok.Getter;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.FindBy;
+import org.openqa.selenium.support.FindBys;
+
+import java.util.List;
+
+@Getter
+public class YarnSessionForm extends CommonForm {
+
+    private WebDriver driver;
+
+    @FindBy(xpath = "//div[contains(@codefield, 
'resolveOrder')]//div[contains(@class, 'ant-select-selector')]")
+    private WebElement buttonResolveOrderDropdown;
+
+    @FindBys({
+            @FindBy(css = "[codefield=resolveOrder]"),
+            @FindBy(className = "ant-select-item-option-content")
+    })
+    private List<WebElement> selectResolveOrder;
+
+    public YarnSessionForm(ClusterDetailForm clusterDetailForm) {
+        super(clusterDetailForm);
+
+        this.driver = clusterDetailForm.driver();
+    }
+
+    public YarnSessionForm resolveOrder(ResolveOrder resolveOrder) {
+        buttonResolveOrderDropdown.click();
+        selectResolveOrder.stream()
+            .filter(e -> e.getText().equalsIgnoreCase(resolveOrder.desc()))
+            .findFirst()
+            .orElseThrow(
+                () -> new IllegalArgumentException(String.format("Resolve 
Order not found: %s", resolveOrder.desc())))
+            .click();
+
+        return this;
+    }
+
+    @Getter
+    public enum ResolveOrder {
+
+        PARENT_FIRST("parent-first"),
+        CHILD_FIRST("child-first");
+
+        private final String desc;
+
+        ResolveOrder(String desc) {
+            this.desc = desc;
+        }
+    }
+}
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/resource/ProjectsPage.java
 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/resource/ProjectsPage.java
index 236fe267e..67b5b7973 100644
--- 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/resource/ProjectsPage.java
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/resource/ProjectsPage.java
@@ -32,7 +32,6 @@ import org.openqa.selenium.support.PageFactory;
 import org.openqa.selenium.support.ui.ExpectedConditions;
 import org.openqa.selenium.support.ui.WebDriverWait;
 
-import java.time.Duration;
 import java.util.List;
 
 @Getter
@@ -63,7 +62,7 @@ public class ProjectsPage extends NavBarPage implements 
ResourcePage.Tab {
                                       String projectDescription) {
         waitForPageLoading();
         buttonCreateProject.click();
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(ExpectedConditions.urlContains("/project/add"));
 
         createProjectForm.inputProjectName().sendKeys(projectName);
@@ -76,7 +75,7 @@ public class ProjectsPage extends NavBarPage implements 
ResourcePage.Tab {
 
         createProjectForm.inputProjectUrl().sendKeys(projectUrl);
         createProjectForm.selectBranchDropdown().click();
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.visibilityOfAllElements(createProjectForm.selectBranchText()));
         createProjectForm.selectBranchText().stream()
             .filter(e -> e.getText().equalsIgnoreCase(projectBranch))
@@ -107,14 +106,14 @@ public class ProjectsPage extends NavBarPage implements 
ResourcePage.Tab {
             .findElement(
                 By.xpath("//..//li[contains(@class, 
'ant-list-item')]//button[contains(@class, 'ant-btn')][3]"))
             .click();
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(ExpectedConditions.urlContains("/project/edit"));
 
         createProjectForm.inputProjectName().sendKeys(Keys.CONTROL + "a");
         createProjectForm.inputProjectName().sendKeys(Keys.BACK_SPACE);
         createProjectForm.inputProjectName().sendKeys(newProjectName);
         createProjectForm.selectCveDropdown().click();
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.visibilityOfAllElements(createProjectForm.selectCveText()));
         createProjectForm.selectCveText().stream()
             .filter(e -> e.getText().equalsIgnoreCase(projectCvs))
@@ -126,7 +125,7 @@ public class ProjectsPage extends NavBarPage implements 
ResourcePage.Tab {
         createProjectForm.inputProjectUrl().sendKeys(Keys.BACK_SPACE);
         createProjectForm.inputProjectUrl().sendKeys(projectUrl);
         createProjectForm.selectBranchDropdown().click();
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.visibilityOfAllElements(createProjectForm.selectBranchText()));
         createProjectForm.selectBranchText().stream()
             .filter(e -> e.getText().equalsIgnoreCase(projectBranch))
@@ -171,12 +170,12 @@ public class ProjectsPage extends NavBarPage implements 
ResourcePage.Tab {
             .click();
         popupConfirmButton.click();
         String deletePopUpMessage = "delete successful";
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(
                 ExpectedConditions.visibilityOfElementLocated(
                     By.xpath(String.format("//*[contains(text(),'%s')]",
                         deletePopUpMessage))));
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(
                 ExpectedConditions.invisibilityOfElementLocated(
                     By.xpath(String.format("//*[contains(text(),'%s')]",
@@ -186,7 +185,7 @@ public class ProjectsPage extends NavBarPage implements 
ResourcePage.Tab {
     }
 
     private void waitForPageLoading() {
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(ExpectedConditions.urlContains("/resource/project"));
     }
 
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/resource/ResourcePage.java
 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/resource/ResourcePage.java
index 9c7b7985c..e37c41ed8 100644
--- 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/resource/ResourcePage.java
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/resource/ResourcePage.java
@@ -17,6 +17,7 @@
 
 package org.apache.streampark.e2e.pages.resource;
 
+import org.apache.streampark.e2e.pages.common.Constants;
 import org.apache.streampark.e2e.pages.common.NavBarPage;
 import org.apache.streampark.e2e.pages.common.NavBarPage.NavBarItem;
 
@@ -27,8 +28,6 @@ import org.openqa.selenium.support.FindBy;
 import org.openqa.selenium.support.ui.ExpectedConditions;
 import org.openqa.selenium.support.ui.WebDriverWait;
 
-import java.time.Duration;
-
 @Getter
 public final class ResourcePage extends NavBarPage implements NavBarItem {
 
@@ -47,21 +46,21 @@ public final class ResourcePage extends NavBarPage 
implements NavBarItem {
 
     public <T extends ResourcePage.Tab> T goToTab(Class<T> tab) {
         if (tab == VariablesPage.class) {
-            new WebDriverWait(driver, Duration.ofSeconds(10))
+            new WebDriverWait(driver, 
Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
                 .until(ExpectedConditions.elementToBeClickable(menuVariables));
             menuVariables.click();
             return tab.cast(new VariablesPage(driver));
         }
 
         if (tab == ProjectsPage.class) {
-            new WebDriverWait(driver, Duration.ofSeconds(10))
+            new WebDriverWait(driver, 
Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
                 .until(ExpectedConditions.elementToBeClickable(menuProjects));
             menuProjects.click();
             return tab.cast(new ProjectsPage(driver));
         }
 
         if (tab == UploadsPage.class) {
-            new WebDriverWait(driver, Duration.ofSeconds(10))
+            new WebDriverWait(driver, 
Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
                 .until(ExpectedConditions.elementToBeClickable(menuUploads));
             menuUploads.click();
             return tab.cast(new UploadsPage(driver));
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/resource/UploadsPage.java
 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/resource/UploadsPage.java
index 0cfb009c8..59e092138 100644
--- 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/resource/UploadsPage.java
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/resource/UploadsPage.java
@@ -17,6 +17,7 @@
 
 package org.apache.streampark.e2e.pages.resource;
 
+import org.apache.streampark.e2e.pages.common.Constants;
 import org.apache.streampark.e2e.pages.common.NavBarPage;
 
 import lombok.Getter;
@@ -29,7 +30,6 @@ import org.openqa.selenium.support.PageFactory;
 import org.openqa.selenium.support.ui.ExpectedConditions;
 import org.openqa.selenium.support.ui.WebDriverWait;
 
-import java.time.Duration;
 import java.util.List;
 
 @Getter
@@ -61,13 +61,13 @@ public class UploadsPage extends NavBarPage implements 
ResourcePage.Tab {
                                     String description) {
         waitForPageLoading();
 
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.elementToBeClickable(buttonCreateResource));
         buttonCreateResource.click();
 
         // select engine type.
         createUploadForm.btnSelectEngineTypeDropDown().click();
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.visibilityOfAllElements(createUploadForm.selectEngineType()));
         createUploadForm.selectEngineType().stream()
             .filter(e -> e.getText().equals(engineType))
@@ -79,7 +79,7 @@ public class UploadsPage extends NavBarPage implements 
ResourcePage.Tab {
 
         // select resource type.
         createUploadForm.btnSelectResourceTypeDropDown().click();
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.visibilityOfAllElements(createUploadForm.selectResourceType()));
         createUploadForm.selectResourceType().stream()
             .filter(e -> e.getText().equals(resourceType))
@@ -112,7 +112,7 @@ public class UploadsPage extends NavBarPage implements 
ResourcePage.Tab {
 
         // select engine type.
         createUploadForm.btnSelectEngineTypeDropDown().click();
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.visibilityOfAllElements(createUploadForm.selectEngineType()));
         createUploadForm.selectResourceType.stream()
             .filter(e -> e.getText().equals(engineType))
@@ -124,7 +124,7 @@ public class UploadsPage extends NavBarPage implements 
ResourcePage.Tab {
 
         // select resource type.
         createUploadForm.btnSelectResourceTypeDropDown().click();
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.visibilityOfAllElements(createUploadForm.selectResourceType()));
         createUploadForm.selectResourceType().stream()
             .filter(e -> e.getText().equals(resourceType))
@@ -155,7 +155,7 @@ public class UploadsPage extends NavBarPage implements 
ResourcePage.Tab {
             .orElseThrow(() -> new RuntimeException("No delete button in 
resource list"))
             .click();
 
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.elementToBeClickable(deleteConfirmButton));
 
         deleteConfirmButton.click();
@@ -164,7 +164,7 @@ public class UploadsPage extends NavBarPage implements 
ResourcePage.Tab {
     }
 
     private void waitForPageLoading() {
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(ExpectedConditions.urlContains("/resource/upload"));
     }
 
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/resource/VariablesPage.java
 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/resource/VariablesPage.java
index 3d0a78d08..bfe271a79 100644
--- 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/resource/VariablesPage.java
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/resource/VariablesPage.java
@@ -17,6 +17,7 @@
 
 package org.apache.streampark.e2e.pages.resource;
 
+import org.apache.streampark.e2e.pages.common.Constants;
 import org.apache.streampark.e2e.pages.common.NavBarPage;
 
 import lombok.Getter;
@@ -28,7 +29,6 @@ import org.openqa.selenium.support.PageFactory;
 import org.openqa.selenium.support.ui.ExpectedConditions;
 import org.openqa.selenium.support.ui.WebDriverWait;
 
-import java.time.Duration;
 import java.util.List;
 
 @Getter
@@ -59,7 +59,7 @@ public class VariablesPage extends NavBarPage implements 
ResourcePage.Tab {
                                         boolean notVisible) {
         waitForPageLoading();
 
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.elementToBeClickable(buttonCreateVariable));
         buttonCreateVariable.click();
         createVariableForm.inputVariableCode().sendKeys(variableCode);
@@ -88,7 +88,7 @@ public class VariablesPage extends NavBarPage implements 
ResourcePage.Tab {
             .orElseThrow(() -> new RuntimeException("No edit button in 
variable list"))
             .click();
 
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.elementToBeClickable(createVariableForm.buttonSubmit));
         createVariableForm.inputVariableValue().clear();
         createVariableForm.inputVariableValue().sendKeys(variableValue);
@@ -116,7 +116,7 @@ public class VariablesPage extends NavBarPage implements 
ResourcePage.Tab {
             .orElseThrow(() -> new RuntimeException("No delete button in 
variable list"))
             .click();
 
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.elementToBeClickable(deleteConfirmButton));
 
         deleteConfirmButton.click();
@@ -124,7 +124,7 @@ public class VariablesPage extends NavBarPage implements 
ResourcePage.Tab {
     }
 
     private void waitForPageLoading() {
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(ExpectedConditions.urlContains("/resource/variable"));
     }
 
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/system/MemberManagementPage.java
 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/system/MemberManagementPage.java
index e22b55fd2..9101733d1 100644
--- 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/system/MemberManagementPage.java
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/system/MemberManagementPage.java
@@ -17,6 +17,7 @@
 
 package org.apache.streampark.e2e.pages.system;
 
+import org.apache.streampark.e2e.pages.common.Constants;
 import org.apache.streampark.e2e.pages.common.NavBarPage;
 
 import lombok.Getter;
@@ -29,7 +30,6 @@ import org.openqa.selenium.support.PageFactory;
 import org.openqa.selenium.support.ui.ExpectedConditions;
 import org.openqa.selenium.support.ui.WebDriverWait;
 
-import java.time.Duration;
 import java.util.List;
 
 @Getter
@@ -59,13 +59,13 @@ public class MemberManagementPage extends NavBarPage 
implements SystemPage.Tab {
     public MemberManagementPage createMember(String userName, String role) {
         waitForPageLoading();
 
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.elementToBeClickable(buttonCreateMember));
         buttonCreateMember.click();
 
         createMemberForm.btnSelectUserNameDropDown().click();
 
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.visibilityOfAllElements(createMemberForm.selectUserName));
         createMemberForm.selectUserName.stream()
             .filter(e -> e.getText().equals(userName))
@@ -76,7 +76,7 @@ public class MemberManagementPage extends NavBarPage 
implements SystemPage.Tab {
             .click();
 
         createMemberForm().btnSelectRoleDropDown().click();
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.visibilityOfAllElements(createMemberForm.selectRole));
         createMemberForm.selectRole.stream()
             .filter(e -> e.getText().equals(role))
@@ -104,7 +104,7 @@ public class MemberManagementPage extends NavBarPage 
implements SystemPage.Tab {
             .click();
 
         createMemberForm().btnSelectRoleDropDown().click();
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.visibilityOfAllElements(createMemberForm.selectRole));
         createMemberForm.selectRole.stream()
             .filter(e -> e.getText().equals(role))
@@ -131,7 +131,7 @@ public class MemberManagementPage extends NavBarPage 
implements SystemPage.Tab {
             .orElseThrow(() -> new RuntimeException("No delete button in 
member list"))
             .click();
 
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.elementToBeClickable(deleteConfirmButton));
 
         deleteConfirmButton.click();
@@ -140,7 +140,7 @@ public class MemberManagementPage extends NavBarPage 
implements SystemPage.Tab {
     }
 
     private void waitForPageLoading() {
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(ExpectedConditions.urlContains("/system/member"));
     }
 
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/system/RoleManagementPage.java
 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/system/RoleManagementPage.java
index 4a55209fc..13bec2a48 100644
--- 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/system/RoleManagementPage.java
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/system/RoleManagementPage.java
@@ -17,6 +17,7 @@
 
 package org.apache.streampark.e2e.pages.system;
 
+import org.apache.streampark.e2e.pages.common.Constants;
 import org.apache.streampark.e2e.pages.common.NavBarPage;
 
 import lombok.Getter;
@@ -57,7 +58,7 @@ public class RoleManagementPage extends NavBarPage implements 
SystemPage.Tab {
     public RoleManagementPage createRole(String roleName, String description, 
String menuName) {
         waitForPageLoading();
 
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(ExpectedConditions.elementToBeClickable(buttonCreateRole));
         buttonCreateRole.click();
 
@@ -103,7 +104,7 @@ public class RoleManagementPage extends NavBarPage 
implements SystemPage.Tab {
             .orElseThrow(() -> new RuntimeException("No delete button in role 
list"))
             .click();
 
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.elementToBeClickable(deleteConfirmButton));
 
         deleteConfirmButton.click();
@@ -112,7 +113,7 @@ public class RoleManagementPage extends NavBarPage 
implements SystemPage.Tab {
     }
 
     private void waitForPageLoading() {
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(ExpectedConditions.urlContains("/system/role"));
     }
 
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/system/SystemPage.java
 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/system/SystemPage.java
index 14e7035e2..2bbae08be 100644
--- 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/system/SystemPage.java
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/system/SystemPage.java
@@ -17,6 +17,7 @@
 
 package org.apache.streampark.e2e.pages.system;
 
+import org.apache.streampark.e2e.pages.common.Constants;
 import org.apache.streampark.e2e.pages.common.NavBarPage;
 import org.apache.streampark.e2e.pages.common.NavBarPage.NavBarItem;
 
@@ -27,8 +28,6 @@ import org.openqa.selenium.support.FindBy;
 import org.openqa.selenium.support.ui.ExpectedConditions;
 import org.openqa.selenium.support.ui.WebDriverWait;
 
-import java.time.Duration;
-
 @Getter
 public final class SystemPage extends NavBarPage implements NavBarItem {
 
@@ -53,34 +52,34 @@ public final class SystemPage extends NavBarPage implements 
NavBarItem {
 
     public <T extends SystemPage.Tab> T goToTab(Class<T> tab) {
         if (tab == UserManagementPage.class) {
-            new WebDriverWait(driver, Duration.ofSeconds(10))
+            new WebDriverWait(driver, 
Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
                 
.until(ExpectedConditions.elementToBeClickable(menuUserManagement));
             menuUserManagement.click();
             return tab.cast(new UserManagementPage(driver));
         }
 
         if (tab == TeamManagementPage.class) {
-            new WebDriverWait(driver, Duration.ofSeconds(10))
+            new WebDriverWait(driver, 
Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
                 
.until(ExpectedConditions.elementToBeClickable(menuTeamManagement));
             menuTeamManagement.click();
             return tab.cast(new TeamManagementPage(driver));
         }
 
         if (tab == RoleManagementPage.class) {
-            new WebDriverWait(driver, Duration.ofSeconds(10))
+            new WebDriverWait(driver, 
Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
                 
.until(ExpectedConditions.elementToBeClickable(menuRoleManagement));
             menuRoleManagement.click();
             return tab.cast(new RoleManagementPage(driver));
         }
         if (tab == TokenManagementPage.class) {
-            new WebDriverWait(driver, Duration.ofSeconds(10))
+            new WebDriverWait(driver, 
Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
                 
.until(ExpectedConditions.elementToBeClickable(menuTokenManagement));
             menuTokenManagement.click();
             return tab.cast(new TokenManagementPage(driver));
         }
 
         if (tab == MemberManagementPage.class) {
-            new WebDriverWait(driver, Duration.ofSeconds(10))
+            new WebDriverWait(driver, 
Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
                 
.until(ExpectedConditions.elementToBeClickable(menuMemberManagement));
             menuMemberManagement.click();
             return tab.cast(new MemberManagementPage(driver));
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/system/TeamManagementPage.java
 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/system/TeamManagementPage.java
index 179ed253d..ea2f9baff 100644
--- 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/system/TeamManagementPage.java
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/system/TeamManagementPage.java
@@ -17,6 +17,7 @@
 
 package org.apache.streampark.e2e.pages.system;
 
+import org.apache.streampark.e2e.pages.common.Constants;
 import org.apache.streampark.e2e.pages.common.NavBarPage;
 
 import lombok.Getter;
@@ -29,7 +30,6 @@ import org.openqa.selenium.support.PageFactory;
 import org.openqa.selenium.support.ui.ExpectedConditions;
 import org.openqa.selenium.support.ui.WebDriverWait;
 
-import java.time.Duration;
 import java.util.List;
 
 @Getter
@@ -59,7 +59,7 @@ public class TeamManagementPage extends NavBarPage implements 
SystemPage.Tab {
     public TeamManagementPage createTeam(String teamName, String description) {
         waitForPageLoading();
 
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(ExpectedConditions.elementToBeClickable(buttonCreateTeam));
         buttonCreateTeam.click();
         createTeamForm.inputTeamName().sendKeys(teamName);
@@ -82,7 +82,7 @@ public class TeamManagementPage extends NavBarPage implements 
SystemPage.Tab {
             .orElseThrow(() -> new RuntimeException("No edit button in team 
list"))
             .click();
 
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.elementToBeClickable(createTeamForm.buttonSubmit));
         createTeamForm.inputDescription().sendKeys(Keys.CONTROL + "a");
         createTeamForm.inputDescription().sendKeys(Keys.BACK_SPACE);
@@ -106,7 +106,7 @@ public class TeamManagementPage extends NavBarPage 
implements SystemPage.Tab {
             .orElseThrow(() -> new RuntimeException("No delete button in team 
list"))
             .click();
 
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.elementToBeClickable(deleteConfirmButton));
 
         deleteConfirmButton.click();
@@ -115,7 +115,7 @@ public class TeamManagementPage extends NavBarPage 
implements SystemPage.Tab {
     }
 
     private void waitForPageLoading() {
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(ExpectedConditions.urlContains("/system/team"));
     }
 
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/system/TokenManagementPage.java
 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/system/TokenManagementPage.java
index 987e01ad4..32717c747 100644
--- 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/system/TokenManagementPage.java
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/system/TokenManagementPage.java
@@ -17,6 +17,7 @@
 
 package org.apache.streampark.e2e.pages.system;
 
+import org.apache.streampark.e2e.pages.common.Constants;
 import org.apache.streampark.e2e.pages.common.NavBarPage;
 
 import lombok.Getter;
@@ -29,7 +30,6 @@ import org.openqa.selenium.support.PageFactory;
 import org.openqa.selenium.support.ui.ExpectedConditions;
 import org.openqa.selenium.support.ui.WebDriverWait;
 
-import java.time.Duration;
 import java.util.List;
 
 @Getter
@@ -56,11 +56,11 @@ public class TokenManagementPage extends NavBarPage 
implements SystemPage.Tab {
     public TokenManagementPage createToken(String existUserName, String 
description) {
         waitForPageLoading();
 
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(ExpectedConditions.elementToBeClickable(buttonCreateToken));
         buttonCreateToken.click();
 
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.elementToBeClickable(createTokenForm.inputUserName()));
         createTokenForm.inputUserName().sendKeys(existUserName);
         createTokenForm.inputUserName().sendKeys(Keys.RETURN);
@@ -97,7 +97,7 @@ public class TokenManagementPage extends NavBarPage 
implements SystemPage.Tab {
             .orElseThrow(() -> new RuntimeException("No delete button in token 
list"))
             .click();
 
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.elementToBeClickable(deleteConfirmButton));
         deleteConfirmButton.click();
 
@@ -105,7 +105,7 @@ public class TokenManagementPage extends NavBarPage 
implements SystemPage.Tab {
     }
 
     private void waitForPageLoading() {
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(ExpectedConditions.urlContains("/system/token"));
     }
 
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/system/UserManagementPage.java
 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/system/UserManagementPage.java
index 5afcd92f5..c07a2fd57 100644
--- 
a/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/system/UserManagementPage.java
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/java/org/apache/streampark/e2e/pages/system/UserManagementPage.java
@@ -17,6 +17,7 @@
 
 package org.apache.streampark.e2e.pages.system;
 
+import org.apache.streampark.e2e.pages.common.Constants;
 import org.apache.streampark.e2e.pages.common.NavBarPage;
 import org.apache.streampark.e2e.pages.system.entity.UserManagementStatus;
 import org.apache.streampark.e2e.pages.system.entity.UserManagementUserType;
@@ -32,7 +33,6 @@ import org.openqa.selenium.support.PageFactory;
 import org.openqa.selenium.support.ui.ExpectedConditions;
 import org.openqa.selenium.support.ui.WebDriverWait;
 
-import java.time.Duration;
 import java.util.List;
 
 @Getter
@@ -61,7 +61,7 @@ public class UserManagementPage extends NavBarPage implements 
SystemPage.Tab {
                                          UserManagementUserType 
userManagementUserType) {
         waitForPageLoading();
 
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(ExpectedConditions.elementToBeClickable(buttonCreateUser));
         buttonCreateUser.click();
         createUserForm.inputUserName().sendKeys(userName);
@@ -70,7 +70,7 @@ public class UserManagementPage extends NavBarPage implements 
SystemPage.Tab {
         createUserForm.inputEmail().sendKeys(email);
 
         createUserForm.btnSelectUserTypeDropdown().click();
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.visibilityOfAllElements(createUserForm.selectUserType));
         createUserForm.selectUserType.stream()
             .filter(e -> 
e.getText().equalsIgnoreCase(String.valueOf(userManagementUserType)))
@@ -107,7 +107,7 @@ public class UserManagementPage extends NavBarPage 
implements SystemPage.Tab {
         createUserForm.inputEmail().sendKeys(email);
 
         createUserForm.btnSelectUserTypeDropdown().click();
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             
.until(ExpectedConditions.visibilityOfAllElements(createUserForm.selectUserType));
         createUserForm.selectUserType.stream()
             .filter(e -> 
e.getText().equalsIgnoreCase(String.valueOf(userManagementUserType)))
@@ -135,7 +135,7 @@ public class UserManagementPage extends NavBarPage 
implements SystemPage.Tab {
     }
 
     private void waitForPageLoading() {
-        new WebDriverWait(driver, Duration.ofSeconds(10))
+        new WebDriverWait(driver, Constants.DEFAULT_WEBDRIVER_WAIT_DURATION)
             .until(ExpectedConditions.urlContains("/system/user"));
     }
 
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/resources/docker/flink-1.16-on-yarn/Dockerfile
 
b/streampark-e2e/streampark-e2e-case/src/test/resources/docker/flink-1.16-on-yarn/Dockerfile
index 1f65cde46..0cd1d2abe 100644
--- 
a/streampark-e2e/streampark-e2e-case/src/test/resources/docker/flink-1.16-on-yarn/Dockerfile
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/resources/docker/flink-1.16-on-yarn/Dockerfile
@@ -38,6 +38,7 @@ RUN \
     if [ "$TARGETPLATFORM" = "linux/arm64" ];then \
         sudo rm -f /etc/yum.repos.d/*.repo; \
         sudo wget http://mirrors.aliyun.com/repo/Centos-altarch-7.repo -O 
/etc/yum.repos.d/CentOS-Base.repo; \
+        sudo sed -i "s/http:\/\//https:\/\//g" 
/etc/yum.repos.d/CentOS-Base.repo; \
         sudo yum install -y java-1.8.0-openjdk-devel; \
     elif [ "$TARGETPLATFORM" = "linux/amd64" ];then \
         sudo yum install -y java-1.8.0-openjdk-devel; \
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/resources/docker/flink-1.17-on-yarn/Dockerfile
 
b/streampark-e2e/streampark-e2e-case/src/test/resources/docker/flink-1.17-on-yarn/Dockerfile
index 34d4bfaef..a5f6e4063 100644
--- 
a/streampark-e2e/streampark-e2e-case/src/test/resources/docker/flink-1.17-on-yarn/Dockerfile
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/resources/docker/flink-1.17-on-yarn/Dockerfile
@@ -38,6 +38,7 @@ RUN \
     if [ "$TARGETPLATFORM" = "linux/arm64" ];then \
         sudo rm -f /etc/yum.repos.d/*.repo; \
         sudo wget http://mirrors.aliyun.com/repo/Centos-altarch-7.repo -O 
/etc/yum.repos.d/CentOS-Base.repo; \
+        sudo sed -i "s/http:\/\//https:\/\//g" 
/etc/yum.repos.d/CentOS-Base.repo; \
         sudo yum install -y java-1.8.0-openjdk-devel; \
     elif [ "$TARGETPLATFORM" = "linux/amd64" ];then \
         sudo yum install -y java-1.8.0-openjdk-devel; \
diff --git 
a/streampark-e2e/streampark-e2e-case/src/test/resources/docker/flink-1.18-on-yarn/Dockerfile
 
b/streampark-e2e/streampark-e2e-case/src/test/resources/docker/flink-1.18-on-yarn/Dockerfile
index 5f0773e22..f453909ca 100644
--- 
a/streampark-e2e/streampark-e2e-case/src/test/resources/docker/flink-1.18-on-yarn/Dockerfile
+++ 
b/streampark-e2e/streampark-e2e-case/src/test/resources/docker/flink-1.18-on-yarn/Dockerfile
@@ -38,6 +38,7 @@ RUN \
     if [ "$TARGETPLATFORM" = "linux/arm64" ];then \
         sudo rm -f /etc/yum.repos.d/*.repo; \
         sudo wget http://mirrors.aliyun.com/repo/Centos-altarch-7.repo -O 
/etc/yum.repos.d/CentOS-Base.repo; \
+        sudo sed -i "s/http:\/\//https:\/\//g" 
/etc/yum.repos.d/CentOS-Base.repo; \
         sudo yum install -y java-1.8.0-openjdk-devel; \
     elif [ "$TARGETPLATFORM" = "linux/amd64" ];then \
         sudo yum install -y java-1.8.0-openjdk-devel; \

Reply via email to