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

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


The following commit(s) were added to refs/heads/dev by this push:
     new e97b470  [Test-2995][e2e] run workflow and timing testCase (#3201)
e97b470 is described below

commit e97b4707a5e1adb6913112369a344c34891740f2
Author: xingchun-chen <[email protected]>
AuthorDate: Tue Jul 14 11:48:13 2020 +0800

    [Test-2995][e2e] run workflow and timing testCase (#3201)
    
    * add LoginTest license
    
    * Delete useless packages
    
    * e2e add project and workflow case
    
    * e2e add project and workflow case
    
    * e2e add project and workflow case
    
    * e2e add project and workflow case
    
    * e2e add project and workflow case
    
    * e2e add project and workflow case
    
    * e2e add project and workflow case
    
    * e2e add project and workflow case
    
    * e2e add project and workflow case
    
    * e2e add project and workflow case
    
    * e2e add project and workflow case
    
    * e2e add project and workflow case
    
    * Update worker_group_id to worker_group in init.sql
    
    * Update worker_group_id to worker_group in init.sql
    
    * Update worker_group_id to worker_group
    
    * Increase dataX environment variable, sslTrust default value
    
    * modify dataX environment variable
    
    * update e2e chrome version
    
    * add alert manage testcase and Optimize test case execution order
    
    * add e2e to create and to  edit  queue
    
    * update e2e chrome version
    
    * add e2e token testcase
    
    * add e2e token testcase
    
    * add e2e to run workflow testcase
    
    * add e2e timing testcase
    
    * add e2e timing testcase
    
    * add e2e timing testcase
    
    * add e2e timing testcase
    
    * Merge remote-tracking branch 'upstream/dev' into dev
    
    # Conflicts:
    #   
e2e/src/test/java/org/apache/dolphinscheduler/page/security/AlertManagePage.java
    #   
e2e/src/test/java/org/apache/dolphinscheduler/page/security/QueueManagePage.java
    
    * Merge remote-tracking branch 'upstream/dev' into dev
    
    # Conflicts:
    #   
e2e/src/test/java/org/apache/dolphinscheduler/page/security/AlertManagePage.java
    #   
e2e/src/test/java/org/apache/dolphinscheduler/page/security/QueueManagePage.java
    
    * Merge remote-tracking branch 'upstream/dev' into dev
    
    # Conflicts:
    #   
e2e/src/test/java/org/apache/dolphinscheduler/page/security/AlertManagePage.java
    #   
e2e/src/test/java/org/apache/dolphinscheduler/page/security/QueueManagePage.java
    
    * Merge remote-tracking branch 'upstream/dev' into dev
    
    # Conflicts:
    #   
e2e/src/test/java/org/apache/dolphinscheduler/page/security/AlertManagePage.java
    #   
e2e/src/test/java/org/apache/dolphinscheduler/page/security/QueueManagePage.java
    
    * Merge remote-tracking branch 'upstream/dev' into dev
    
    # Conflicts:
    #   
e2e/src/test/java/org/apache/dolphinscheduler/page/security/AlertManagePage.java
    #   
e2e/src/test/java/org/apache/dolphinscheduler/page/security/QueueManagePage.java
    
    * Merge remote-tracking branch 'upstream/dev' into dev
    
    # Conflicts:
    #   
e2e/src/test/java/org/apache/dolphinscheduler/page/security/AlertManagePage.java
    #   
e2e/src/test/java/org/apache/dolphinscheduler/page/security/QueueManagePage.java
    
    * Merge remote-tracking branch 'upstream/dev' into dev
    
    # Conflicts:
    #   
e2e/src/test/java/org/apache/dolphinscheduler/page/security/AlertManagePage.java
    #   
e2e/src/test/java/org/apache/dolphinscheduler/page/security/QueueManagePage.java
    
    * Merge remote-tracking branch 'upstream/dev' into dev
    
    # Conflicts:
    #   
e2e/src/test/java/org/apache/dolphinscheduler/page/security/AlertManagePage.java
    #   
e2e/src/test/java/org/apache/dolphinscheduler/page/security/QueueManagePage.java
    
    * Merge remote-tracking branch 'upstream/dev' into dev
    
    # Conflicts:
    #   
e2e/src/test/java/org/apache/dolphinscheduler/page/security/AlertManagePage.java
    #   
e2e/src/test/java/org/apache/dolphinscheduler/page/security/QueueManagePage.java
    
    * Merge remote-tracking branch 'upstream/dev' into dev
    
    # Conflicts:
    #   
e2e/src/test/java/org/apache/dolphinscheduler/page/security/AlertManagePage.java
    #   
e2e/src/test/java/org/apache/dolphinscheduler/page/security/QueueManagePage.java
    
    * Merge remote-tracking branch 'upstream/dev' into dev
    
    # Conflicts:
    #   
e2e/src/test/java/org/apache/dolphinscheduler/page/security/AlertManagePage.java
    #   
e2e/src/test/java/org/apache/dolphinscheduler/page/security/QueueManagePage.java
    
    * Merge remote-tracking branch 'upstream/dev' into dev
    
    # Conflicts:
    #   
e2e/src/test/java/org/apache/dolphinscheduler/page/security/AlertManagePage.java
    #   
e2e/src/test/java/org/apache/dolphinscheduler/page/security/QueueManagePage.java
    
    * Merge remote-tracking branch 'upstream/dev' into dev
    
    # Conflicts:
    #   
e2e/src/test/java/org/apache/dolphinscheduler/page/security/AlertManagePage.java
    #   
e2e/src/test/java/org/apache/dolphinscheduler/page/security/QueueManagePage.java
    
    * edit user
    
    * edit user
    
    * edit user
    
    * edit user
    
    * edit user
    
    * Update TimingLocator.java
    
    * modify ci log
    
    * Update ci_e2e.yml
    
    modify ci logs
    
    * Update ci_e2e.yml
    
    modify ci logs
    
    * Update ci_e2e.yml
    
    modify ci logs
    
    * Update ci_e2e.yml
    
    * Update ci_e2e.yml
    
    modify ci logs
    
    * Update ci_e2e.yml
    
    modify ci logs
    
    * Update ci_e2e.yml
    
    modify ci logs
    
    * Update ci_e2e.yml
    
    modify ci logs
    
    * Update ci_e2e.yml
    
    modify artifact version
    
    * Update ci_e2e.yml
    
    * Update ci_e2e.yml
    
    modify /var/lib/docker/volumes  permissions
    
    * Update ci_e2e.yml
    
    modify ci logs
    
    * Update ci_e2e.yml
    
    Modify log file permissions
    
    * Update ci_e2e.yml
    
    modify logs
    
    * Update ci_e2e.yml
    
    modify logs
    
    * Update ci_e2e.yml
    
    modify logs
    
    * modify ci logs
    
    * modify ci logs
    
    * modify ci logs
    
    * modify ci logs
    
    * Update ci_e2e.yml
    
    modify ci logs
    
    * modify ci logs
    
    * modify ci logs
    
    * modify ci logs
    
    * modify ci logs
    
    * modify ci logs
    
    * modify ci logs
    
    * modify ci logs
    
    * Update ci_e2e.yml
    
    modify ci logs
    
    * modify ci logs
    
    * modify ci logs
    
    * modify ci logs
    
    * modify ci logs
    
    * modify ci logs
    
    * modify ci logs
    
    * modify ci logs
    
    * modify ci logs
    
    * modify ci logs
    
    * modify ci logs
    
    * modify tenant
    
    * modify alert wait time
    
    * modify queue wait time
    
    * modify alert wait time
    
    * modify alert wait time
    
    * modify alert wait time
    
    * modify alert wait time
    
    * modify alert wait time
    
    * modify alert wait time
    
    * modify button xpath
    
    * modify queue xpath
    
    * Ignore edit user
    
    * modify alert wait time
    
    * print delete user log
    
    * modify the xpath of delete user button
    
    * modify timing wait time
    
    Co-authored-by: chenxingchun <[email protected]>
    Co-authored-by: dailidong <[email protected]>
---
 .github/workflows/ci_e2e.yml                       |   4 +-
 docker/docker-swarm/docker-compose.yml             |  13 +-
 .../dolphinscheduler/common/BrowserCommon.java     |  17 +++
 .../RunWorkflowData.java}                          |  19 +--
 .../TimingData.java}                               |  22 ++--
 .../data/security/UserManageData.java              |  10 ++
 .../locator/project/CreateWorkflowLocator.java     |  18 ++-
 .../locator/project/RunWorkflowLocator.java        |  48 ++++++++
 .../locator/project/TimingLocator.java             |  61 ++++++++++
 .../locator/security/TokenManageLocator.java       |   2 +-
 .../locator/security/UserManageLocator.java        |  22 +++-
 .../page/project/CreateProjectPage.java            |   1 -
 .../page/project/CreateWorkflowPage.java           |  29 ++++-
 .../page/project/RunWorkflowPage.java              |  53 ++++++++
 .../dolphinscheduler/page/project/TimingPage.java  | 134 +++++++++++++++++++++
 .../page/security/AlertManagePage.java             |   8 +-
 .../page/security/QueueManagePage.java             |   8 +-
 .../page/security/UserManagePage.java              |  79 +++++++++++-
 .../testDeleteData/TestDeleteWorkflow.java         |  11 +-
 .../testcase/testProject/TestCreateWorkflow.java   |   4 +
 ...estCreateWorkflow.java => TestRunWorkflow.java} |  24 ++--
 .../testcase/testProject/TestTiming.java           |  75 ++++++++++++
 .../testcase/testSecurity/TestUserManage.java      |  18 ++-
 e2e/testng.xml                                     |  19 ++-
 24 files changed, 631 insertions(+), 68 deletions(-)

diff --git a/.github/workflows/ci_e2e.yml b/.github/workflows/ci_e2e.yml
index 82c81ef..eaffc04 100644
--- a/.github/workflows/ci_e2e.yml
+++ b/.github/workflows/ci_e2e.yml
@@ -66,9 +66,9 @@ jobs:
         run: cd ./e2e && mvn -B clean test
       - name: Collect logs
         if: failure()
-        uses: actions/upload-artifact@v1
+        uses: actions/upload-artifact@v2
         with:
           name: dslogs
-          path: 
/var/lib/docker/volumes/docker-swarm_dolphinscheduler-logs/_data
+          path: ${{ github.workspace 
}}/docker/docker-swarm/dolphinscheduler-logs
 
 
diff --git a/docker/docker-swarm/docker-compose.yml 
b/docker/docker-swarm/docker-compose.yml
index ee8be25..5cb6717 100644
--- a/docker/docker-swarm/docker-compose.yml
+++ b/docker/docker-swarm/docker-compose.yml
@@ -72,7 +72,7 @@ services:
     - dolphinscheduler-postgresql
     - dolphinscheduler-zookeeper
     volumes:
-    - dolphinscheduler-logs:/opt/dolphinscheduler/logs
+    - ./dolphinscheduler-logs:/opt/dolphinscheduler/logs
     networks:
     - dolphinscheduler
 
@@ -95,7 +95,7 @@ services:
     depends_on:
     - dolphinscheduler-api
     volumes:
-    - dolphinscheduler-logs:/var/log/nginx
+    - ./dolphinscheduler-logs:/var/log/nginx
     networks:
     - dolphinscheduler
 
@@ -133,7 +133,7 @@ services:
     depends_on:
     - dolphinscheduler-postgresql
     volumes:
-    - dolphinscheduler-logs:/opt/dolphinscheduler/logs
+    - ./dolphinscheduler-logs:/opt/dolphinscheduler/logs
     networks:
     - dolphinscheduler
 
@@ -168,7 +168,7 @@ services:
     - dolphinscheduler-postgresql
     - dolphinscheduler-zookeeper
     volumes:
-    - dolphinscheduler-logs:/opt/dolphinscheduler/logs
+    - ./dolphinscheduler-logs:/opt/dolphinscheduler/logs
     networks:
     - dolphinscheduler
 
@@ -210,9 +210,7 @@ services:
     - type: volume
       source: dolphinscheduler-worker-data
       target: /tmp/dolphinscheduler
-    - type: volume
-      source: dolphinscheduler-logs
-      target: /opt/dolphinscheduler/logs
+    - ./dolphinscheduler-logs:/opt/dolphinscheduler/logs
     networks:
     - dolphinscheduler
 
@@ -225,7 +223,6 @@ volumes:
   dolphinscheduler-postgresql-initdb:
   dolphinscheduler-zookeeper:
   dolphinscheduler-worker-data:
-  dolphinscheduler-logs:
 
 configs:
   dolphinscheduler-worker-task-env:
diff --git 
a/e2e/src/test/java/org/apache/dolphinscheduler/common/BrowserCommon.java 
b/e2e/src/test/java/org/apache/dolphinscheduler/common/BrowserCommon.java
index a7c1f7f..437e81c 100644
--- a/e2e/src/test/java/org/apache/dolphinscheduler/common/BrowserCommon.java
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/common/BrowserCommon.java
@@ -167,6 +167,23 @@ public class BrowserCommon {
         return inputElement;
     }
 
+
+    /**
+     * input element after clearing
+     *
+     * @param locator By
+     * @param content Input content
+     * @return inputElement
+     */
+    public WebElement clearSendInput(By locator, String content) {
+        WebElement inputElement = locateElement(locator);
+        //input date
+        inputElement.clear();
+        inputElement.sendKeys(Keys.HOME,Keys.chord(Keys.SHIFT,Keys.END));
+        inputElement.sendKeys(content);
+        return inputElement;
+    }
+
     /**
      * clear element
      *
diff --git 
a/e2e/src/test/java/org/apache/dolphinscheduler/data/security/UserManageData.java
 
b/e2e/src/test/java/org/apache/dolphinscheduler/data/project/RunWorkflowData.java
similarity index 67%
copy from 
e2e/src/test/java/org/apache/dolphinscheduler/data/security/UserManageData.java
copy to 
e2e/src/test/java/org/apache/dolphinscheduler/data/project/RunWorkflowData.java
index 080172d..70112ed 100644
--- 
a/e2e/src/test/java/org/apache/dolphinscheduler/data/security/UserManageData.java
+++ 
b/e2e/src/test/java/org/apache/dolphinscheduler/data/project/RunWorkflowData.java
@@ -14,18 +14,19 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dolphinscheduler.data.security;
+package org.apache.dolphinscheduler.data.project;
 
+public class RunWorkflowData {
+    /**
+     * run workflow data
+     */
+    //input shell task name
+    public static final String RECIPIENT  = "[email protected]";
 
-public class UserManageData  {
-    public static final String USERNAME = "selenium_user_1";
+    //input shell task description
+    public static final String Cc = "[email protected]";
 
-    public static final String PASSWORD = "123456qwe";
+    public static final String RUN_WORKFLOW_TITLE = "工作流定义 - DolphinScheduler";
 
-    public static final String EMAIL = "[email protected]";
-
-    public static final String PHONE = "15811112222";
-
-    public static final String USER_MANAGE = "用户管理 - DolphinScheduler";
 
 }
diff --git 
a/e2e/src/test/java/org/apache/dolphinscheduler/data/security/UserManageData.java
 b/e2e/src/test/java/org/apache/dolphinscheduler/data/project/TimingData.java
similarity index 56%
copy from 
e2e/src/test/java/org/apache/dolphinscheduler/data/security/UserManageData.java
copy to 
e2e/src/test/java/org/apache/dolphinscheduler/data/project/TimingData.java
index 080172d..d00a562 100644
--- 
a/e2e/src/test/java/org/apache/dolphinscheduler/data/security/UserManageData.java
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/data/project/TimingData.java
@@ -14,18 +14,22 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dolphinscheduler.data.security;
+package org.apache.dolphinscheduler.data.project;
 
+public class TimingData {
+    /**
+     * timing data
+     */
+    //input shell task name
+    public static final String RECIPIENT  = "[email protected]";
 
-public class UserManageData  {
-    public static final String USERNAME = "selenium_user_1";
+    //input shell task description
+    public static final String Cc = "[email protected]";
 
-    public static final String PASSWORD = "123456qwe";
+    public static final String EDIT_RECIPIENT  = "[email protected]";
 
-    public static final String EMAIL = "[email protected]";
-
-    public static final String PHONE = "15811112222";
-
-    public static final String USER_MANAGE = "用户管理 - DolphinScheduler";
+    public static final String EDIT_Cc = "[email protected]";
 
+    public static final String WORKFLOW_TITLE = "工作流定义 - DolphinScheduler";
+    public static final String TIMING_TITLE = "定时任务列表 - DolphinScheduler";
 }
diff --git 
a/e2e/src/test/java/org/apache/dolphinscheduler/data/security/UserManageData.java
 
b/e2e/src/test/java/org/apache/dolphinscheduler/data/security/UserManageData.java
index 080172d..10dcd45 100644
--- 
a/e2e/src/test/java/org/apache/dolphinscheduler/data/security/UserManageData.java
+++ 
b/e2e/src/test/java/org/apache/dolphinscheduler/data/security/UserManageData.java
@@ -18,6 +18,9 @@ package org.apache.dolphinscheduler.data.security;
 
 
 public class UserManageData  {
+    /**
+     * create user
+     */
     public static final String USERNAME = "selenium_user_1";
 
     public static final String PASSWORD = "123456qwe";
@@ -28,4 +31,11 @@ public class UserManageData  {
 
     public static final String USER_MANAGE = "用户管理 - DolphinScheduler";
 
+    /**
+     * edit user
+     */
+    public static final String EDIT_USERNAME = "selenium_user_edit";
+    public static final String EDIT_PASSWORD = "123456qwe";
+    public static final String EDIT_EMAIL = "[email protected]";
+    public static final String EDIT_PHONE = "15800001111";
 }
diff --git 
a/e2e/src/test/java/org/apache/dolphinscheduler/locator/project/CreateWorkflowLocator.java
 
b/e2e/src/test/java/org/apache/dolphinscheduler/locator/project/CreateWorkflowLocator.java
index 496bbc4..5163f0f 100644
--- 
a/e2e/src/test/java/org/apache/dolphinscheduler/locator/project/CreateWorkflowLocator.java
+++ 
b/e2e/src/test/java/org/apache/dolphinscheduler/locator/project/CreateWorkflowLocator.java
@@ -136,8 +136,7 @@ public class CreateWorkflowLocator {
 
     //select tenant
     public static final By CLICK_TENANT = 
By.xpath("//div[4]/div/div/div/input");
-    public static final By SELECT_TENANT = 
By.xpath("//div[2]/div/div/div/ul/li/span");
-
+    public static final By SELECT_TENANT = 
By.xpath("//div[4]/div/div[2]/div/div/div/ul/li[2]/span");
 
     //click workflow timeout alarm
     public static final By CLICK_WORKFLOW_TIMEOUT_ALARM = 
By.xpath("//span[2]/span/span");
@@ -173,10 +172,23 @@ public class CreateWorkflowLocator {
     public static final By SCROLL_BOTTOM = By.xpath("//span/a/em");
 
     /**
+     * online workflow
+     */
+    // click online workflow button
+    public static final By CLICK_ONLINE_WORKFLOW_BUTTON = 
By.xpath("//div[1]/div/table/tr[2]/td[10]/button[4]");
+
+    /**
+     * offline workflow
+     */
+    // click offline workflow button
+    public static final By CLICK_OFFLINE_WORKFLOW_BUTTON = 
By.xpath("//div[1]/div/table/tr[2]/td[10]/button[4]");
+
+
+    /**
      * delete workflow
      */
     //click delete workflow button
-    public static final By DELETE_WORKFLOW_BOTTOM = 
By.xpath("//span/button/i");
+    public static final By DELETE_WORKFLOW_BOTTOM = 
By.xpath("//div[3]/div[1]/div/table/tr[2]/td[10]/span/button");
 
     //click confirm delete workflow button
     public static final By CONFIRM_DELETE_WORKFLOW_BOTTOM = 
By.xpath("//div[2]/div/button[2]/span");
diff --git 
a/e2e/src/test/java/org/apache/dolphinscheduler/locator/project/RunWorkflowLocator.java
 
b/e2e/src/test/java/org/apache/dolphinscheduler/locator/project/RunWorkflowLocator.java
new file mode 100644
index 0000000..36a788f
--- /dev/null
+++ 
b/e2e/src/test/java/org/apache/dolphinscheduler/locator/project/RunWorkflowLocator.java
@@ -0,0 +1,48 @@
+/*
+ * 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.dolphinscheduler.locator.project;
+
+import org.openqa.selenium.By;
+
+public class RunWorkflowLocator {
+    /**
+     * run workflow
+     */
+    // click run workflow button
+    public static final By CLICK_RUN_WORKFLOW_BUTTON = 
By.xpath("//div[1]/div/table/tr[2]/td[10]/button[2]");
+
+    //set running parameters
+    public static final By SELECT_FAILURE_STRATEGY_END = 
By.xpath("//div[5]/div/div[2]/div/div[3]/div[2]/div/label[2]/span[1]/input");
+    public static final By SELECT_FAILURE_STRATEGY_CONTINUE = 
By.xpath("//div[3]/div[2]/div/label[1]/span[1]/input");
+
+    public static final By CLICK_NOTICE_STRATEGY = 
By.xpath("//div[4]/div[2]/div/div[1]/div/input");
+    public static final By SELECT_NOTICE_STRATEGY = 
By.xpath("//div/ul/li[4]/span");
+
+    public static final By CLICK_PROCESS_PRIORITY = 
By.xpath("//div/div/div/div/div/span[2]");
+    public static final By SELECT_PROCESS_PRIORITY_HIGHEST  = 
By.xpath("//li[1]/li/span");
+
+    public static final By CLICK_WORKER_GROUP = 
By.xpath("//div[6]/div[2]/div/div[1]/div/input");
+    public static final By SELECT_WORKER_GROUP  = 
By.xpath("//div[5]/div/div[2]/div/div[6]/div[2]/div/div[2]/div/div/div/ul/li/span");
+
+    public static final By CLICK_NOTICE_GROUP = 
By.xpath("//div[7]/div[2]/div/div[1]/div/input");
+    public static final By SELECT_NOTICE_GROUP  = 
By.xpath("//div[5]/div/div[2]/div/div[7]/div[2]/div/div[2]/div/div/div/ul/li/span");
+
+    public static final By INPUT_RECIPIENT  = 
By.xpath("//div[8]/div[2]/div/div/span/span/input");
+    public static final By INPUT_Cc  = 
By.xpath("//div[9]/div[2]/div/div/span/span/input");
+
+    public static final By CLICK_RUNNING_BUTTON  = 
By.xpath("//div[11]/button[2]");
+}
diff --git 
a/e2e/src/test/java/org/apache/dolphinscheduler/locator/project/TimingLocator.java
 
b/e2e/src/test/java/org/apache/dolphinscheduler/locator/project/TimingLocator.java
new file mode 100644
index 0000000..d9559b1
--- /dev/null
+++ 
b/e2e/src/test/java/org/apache/dolphinscheduler/locator/project/TimingLocator.java
@@ -0,0 +1,61 @@
+/*
+ * 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.dolphinscheduler.locator.project;
+
+import org.openqa.selenium.By;
+
+public class TimingLocator {
+    // create timing button
+    public static final By CLICK_TIMING_BUTTON = By.xpath("//button[3]");
+
+    public static final By CLICK_EXECUTION_TIMING_BUTTON = 
By.xpath("//div[3]/button/span");
+
+    public static final By SELECT_FAILURE_STRATEGY_END = 
By.xpath("//label[2]/span/input");
+    public static final By SELECT_FAILURE_STRATEGY_CONTINUE = 
By.xpath("//div[2]/div/label/span[2]");
+
+    public static final By CLICK_NOTICE_STRATEGY = 
By.xpath("//div[6]/div[2]/div/div/div/input");
+    public static final By SELECT_NOTICE_STRATEGY = 
By.xpath("//div[2]/div/div/div/ul/li[4]/span");
+
+    public static final By CLICK_PROCESS_PRIORITY = 
By.xpath("//div[7]/div[2]/div/div/div/div/div/span[2]");
+    public static final By SELECT_PROCESS_PRIORITY  = By.xpath("//li/li/span");
+
+    public static final By CLICK_WORKER_GROUP = 
By.xpath("//div[8]/div[2]/div/div/div/input");
+    public static final By SELECT_WORKER_GROUP  = 
By.xpath("//div[8]/div[2]/div/div[2]/div/div/div/ul/li/span");
+
+    public static final By CLICK_NOTICE_GROUP = 
By.xpath("//div[9]/div[2]/div/div/div/input");
+    public static final By SELECT_NOTICE_GROUP  = 
By.xpath("//div[9]/div[2]/div/div[2]/div/div/div/ul/li/span");
+
+    public static final By INPUT_RECIPIENT  = 
By.xpath("//div[10]/div[2]/div/div/span/span/input");
+    public static final By INPUT_Cc  = 
By.xpath("//div[11]/div[2]/div/div/span/span/input");
+
+    public static final By CLICK_CREATE_BUTTON  = 
By.xpath("//div[12]/button[2]/span");
+
+    //edit timing
+    public static final By CLICK_TIMING_MANAGEMENT_BUTTON = 
By.xpath("//div[2]/div/div[3]/div[1]/div/table/tr[2]/td[10]/button[6]");
+
+    public static final By CLICK_EDIT_TIMING_BUTTON = 
By.xpath("//div[2]/div[3]/div/div[2]/div[1]/table/tr[2]/td[10]/button[1]");
+
+    //online timing
+    public static final By CLICK_ONLINE_TIMING_BUTTON = 
By.xpath("//td[10]/button[2]");
+
+    //offline timing
+    public static final By CLICK_OFFLINE_TIMING_BUTTON = 
By.xpath("//div[2]/div[3]/div/div[2]/div[1]/table/tr[2]/td[10]/button[2]");
+
+    //delete timing
+    public static final By CLICK_DELETE_TIMING_BUTTON = 
By.xpath("//div[2]/div[3]/div/div[2]/div[1]/table/tr[2]/td[10]/span/button");
+    public static final By CLICK_CONFIRM_DELETE_TIMING_BUTTON = 
By.xpath("//div[2]/div/button[2]/span");
+}
diff --git 
a/e2e/src/test/java/org/apache/dolphinscheduler/locator/security/TokenManageLocator.java
 
b/e2e/src/test/java/org/apache/dolphinscheduler/locator/security/TokenManageLocator.java
index e7f7654..0626ed8 100644
--- 
a/e2e/src/test/java/org/apache/dolphinscheduler/locator/security/TokenManageLocator.java
+++ 
b/e2e/src/test/java/org/apache/dolphinscheduler/locator/security/TokenManageLocator.java
@@ -20,7 +20,7 @@ import org.openqa.selenium.By;
 
 public class TokenManageLocator {
     //create token
-    public static final By CLICK_TOKEN_MANAGE = 
By.xpath("//div[7]/div/a/div/a/span");
+    public static final By CLICK_TOKEN_MANAGE = 
By.xpath("/html/body/div[1]/div[2]/div/div[1]/div[7]/div/a/div/a/span");
 
     public static final By CLICK_CREATE_TOKEN = 
By.xpath("//div[2]/div/div[2]/div[2]/div/div[1]/button/span");
 
diff --git 
a/e2e/src/test/java/org/apache/dolphinscheduler/locator/security/UserManageLocator.java
 
b/e2e/src/test/java/org/apache/dolphinscheduler/locator/security/UserManageLocator.java
index 9f685f0..ef2ec90 100644
--- 
a/e2e/src/test/java/org/apache/dolphinscheduler/locator/security/UserManageLocator.java
+++ 
b/e2e/src/test/java/org/apache/dolphinscheduler/locator/security/UserManageLocator.java
@@ -20,6 +20,9 @@ import org.openqa.selenium.By;
 
 public class UserManageLocator {
 
+    /**
+     * create user
+     */
     public static final By CLICK_USER_MANAGE = 
By.xpath("//div[3]/div/a/div/a/span");
 
     public static final By CLICK_CREATE_USER_BUTTON = 
By.xpath("//span[contains(.,'创建用户')]");
@@ -36,13 +39,26 @@ public class UserManageLocator {
 
     public static final By SELECT_QUEUE = 
By.xpath("//div[4]/div[2]/div/div[2]/div/div/div/ul/li/span");
 
-    public static final By TENANT_INPUT_EMAIL = 
By.xpath("//div[5]/div[2]/div/input");
+    public static final By INPUT_EMAIL = By.xpath("//div[5]/div[2]/div/input");
 
-    public static final By TENANT_INPUT_PHONE = 
By.xpath("//div[6]/div[2]/div/input");
+    public static final By INPUT_PHONE = By.xpath("//div[6]/div[2]/div/input");
+
+    public static final By SELECT_STOP_STATE = 
By.xpath("//div[7]/div[2]/div/label[2]/span/input");
+
+    public static final By SELECT_ENABLE_STATE = 
By.xpath("//div[7]/div[2]/div/label[1]/span/input");
 
     public static final By SUBMIT = By.xpath("//div[3]/button[2]/span");
 
-    public static final By DELETE_USER_BUTTON = By.xpath("//span[2]/button");
+    /**
+     * edit user
+     */
+    public static final By EDIT_GENERAL_USER_BUTTON = 
By.xpath("//div[3]/div[1]/div/table/tr[2]/td[11]/button");
+
+    public static final By EDIT_ADMIN_USER_BUTTON = 
By.xpath("//div[3]/div[1]/div/table/tr[3]/td[11]/button");
+    /**
+     * delete user
+     */
+    public static final By DELETE_USER_BUTTON = 
By.xpath("//div[3]/div[1]/div/table/tr[2]/td[11]/span[2]/button");
 
     public static final By CONFIRM_DELETE_USER_BUTTON = 
By.xpath("//div[2]/div/button[2]/span");
 }
diff --git 
a/e2e/src/test/java/org/apache/dolphinscheduler/page/project/CreateProjectPage.java
 
b/e2e/src/test/java/org/apache/dolphinscheduler/page/project/CreateProjectPage.java
index 52bfcc6..cba62a4 100644
--- 
a/e2e/src/test/java/org/apache/dolphinscheduler/page/project/CreateProjectPage.java
+++ 
b/e2e/src/test/java/org/apache/dolphinscheduler/page/project/CreateProjectPage.java
@@ -31,7 +31,6 @@ public class CreateProjectPage extends PageCommon {
      * jump to ProjectManagePage
      */
     public boolean jumpProjectManagePage() throws InterruptedException {
-        Thread.sleep(TestConstant.THREE_THOUSAND);
         clickTopElement(CreateProjectLocator.PROJECT_MANAGE);
         Thread.sleep(TestConstant.ONE_THOUSAND);
         return ifTitleContains(CreateProjectData.PROJECT_TITLE);
diff --git 
a/e2e/src/test/java/org/apache/dolphinscheduler/page/project/CreateWorkflowPage.java
 
b/e2e/src/test/java/org/apache/dolphinscheduler/page/project/CreateWorkflowPage.java
index a529e76..ed978a8 100644
--- 
a/e2e/src/test/java/org/apache/dolphinscheduler/page/project/CreateWorkflowPage.java
+++ 
b/e2e/src/test/java/org/apache/dolphinscheduler/page/project/CreateWorkflowPage.java
@@ -20,6 +20,7 @@ import org.apache.dolphinscheduler.common.PageCommon;
 import org.apache.dolphinscheduler.constant.TestConstant;
 import org.apache.dolphinscheduler.data.project.CreateWorkflowData;
 import org.apache.dolphinscheduler.locator.project.CreateWorkflowLocator;
+import org.apache.dolphinscheduler.locator.project.RunWorkflowLocator;
 import org.openqa.selenium.WebDriver;
 
 public class CreateWorkflowPage extends PageCommon {
@@ -183,13 +184,37 @@ public class CreateWorkflowPage extends PageCommon {
         Thread.sleep(TestConstant.ONE_THOUSAND);
 
         //click add button
-        clickButton(CreateWorkflowLocator.CLICK_ADD_BUTTON);
         System.out.println("submit workflow");
+        clickButton(CreateWorkflowLocator.CLICK_ADD_BUTTON);
+
         return ifTitleContains(CreateWorkflowData.CREATE_WORKFLOW_TITLE);
     }
 
+    public boolean onlineWorkflow() throws InterruptedException {
+        clickElement(CreateWorkflowLocator.CLICK_WORKFLOW_DEFINE);
+
+        // click online button
+        System.out.println("Click online workflow button");
+        clickButton(CreateWorkflowLocator.CLICK_ONLINE_WORKFLOW_BUTTON);
+
+        return ifTitleContains(CreateWorkflowData.WORKFLOW_TITLE);
+    }
+
+    public boolean offlineWorkflow() throws InterruptedException {
+        clickElement(CreateWorkflowLocator.CLICK_WORKFLOW_DEFINE);
+
+        // click offline button
+        System.out.println("offline workflow");
+        Thread.sleep(500);
+        clickButton(CreateWorkflowLocator.CLICK_OFFLINE_WORKFLOW_BUTTON);
+
+        return ifTitleContains(CreateWorkflowData.WORKFLOW_TITLE);
+    }
+
+
     public boolean deleteWorkflow() throws InterruptedException {
-        //click  delete project
+        //click  delete workflow
+        Thread.sleep(500);
         clickButton(CreateWorkflowLocator.DELETE_WORKFLOW_BOTTOM);
 
         //click confirm delete project
diff --git 
a/e2e/src/test/java/org/apache/dolphinscheduler/page/project/RunWorkflowPage.java
 
b/e2e/src/test/java/org/apache/dolphinscheduler/page/project/RunWorkflowPage.java
new file mode 100644
index 0000000..9f14dde
--- /dev/null
+++ 
b/e2e/src/test/java/org/apache/dolphinscheduler/page/project/RunWorkflowPage.java
@@ -0,0 +1,53 @@
+/*
+ * 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.dolphinscheduler.page.project;
+
+import org.apache.dolphinscheduler.common.PageCommon;
+import org.apache.dolphinscheduler.data.project.RunWorkflowData;
+import org.apache.dolphinscheduler.locator.project.RunWorkflowLocator;
+import org.openqa.selenium.WebDriver;
+
+public class RunWorkflowPage extends PageCommon {
+    public RunWorkflowPage(WebDriver driver) {
+        super(driver);
+    }
+
+    public boolean runWorkflow() throws InterruptedException {
+        // click run workflow button
+        System.out.println("Click run workflow button");
+        Thread.sleep(1000);
+        clickButton(RunWorkflowLocator.CLICK_RUN_WORKFLOW_BUTTON);
+        Thread.sleep(1000);
+
+        clickElement(RunWorkflowLocator.SELECT_FAILURE_STRATEGY_END);
+        clickElement(RunWorkflowLocator.SELECT_FAILURE_STRATEGY_CONTINUE);
+        clickElement(RunWorkflowLocator.CLICK_NOTICE_STRATEGY);
+        clickElement(RunWorkflowLocator.SELECT_NOTICE_STRATEGY);
+        Thread.sleep(500);
+        clickElement(RunWorkflowLocator.CLICK_PROCESS_PRIORITY);
+        clickElement(RunWorkflowLocator.SELECT_PROCESS_PRIORITY_HIGHEST);
+        clickElement(RunWorkflowLocator.CLICK_WORKER_GROUP);
+        clickElement(RunWorkflowLocator.SELECT_WORKER_GROUP);
+        clickElement(RunWorkflowLocator.CLICK_NOTICE_GROUP);
+        clickElement(RunWorkflowLocator.SELECT_NOTICE_GROUP);
+        sendInput(RunWorkflowLocator.INPUT_RECIPIENT, 
RunWorkflowData.RECIPIENT);
+        sendInput(RunWorkflowLocator.INPUT_Cc,RunWorkflowData.Cc);
+        clickButton(RunWorkflowLocator.CLICK_RUNNING_BUTTON);
+
+        return ifTitleContains(RunWorkflowData.RUN_WORKFLOW_TITLE);
+    }
+}
diff --git 
a/e2e/src/test/java/org/apache/dolphinscheduler/page/project/TimingPage.java 
b/e2e/src/test/java/org/apache/dolphinscheduler/page/project/TimingPage.java
new file mode 100644
index 0000000..f74f460
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/page/project/TimingPage.java
@@ -0,0 +1,134 @@
+/*
+ * 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.dolphinscheduler.page.project;
+
+import org.apache.dolphinscheduler.common.PageCommon;
+import org.apache.dolphinscheduler.data.project.TimingData;
+import org.apache.dolphinscheduler.locator.project.RunWorkflowLocator;
+import org.apache.dolphinscheduler.locator.project.TimingLocator;
+import org.openqa.selenium.WebDriver;
+
+public class TimingPage extends PageCommon {
+    public TimingPage(WebDriver driver) {
+        super(driver);
+    }
+
+
+    /**
+     * create timing
+     */
+    public boolean createTiming() throws InterruptedException {
+        // click timing button
+        System.out.println("Click timing button");
+        Thread.sleep(1000);
+        clickButton(TimingLocator.CLICK_TIMING_BUTTON);
+        System.out.println("Click execution timing button");
+        clickButton(TimingLocator.CLICK_EXECUTION_TIMING_BUTTON);
+        Thread.sleep(1000);
+
+        clickElement(TimingLocator.SELECT_FAILURE_STRATEGY_END);
+        clickElement(TimingLocator.SELECT_FAILURE_STRATEGY_CONTINUE);
+        clickElement(TimingLocator.CLICK_NOTICE_STRATEGY);
+        clickElement(TimingLocator.SELECT_NOTICE_STRATEGY);
+        Thread.sleep(500);
+        clickElement(TimingLocator.CLICK_PROCESS_PRIORITY);
+        clickElement(TimingLocator.SELECT_PROCESS_PRIORITY);
+        clickElement(TimingLocator.CLICK_WORKER_GROUP);
+        clickElement(TimingLocator.SELECT_WORKER_GROUP);
+        clickElement(TimingLocator.CLICK_NOTICE_GROUP);
+        clickElement(TimingLocator.SELECT_NOTICE_GROUP);
+        sendInput(TimingLocator.INPUT_RECIPIENT, TimingData.RECIPIENT);
+        sendInput(TimingLocator.INPUT_Cc,TimingData.Cc);
+        clickButton(TimingLocator.CLICK_CREATE_BUTTON);
+
+        return ifTitleContains(TimingData.WORKFLOW_TITLE);
+    }
+
+    /**
+     * edit timing
+     */
+    public boolean editTiming() throws InterruptedException {
+        // click timing button
+        System.out.println("Click timing  management button");
+        clickButton(TimingLocator.CLICK_TIMING_MANAGEMENT_BUTTON);
+        Thread.sleep(500);
+        System.out.println("Click edit timing button");
+        clickButton(TimingLocator.CLICK_EDIT_TIMING_BUTTON);
+        Thread.sleep(500);
+        System.out.println("Click execution timing button");
+        clickButton(TimingLocator.CLICK_EXECUTION_TIMING_BUTTON);
+        Thread.sleep(1000);
+
+        clickElement(TimingLocator.SELECT_FAILURE_STRATEGY_END);
+        clickElement(TimingLocator.SELECT_FAILURE_STRATEGY_CONTINUE);
+        clickElement(TimingLocator.CLICK_NOTICE_STRATEGY);
+        clickElement(TimingLocator.SELECT_NOTICE_STRATEGY);
+        Thread.sleep(500);
+        clickElement(TimingLocator.CLICK_PROCESS_PRIORITY);
+        clickElement(TimingLocator.SELECT_PROCESS_PRIORITY);
+        clickElement(TimingLocator.CLICK_WORKER_GROUP);
+        clickElement(TimingLocator.SELECT_WORKER_GROUP);
+        clickElement(TimingLocator.CLICK_NOTICE_GROUP);
+        clickElement(TimingLocator.SELECT_NOTICE_GROUP);
+        sendInput(TimingLocator.INPUT_RECIPIENT, TimingData.EDIT_RECIPIENT);
+        sendInput(TimingLocator.INPUT_Cc,TimingData.EDIT_Cc);
+        clickButton(TimingLocator.CLICK_CREATE_BUTTON);
+
+        return ifTitleContains(TimingData.TIMING_TITLE );
+    }
+
+
+    /**
+     * online timing
+     */
+    public boolean onlineTiming() throws InterruptedException {
+        // click online timing button
+        System.out.println("Click online timing  button");
+        Thread.sleep(500);
+        clickButton(TimingLocator.CLICK_ONLINE_TIMING_BUTTON);
+
+        return ifTitleContains(TimingData.TIMING_TITLE );
+    }
+
+
+    /**
+     * offline timing
+     */
+    public boolean offlineTiming() throws InterruptedException {
+        // click offline timing button
+        System.out.println("Click offline timing  button");
+        Thread.sleep(500);
+        clickButton(TimingLocator.CLICK_OFFLINE_TIMING_BUTTON);
+
+        return ifTitleContains(TimingData.TIMING_TITLE );
+    }
+
+
+
+    /**
+     * delete timing
+     */
+    public boolean deleteTiming() throws InterruptedException {
+        // click offline timing button
+        System.out.println("Click delete timing  button");
+        Thread.sleep(500);
+        clickButton(TimingLocator.CLICK_DELETE_TIMING_BUTTON);
+        clickButton(TimingLocator.CLICK_CONFIRM_DELETE_TIMING_BUTTON);
+
+        return ifTitleContains(TimingData.WORKFLOW_TITLE );
+    }
+}
diff --git 
a/e2e/src/test/java/org/apache/dolphinscheduler/page/security/AlertManagePage.java
 
b/e2e/src/test/java/org/apache/dolphinscheduler/page/security/AlertManagePage.java
index a205723..4ea64df 100644
--- 
a/e2e/src/test/java/org/apache/dolphinscheduler/page/security/AlertManagePage.java
+++ 
b/e2e/src/test/java/org/apache/dolphinscheduler/page/security/AlertManagePage.java
@@ -37,14 +37,18 @@ public class AlertManagePage extends PageCommon {
      */
     public boolean createAlert() throws InterruptedException {
         // click  alert manage
+        Thread.sleep(500);
+        System.out.println("start click alert manage button");
         clickElement(AlertManageLocator.CLICK_ALERT_MANAGE);
-        Thread.sleep(1000);
+        Thread.sleep(500);
 
         // click  create alert button
+        System.out.println("start click create alert  button");
         clickElement(AlertManageLocator.CLICK_CREATE_ALERT);
-        Thread.sleep(1000);
+        Thread.sleep(500);
 
         // input alert data
+        System.out.println("start input  alert ");
         sendInput(AlertManageLocator.INPUT_ALERT_NAME, 
AlertManageData.ALERT_NAME);
 
         clickElement(AlertManageLocator.CLICK_ALERT_TYPE);
diff --git 
a/e2e/src/test/java/org/apache/dolphinscheduler/page/security/QueueManagePage.java
 
b/e2e/src/test/java/org/apache/dolphinscheduler/page/security/QueueManagePage.java
index 33b7627..95165ae 100644
--- 
a/e2e/src/test/java/org/apache/dolphinscheduler/page/security/QueueManagePage.java
+++ 
b/e2e/src/test/java/org/apache/dolphinscheduler/page/security/QueueManagePage.java
@@ -37,14 +37,18 @@ public class QueueManagePage extends PageCommon {
      */
     public boolean createQueue() throws InterruptedException {
         // click queue manage
+        Thread.sleep(500);
+        System.out.println("start click queue manage button");
         clickElement(QueueManageLocator.CLICK_QUEUE_MANAGE);
-        Thread.sleep(1000);
+        Thread.sleep(500);
 
         // click  create queue button
+        System.out.println("start click create queue  button");
         clickElement(QueueManageLocator.CLICK_CREATE_QUEUE);
-        Thread.sleep(1000);
+        Thread.sleep(500);
 
         // input queue data
+        System.out.println("start input queue");
         sendInput(QueueManageLocator.INPUT_QUEUE_NAME, 
QueueManageData.QUEUE_NAME);
 
         sendInput(QueueManageLocator.INPUT_QUEUE_VALUE, 
QueueManageData.QUEUE_VALUE);
diff --git 
a/e2e/src/test/java/org/apache/dolphinscheduler/page/security/UserManagePage.java
 
b/e2e/src/test/java/org/apache/dolphinscheduler/page/security/UserManagePage.java
index 21dd4ca..31f0445 100644
--- 
a/e2e/src/test/java/org/apache/dolphinscheduler/page/security/UserManagePage.java
+++ 
b/e2e/src/test/java/org/apache/dolphinscheduler/page/security/UserManagePage.java
@@ -27,7 +27,7 @@ public class UserManagePage extends PageCommon {
     }
 
     /**
-     * createTenant
+     * create user
      *
      * @return Whether to enter the specified page after creat tenant
      */
@@ -45,8 +45,10 @@ public class UserManagePage extends PageCommon {
         clickButton(UserManageLocator.SELECT_TENANT);
         clickButton(UserManageLocator.CLICK_QUEUE);
         clickButton(UserManageLocator.SELECT_QUEUE);
-        sendInput(UserManageLocator.TENANT_INPUT_EMAIL, UserManageData.EMAIL);
-        sendInput(UserManageLocator.TENANT_INPUT_PHONE, UserManageData.PHONE);
+        sendInput(UserManageLocator.INPUT_EMAIL, UserManageData.EMAIL);
+        sendInput(UserManageLocator.INPUT_PHONE, UserManageData.PHONE);
+        clickElement(UserManageLocator.SELECT_STOP_STATE);
+        clickElement(UserManageLocator.SELECT_ENABLE_STATE);
 
         // click  button
         clickButton(UserManageLocator.SUBMIT);
@@ -55,15 +57,84 @@ public class UserManagePage extends PageCommon {
         return ifTitleContains(UserManageData.USER_MANAGE);
     }
 
-    public boolean deleteUser() throws InterruptedException {
+    /**
+     * edit general user
+     */
+    public boolean editGeneralUser() throws InterruptedException {
+        //edit general user
+        // click  user manage
+        System.out.println("start edit general user");
+        Thread.sleep(500);
+        clickElement(UserManageLocator.CLICK_USER_MANAGE);
+
+        // click  edit user button
+        clickButton(UserManageLocator.EDIT_GENERAL_USER_BUTTON );
+
+        // input user data
+        clearSendInput(UserManageLocator.INPUT_USERNAME, 
UserManageData.EDIT_USERNAME);
+        clearSendInput(UserManageLocator.INPUT_PASSWORD, 
UserManageData.EDIT_PASSWORD);
+
+        clickButton(UserManageLocator.CLICK_TENANT);
+        clickButton(UserManageLocator.SELECT_TENANT);
 
+        clickButton(UserManageLocator.CLICK_QUEUE);
+        clickButton(UserManageLocator.SELECT_QUEUE);
+
+        clearSendInput(UserManageLocator.INPUT_EMAIL, 
UserManageData.EDIT_EMAIL);
+        clearSendInput(UserManageLocator.INPUT_PHONE, 
UserManageData.EDIT_PHONE);
+
+        clickElement(UserManageLocator.SELECT_STOP_STATE);
+        clickElement(UserManageLocator.SELECT_ENABLE_STATE);
+
+        // click  button
+        clickButton(UserManageLocator.SUBMIT);
+        System.out.println("end edit general user");
+
+        // Whether to enter the specified page after submit
+        return ifTitleContains(UserManageData.USER_MANAGE);
+    }
+
+    /**
+     * edit admin user
+     */
+    public boolean editAdminlUser() throws InterruptedException {
+        //edit admin user
+        // click  user manage
+        System.out.println("start edit admin user");
+        Thread.sleep(500);
+        clickElement(UserManageLocator.CLICK_USER_MANAGE);
+
+        // click  edit user button
+        clickButton(UserManageLocator.EDIT_ADMIN_USER_BUTTON );
+
+        // select tenant
+        clickButton(UserManageLocator.CLICK_TENANT);
+
+        clickButton(UserManageLocator.SELECT_TENANT);
+
+        // click  button
+        clickButton(UserManageLocator.SUBMIT);
+        System.out.println("end edit admin user");
+        Thread.sleep(500);
+        // Whether to enter the specified page after submit
+        return ifTitleContains(UserManageData.USER_MANAGE);
+    }
+
+
+    /**
+     * delete user
+     */
+    public boolean deleteUser() throws InterruptedException {
+        System.out.println("jump to user manage");
         // click  user manage
         clickElement(UserManageLocator.CLICK_USER_MANAGE);
 
         // click  delete user button
+        System.out.println("click delete user");
         clickButton(UserManageLocator.DELETE_USER_BUTTON );
 
         // click confirm delete button
+        System.out.println("click confirm delete user");
         clickButton(UserManageLocator.CONFIRM_DELETE_USER_BUTTON);
 
         // Whether to enter the specified page after submit
diff --git 
a/e2e/src/test/java/org/apache/dolphinscheduler/testcase/testDeleteData/TestDeleteWorkflow.java
 
b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/testDeleteData/TestDeleteWorkflow.java
index d84f34a..2d7714e 100644
--- 
a/e2e/src/test/java/org/apache/dolphinscheduler/testcase/testDeleteData/TestDeleteWorkflow.java
+++ 
b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/testDeleteData/TestDeleteWorkflow.java
@@ -29,12 +29,15 @@ public class TestDeleteWorkflow extends BaseTest {
     public void testDeleteWorkflow() throws InterruptedException {
         createProjectPage = new CreateProjectPage(driver);
         //jump to project manage page
-        System.out.println("jump to the project manage page to delete 
workflow");
-        createProjectPage.jumpProjectManagePage();
+//        System.out.println("jump to the project manage page to delete 
workflow");
+//        createProjectPage.jumpProjectManagePage();
 
         createWorkflowPage = new CreateWorkflowPage(driver);
-        createWorkflowPage.jumpWorkflowPage();
-        //assert tenant manage page
+//        createWorkflowPage.jumpWorkflowPage();
+        System.out.println("start offline workflow");
+        assert createWorkflowPage.offlineWorkflow();
+        System.out.println("end offline workflow");
+
         System.out.println("start delete workflow");
         assert createWorkflowPage.deleteWorkflow();
         System.out.println("end delete workflow");
diff --git 
a/e2e/src/test/java/org/apache/dolphinscheduler/testcase/testProject/TestCreateWorkflow.java
 
b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/testProject/TestCreateWorkflow.java
index 2b7d2b6..bac5b1a 100644
--- 
a/e2e/src/test/java/org/apache/dolphinscheduler/testcase/testProject/TestCreateWorkflow.java
+++ 
b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/testProject/TestCreateWorkflow.java
@@ -40,6 +40,10 @@ public class TestCreateWorkflow extends BaseTest {
         assert createWorkflowPage.createWorkflow();
         assert createWorkflowPage.saveWorkflow();
         System.out.println("end create workflow");
+
+        System.out.println("start online workflow");
+        assert createWorkflowPage.onlineWorkflow();
+        System.out.println("end online workflow");
         System.out.println("===================================");
     }
 }
diff --git 
a/e2e/src/test/java/org/apache/dolphinscheduler/testcase/testProject/TestCreateWorkflow.java
 
b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/testProject/TestRunWorkflow.java
similarity index 63%
copy from 
e2e/src/test/java/org/apache/dolphinscheduler/testcase/testProject/TestCreateWorkflow.java
copy to 
e2e/src/test/java/org/apache/dolphinscheduler/testcase/testProject/TestRunWorkflow.java
index 2b7d2b6..9d641bd 100644
--- 
a/e2e/src/test/java/org/apache/dolphinscheduler/testcase/testProject/TestCreateWorkflow.java
+++ 
b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/testProject/TestRunWorkflow.java
@@ -19,27 +19,23 @@ package org.apache.dolphinscheduler.testcase.testProject;
 import org.apache.dolphinscheduler.base.BaseTest;
 import org.apache.dolphinscheduler.page.project.CreateProjectPage;
 import org.apache.dolphinscheduler.page.project.CreateWorkflowPage;
+import org.apache.dolphinscheduler.page.project.RunWorkflowPage;
 import org.testng.annotations.Test;
 
-public class TestCreateWorkflow extends BaseTest {
+public class TestRunWorkflow extends BaseTest {
     private CreateWorkflowPage createWorkflowPage;
     private CreateProjectPage createProjectPage;
+    private RunWorkflowPage runWorkflowPage;
 
 
-    @Test(groups={"functionTests","workflow"},dependsOnGroups = { "login" 
},description = "TestCreateWorkflow")
-    public void testCreateWorkflow() throws InterruptedException {
-        createProjectPage = new CreateProjectPage(driver);
-        System.out.println("jump to the projectManage page to create 
workflow");
-        createProjectPage.jumpProjectManagePage();
-
-        createWorkflowPage = new CreateWorkflowPage(driver);
-        System.out.println("Click on the project name to jump to the project 
homepage");
-        createWorkflowPage.jumpWorkflowPage();
+    @Test(groups={"functionTests","runWorkflow"},dependsOnGroups = { 
"login","workflow" },description = "TestRunWorkflow")
+    public void testRunWorkflow() throws InterruptedException {
+        runWorkflowPage = new RunWorkflowPage(driver);
 
-        System.out.println("start create workflow");
-        assert createWorkflowPage.createWorkflow();
-        assert createWorkflowPage.saveWorkflow();
-        System.out.println("end create workflow");
+        createProjectPage = new CreateProjectPage(driver);
+        System.out.println("start run workflow");
+        assert runWorkflowPage.runWorkflow();
+        System.out.println("end run workflow");
         System.out.println("===================================");
     }
 }
diff --git 
a/e2e/src/test/java/org/apache/dolphinscheduler/testcase/testProject/TestTiming.java
 
b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/testProject/TestTiming.java
new file mode 100644
index 0000000..dd64c9d
--- /dev/null
+++ 
b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/testProject/TestTiming.java
@@ -0,0 +1,75 @@
+/*
+ * 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.dolphinscheduler.testcase.testProject;
+
+import org.apache.dolphinscheduler.base.BaseTest;
+import org.apache.dolphinscheduler.page.project.TimingPage;
+import org.testng.annotations.Test;
+
+public class TestTiming extends BaseTest {
+    private TimingPage timingPage;
+
+    @Test(groups={"functionTests","createTiming"},dependsOnGroups = { 
"login","workflow"},description = "TestCreateTiming")
+    public void testCreateTiming() throws InterruptedException {
+        timingPage = new TimingPage(driver);
+
+        System.out.println("start create timing");
+        assert timingPage.createTiming();
+        System.out.println("end create timing");
+        System.out.println("===================================");
+
+    }
+    @Test(groups={"functionTests","timing"},dependsOnGroups = { 
"login","workflow"},description = "TestEditTiming")
+    public void testEditTiming() throws InterruptedException {
+        timingPage = new TimingPage(driver);
+
+        System.out.println("start edit timing");
+        assert timingPage.editTiming();
+        System.out.println("end edit timing");
+        System.out.println("===================================");
+    }
+
+    @Test(groups={"functionTests","timing"},dependsOnGroups = { 
"login","workflow" },description = "TestOnlineTiming")
+    public void testOnlineTiming() throws InterruptedException {
+        timingPage = new TimingPage(driver);
+
+        System.out.println("start online timing");
+        assert timingPage.onlineTiming();
+        System.out.println("end online timing");
+        System.out.println("===================================");
+    }
+
+    @Test(groups={"functionTests","timing"},dependsOnGroups = { 
"login","workflow"},description = "TestOfflineTiming")
+    public void testOfflineTiming() throws InterruptedException {
+        timingPage = new TimingPage(driver);
+
+        System.out.println("start offline timing");
+        assert timingPage.offlineTiming();
+        System.out.println("end offline timing");
+        System.out.println("===================================");
+    }
+
+    @Test(groups={"functionTests","timing"},dependsOnGroups = { 
"login","workflow"},description = "TestDeleteTiming")
+    public void testDeleteTiming() throws InterruptedException {
+        timingPage = new TimingPage(driver);
+
+        System.out.println("start delete timing");
+        assert timingPage.deleteTiming();
+        System.out.println("end delete timing");
+        System.out.println("===================================");
+    }
+}
diff --git 
a/e2e/src/test/java/org/apache/dolphinscheduler/testcase/testSecurity/TestUserManage.java
 
b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/testSecurity/TestUserManage.java
index 20537de..e464d7c 100644
--- 
a/e2e/src/test/java/org/apache/dolphinscheduler/testcase/testSecurity/TestUserManage.java
+++ 
b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/testSecurity/TestUserManage.java
@@ -23,14 +23,26 @@ import org.testng.annotations.Test;
 public class TestUserManage extends BaseTest {
     private UserManagePage userManagePage;
 
-    @Test(groups={"functionTests","user"},dependsOnGroups = { "login" 
},description = "TestUserManage")
-    public void testUserManage() throws InterruptedException {
+    @Test(groups={"functionTests","user"},dependsOnGroups = { "login" 
},description = "TestCreateUser")
+    public void testCreateUser() throws InterruptedException {
         userManagePage = new UserManagePage(driver);
-        //assert user manage page
+        //create user
         System.out.println("start create user");
         assert userManagePage.createUser();
         System.out.println("end create user");
         System.out.println("===================================");
+    }
+
+    @Test(groups={"functionTests","user"},dependsOnGroups = { "login" 
},description = "TestEditUser")
+    public void testEditUser() throws InterruptedException {
+        userManagePage = new UserManagePage(driver);
+        //edit user
+        System.out.println("start edit  user");
+        assert userManagePage.editGeneralUser();
+        assert userManagePage.editAdminlUser();
+
+        System.out.println("end edit user");
+        System.out.println("===================================");
 
     }
 }
diff --git a/e2e/testng.xml b/e2e/testng.xml
index 438d547..ee09e19 100644
--- a/e2e/testng.xml
+++ b/e2e/testng.xml
@@ -26,13 +26,30 @@
         <classes>
             <class 
name="org.apache.dolphinscheduler.testcase.TestLogin"></class>
             <class 
name="org.apache.dolphinscheduler.testcase.testSecurity.TestTenantManage"></class>
-            <class 
name="org.apache.dolphinscheduler.testcase.testSecurity.TestUserManage"></class>
             <class 
name="org.apache.dolphinscheduler.testcase.testSecurity.TestAlertManage"></class>
             <class 
name="org.apache.dolphinscheduler.testcase.testSecurity.TestQueueManage"></class>
             <class 
name="org.apache.dolphinscheduler.testcase.testSecurity.TestTokenManage"></class>
 
+            <class 
name="org.apache.dolphinscheduler.testcase.testSecurity.TestUserManage">
+                <methods>
+                    <include name="testCreateUser" />
+                    <include name="testEditUser" />
+                </methods>
+            </class>
+
             <class 
name="org.apache.dolphinscheduler.testcase.testProject.TestCreateProject"></class>
             <class 
name="org.apache.dolphinscheduler.testcase.testProject.TestCreateWorkflow"></class>
+            <class 
name="org.apache.dolphinscheduler.testcase.testProject.TestRunWorkflow"></class>
+
+            <class 
name="org.apache.dolphinscheduler.testcase.testProject.TestTiming">
+                <methods>
+                    <include name="testCreateTiming" />
+                    <include name="testEditTiming" />
+                    <include name="testOnlineTiming" />
+                    <include name="testOfflineTiming" />
+                    <include name="testDeleteTiming" />
+                </methods>
+            </class>
 
             <class 
name="org.apache.dolphinscheduler.testcase.testDeleteData.TestDeleteWorkflow"></class>
             <class 
name="org.apache.dolphinscheduler.testcase.testDeleteData.TestDeleteProject"></class>

Reply via email to