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

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


The following commit(s) were added to refs/heads/dev by this push:
     new 30b8b4a  [E2E][CI] Add renaming file management E2E tests (#8160)
30b8b4a is described below

commit 30b8b4a93ea1bda25de3ab0ad6dcf685161e3da6
Author: xiangzihao <[email protected]>
AuthorDate: Wed Jan 26 09:45:21 2022 +0800

    [E2E][CI] Add renaming file management E2E tests (#8160)
---
 .../e2e/cases/FileManageE2ETest.java               | 197 ++++++++++++++++++++-
 .../e2e/cases/MysqlDataSourceE2ETest.java          |   2 +
 .../e2e/pages/resource/FileManagePage.java         | 170 +++++++++++++++++-
 .../dolphinscheduler/e2e/core/Constants.java       |  51 ++++++
 .../e2e/core/DolphinSchedulerExtension.java        |  26 +++
 .../resource/pages/file/pages/create/index.vue     |   5 +-
 .../pages/resource/pages/file/pages/edit/index.vue |   4 +-
 .../pages/file/pages/list/_source/list.vue         |   6 +-
 .../pages/file/pages/list/_source/rename.vue       |   2 +
 .../js/module/components/fileUpdate/fileUpdate.vue |   2 +-
 .../src/js/module/components/popup/popup.vue       |   4 +-
 11 files changed, 457 insertions(+), 12 deletions(-)

diff --git 
a/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/cases/FileManageE2ETest.java
 
b/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/cases/FileManageE2ETest.java
index 98bbada..1a32b5e 100644
--- 
a/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/cases/FileManageE2ETest.java
+++ 
b/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/cases/FileManageE2ETest.java
@@ -20,6 +20,7 @@
 package org.apache.dolphinscheduler.e2e.cases;
 
 
+import org.apache.dolphinscheduler.e2e.core.Constants;
 import org.apache.dolphinscheduler.e2e.core.DolphinScheduler;
 import org.apache.dolphinscheduler.e2e.pages.LoginPage;
 import org.apache.dolphinscheduler.e2e.pages.resource.FileManagePage;
@@ -28,6 +29,7 @@ import 
org.apache.dolphinscheduler.e2e.pages.security.SecurityPage;
 import org.apache.dolphinscheduler.e2e.pages.security.TenantPage;
 import org.apache.dolphinscheduler.e2e.pages.security.UserPage;
 
+import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Order;
 import org.junit.jupiter.api.Test;
@@ -38,6 +40,12 @@ import org.openqa.selenium.remote.RemoteWebDriver;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.awaitility.Awaitility.await;
 
+import java.io.File;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.nio.file.Paths;
+import java.util.Arrays;
+
 @DolphinScheduler(composeFiles = "docker/file-manage/docker-compose.yaml")
 public class FileManageE2ETest {
     private static RemoteWebDriver browser;
@@ -54,6 +62,20 @@ public class FileManageE2ETest {
 
     private static final String testDiretoryName = "test_directory";
 
+    private static final String testSubDirectoryName = "test_sub_directory";
+
+    private static final String testRenameDirectoryName = 
"test_rename_directory";
+
+    private static final String testFileName = "test_file";
+
+    private static final String testRenameFileName = "test_rename_file.sh";
+
+    private static final String testUnder1GBFileName = "test_file_0.01G";
+
+    private static final String testOver1GBFilePath = Constants.HOST_TMP_PATH 
+ "/test_file_1.5G";
+
+    private static final String testUnder1GBFilePath = Constants.HOST_TMP_PATH 
+ "/" + testUnder1GBFileName;
+
     @BeforeAll
     public static void setup() {
         TenantPage tenantPage = new LoginPage(browser)
@@ -72,6 +94,21 @@ public class FileManageE2ETest {
             .goToTab(FileManagePage.class);
     }
 
+    @AfterAll
+    public static void cleanup() {
+        String[] command = {"/bin/bash", "-c", String.format("sudo rm -f %s && 
sudo rm -f %s && sudo rm -rf %s", testUnder1GBFilePath, testOver1GBFilePath, 
Constants.HOST_CHROME_DOWNLOAD_PATH)};
+
+        try {
+            Process pro = Runtime.getRuntime().exec(command);
+            int status = pro.waitFor();
+            if (status != 0) {
+                throw new RuntimeException(String.format("Failed to call 
shell's command: %s", Arrays.toString(command)));
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
     @Test
     @Order(10)
     void testCreateDirectory() {
@@ -86,6 +123,19 @@ public class FileManageE2ETest {
     }
 
     @Test
+    @Order(11)
+    void testCancelCreateDirectory() {
+        final FileManagePage page = new FileManagePage(browser);
+
+        page.cancelCreateDirectory(testDiretoryName, "test_desc");
+
+        await().untilAsserted(() -> assertThat(page.fileList())
+            .as("File list should contain newly-created file")
+            .extracting(WebElement::getText)
+            .anyMatch(it -> it.contains(testDiretoryName)));
+    }
+
+    @Test
     @Order(20)
     void testCreateDuplicateDirectory() {
         final FileManagePage page = new FileManagePage(browser);
@@ -100,11 +150,43 @@ public class FileManageE2ETest {
     }
 
     @Test
+    @Order(21)
+    void testCreateSubDirectory() {
+        final FileManagePage page = new FileManagePage(browser);
+
+        page.createSubDirectory(testDiretoryName, testSubDirectoryName, 
"test_desc");
+
+        await().untilAsserted(() -> assertThat(page.fileList())
+            .as("File list should contain newly-created file")
+            .extracting(WebElement::getText)
+            .anyMatch(it -> it.contains(testSubDirectoryName)));
+    }
+
+    @Test
+    @Order(22)
+    void testRenameDirectory() {
+        final FileManagePage page = new FileManagePage(browser);
+
+        page.rename(testSubDirectoryName, testRenameDirectoryName);
+
+        await().untilAsserted(() -> {
+            browser.navigate().refresh();
+
+            assertThat(page.fileList())
+                .as("File list should contain newly-created file")
+                .extracting(WebElement::getText)
+                .anyMatch(it -> it.contains(testRenameDirectoryName));
+        });
+    }
+
+    @Test
     @Order(30)
     void testDeleteDirectory() {
         final FileManagePage page = new FileManagePage(browser);
 
-        page.delete(testDiretoryName);
+        page.goToNav(ResourcePage.class)
+            .goToTab(FileManagePage.class)
+            .delete(testDiretoryName);
 
         await().untilAsserted(() -> {
             browser.navigate().refresh();
@@ -116,4 +198,117 @@ public class FileManageE2ETest {
             );
         });
     }
+
+    @Test
+    @Order(40)
+    void testCreateFile() {
+        final FileManagePage page = new FileManagePage(browser);
+        String scripts = "echo 123";
+
+        page.createFile(testFileName, scripts);
+
+        await().untilAsserted(() -> assertThat(page.fileList())
+            .as("File list should contain newly-created file")
+            .extracting(WebElement::getText)
+            .anyMatch(it -> it.contains(testFileName)));
+    }
+
+    @Test
+    @Order(41)
+    void testRenameFile() {
+        final FileManagePage page = new FileManagePage(browser);
+
+        page.rename(testFileName, testRenameFileName);
+
+        await().untilAsserted(() -> {
+            browser.navigate().refresh();
+
+            assertThat(page.fileList())
+                .as("File list should contain newly-created file")
+                .extracting(WebElement::getText)
+                .anyMatch(it -> it.contains(testRenameFileName));
+        });
+    }
+
+    @Test
+    @Order(42)
+    void testEditFile() {
+        final FileManagePage page = new FileManagePage(browser);
+        String scripts = "echo 456";
+
+        page.editFile(testRenameFileName, scripts);
+
+        await().untilAsserted(() -> assertThat(page.fileList())
+            .as("File list should contain newly-created file")
+            .extracting(WebElement::getText)
+            .anyMatch(it -> it.contains(testRenameFileName)));
+    }
+
+    @Test
+    @Order(45)
+    void testDeleteFile() {
+        final FileManagePage page = new FileManagePage(browser);
+
+        page.delete(testRenameFileName);
+
+        await().untilAsserted(() -> {
+            browser.navigate().refresh();
+
+            assertThat(
+                page.fileList()
+            ).noneMatch(
+                it -> it.getText().contains(testRenameFileName)
+            );
+        });
+    }
+
+    @Test
+    @Order(60)
+    void testUploadOver1GBFile() throws IOException {
+        final FileManagePage page = new FileManagePage(browser);
+
+        RandomAccessFile file = new RandomAccessFile(testOver1GBFilePath, 
"rw");
+        file.setLength((long) (1.5 * 1024 * 1024 * 1024));
+
+        page.uploadFile(testOver1GBFilePath);
+
+        await().untilAsserted(() ->
+            assertThat(browser.findElement(By.tagName("body")).getText())
+                .contains("Upload File size cannot exceed 1g")
+        );
+    }
+
+    @Test
+    @Order(65)
+    void testUploadUnder1GBFile() throws IOException {
+        final FileManagePage page = new FileManagePage(browser);
+
+        browser.navigate().refresh();
+
+        RandomAccessFile file = new RandomAccessFile(testUnder1GBFilePath, 
"rw");
+        file.setLength((long) (0.01 * 1024 * 1024 * 1024));
+
+        page.uploadFile(testUnder1GBFilePath);
+
+        await().untilAsserted(() -> {
+            assertThat(page.fileList())
+                .as("File list should contain newly-created file")
+                .extracting(WebElement::getText)
+                .anyMatch(it -> it.contains(testUnder1GBFileName));
+        });
+    }
+
+    @Test
+    @Order(70)
+    void testDownloadFile() {
+        final FileManagePage page = new FileManagePage(browser);
+
+        page.downloadFile(testUnder1GBFileName);
+
+        File file = new File(Paths.get(Constants.HOST_CHROME_DOWNLOAD_PATH, 
testUnder1GBFileName).toFile().getAbsolutePath());
+
+        await().untilAsserted(() -> {
+            assert file.exists();
+        });
+    }
 }
diff --git 
a/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/cases/MysqlDataSourceE2ETest.java
 
b/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/cases/MysqlDataSourceE2ETest.java
index 996a282..6c28e7b 100644
--- 
a/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/cases/MysqlDataSourceE2ETest.java
+++ 
b/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/cases/MysqlDataSourceE2ETest.java
@@ -31,6 +31,7 @@ import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Order;
 import org.junit.jupiter.api.Test;
 import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.WebElement;
 import org.openqa.selenium.remote.RemoteWebDriver;
 import org.openqa.selenium.support.ui.ExpectedConditions;
@@ -105,4 +106,5 @@ public class MysqlDataSourceE2ETest {
             );
         });
     }
+
 }
diff --git 
a/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/pages/resource/FileManagePage.java
 
b/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/pages/resource/FileManagePage.java
index 08d9311..9e5661d 100644
--- 
a/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/pages/resource/FileManagePage.java
+++ 
b/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/pages/resource/FileManagePage.java
@@ -22,16 +22,18 @@ package org.apache.dolphinscheduler.e2e.pages.resource;
 
 import lombok.Getter;
 
+import org.apache.dolphinscheduler.e2e.pages.common.CodeEditor;
 import org.apache.dolphinscheduler.e2e.pages.common.NavBarPage;
-import org.apache.dolphinscheduler.e2e.pages.security.TenantPage;
 
 import org.openqa.selenium.By;
 import org.openqa.selenium.WebElement;
+import org.openqa.selenium.remote.LocalFileDetector;
 import org.openqa.selenium.remote.RemoteWebDriver;
 import org.openqa.selenium.support.FindBy;
 import org.openqa.selenium.support.FindBys;
 import org.openqa.selenium.support.PageFactory;
 
+import java.io.File;
 import java.util.List;
 
 
@@ -40,8 +42,20 @@ public class FileManagePage extends NavBarPage implements 
ResourcePage.Tab {
     @FindBy(id = "btnCreateDirectory")
     private WebElement buttonCreateDirectory;
 
+    @FindBy(id = "btnCreateFile")
+    private WebElement buttonCreateFile;
+
+    @FindBy(id = "btnUploadFile")
+    private WebElement buttonUploadFile;
+
     private final CreateDirectoryBox createDirectoryBox;
 
+    private final RenameDirectoryBox renameDirectoryBox;
+
+    private final CreateFileBox createFileBox;
+
+    private final UploadFileBox uploadFileBox;
+
     @FindBy(className = "items")
     private List<WebElement> fileList;
 
@@ -58,6 +72,12 @@ public class FileManagePage extends NavBarPage implements 
ResourcePage.Tab {
         super(driver);
 
         createDirectoryBox = new CreateDirectoryBox();
+
+        renameDirectoryBox = new RenameDirectoryBox();
+
+        createFileBox = new CreateFileBox();
+
+        uploadFileBox = new UploadFileBox();
     }
 
     public FileManagePage createDirectory(String name, String description) {
@@ -70,6 +90,51 @@ public class FileManagePage extends NavBarPage implements 
ResourcePage.Tab {
         return this;
     }
 
+    public FileManagePage cancelCreateDirectory(String name, String 
description) {
+        buttonCreateDirectory().click();
+
+        createDirectoryBox().inputDirectoryName().sendKeys(name);
+        createDirectoryBox().inputDescription().sendKeys(description);
+        createDirectoryBox().buttonCancel().click();
+
+        return this;
+    }
+
+    public FileManagePage rename(String currentName, String AfterName) {
+        fileList()
+            .stream()
+            .filter(it -> it.getText().contains(currentName))
+            .flatMap(it -> it.findElements(By.id("btnRename")).stream())
+            .filter(WebElement::isDisplayed)
+            .findFirst()
+            .orElseThrow(() -> new RuntimeException("No rename button in file 
manage list"))
+            .click();
+
+        renameDirectoryBox().inputName().clear();
+        renameDirectoryBox().inputName().sendKeys(AfterName);
+        renameDirectoryBox().buttonSubmit().click();
+
+        return this;
+    }
+
+    public FileManagePage createSubDirectory(String directoryName, String 
subDirectoryName, String description) {
+        fileList()
+            .stream()
+            .filter(it -> it.getText().contains(directoryName))
+            .filter(WebElement::isDisplayed)
+            .findFirst()
+            .orElseThrow(() -> new RuntimeException(String.format("No %s in 
file manage list", directoryName)))
+            .click();
+
+        buttonCreateDirectory().click();
+
+        createDirectoryBox().inputDirectoryName().sendKeys(subDirectoryName);
+        createDirectoryBox().inputDescription().sendKeys(description);
+        createDirectoryBox().buttonSubmit().click();
+
+        return this;
+    }
+
     public FileManagePage delete(String name) {
         fileList()
             .stream()
@@ -90,6 +155,56 @@ public class FileManagePage extends NavBarPage implements 
ResourcePage.Tab {
         return this;
     }
 
+    public FileManagePage createFile(String fileName, String scripts) {
+        buttonCreateFile().click();
+
+        createFileBox().inputFileName().sendKeys(fileName);
+        createFileBox().codeEditor().content(scripts);
+        createFileBox().buttonSubmit().click();
+
+        return this;
+    }
+
+    public FileManagePage editFile(String fileName, String scripts) {
+        fileList()
+            .stream()
+            .filter(it -> it.getText().contains(fileName))
+            .flatMap(it -> it.findElements(By.id("btnEdit")).stream())
+            .filter(WebElement::isDisplayed)
+            .findFirst()
+            .orElseThrow(() -> new RuntimeException("No edit button in file 
manage list"))
+            .click();
+
+        createFileBox().codeEditor().content(scripts);
+        createFileBox().buttonSubmit().click();
+
+        return this;
+    }
+
+    public FileManagePage uploadFile(String filePath) {
+        buttonUploadFile().click();
+
+        driver.setFileDetector(new LocalFileDetector());
+
+        uploadFileBox().buttonUpload().sendKeys(filePath);
+        uploadFileBox().buttonSubmit().click();
+
+        return this;
+    }
+
+    public FileManagePage downloadFile(String fileName) {
+        fileList()
+            .stream()
+            .filter(it -> it.getText().contains(fileName))
+            .flatMap(it -> it.findElements(By.id("btnDownload")).stream())
+            .filter(WebElement::isDisplayed)
+            .findFirst()
+            .orElseThrow(() -> new RuntimeException("No download button in 
file manage list"))
+            .click();
+
+        return this;
+    }
+
     @Getter
     public class CreateDirectoryBox {
         CreateDirectoryBox() {
@@ -108,4 +223,57 @@ public class FileManagePage extends NavBarPage implements 
ResourcePage.Tab {
         @FindBy(id = "btnCancel")
         private WebElement buttonCancel;
     }
+
+    @Getter
+    public class RenameDirectoryBox {
+        RenameDirectoryBox() {
+            PageFactory.initElements(driver, this);
+        }
+
+        @FindBy(id = "inputName")
+        private WebElement inputName;
+
+        @FindBy(id = "inputDescription")
+        private WebElement inputDescription;
+
+        @FindBy(id = "btnSubmit")
+        private WebElement buttonSubmit;
+
+        @FindBy(id = "btnCancel")
+        private WebElement buttonCancel;
+    }
+
+    @Getter
+    public class CreateFileBox {
+        CreateFileBox() {
+            PageFactory.initElements(driver, this);
+        }
+
+        @FindBy(id = "inputFileName")
+        private WebElement inputFileName;
+
+        private final CodeEditor codeEditor = new CodeEditor(driver);
+
+        @FindBy(id = "btnSubmit")
+        private WebElement buttonSubmit;
+
+        @FindBy(id = "btnCancel")
+        private WebElement buttonCancel;
+    }
+
+    @Getter
+    public class UploadFileBox {
+        UploadFileBox() {
+            PageFactory.initElements(driver, this);
+        }
+
+        @FindBy(id = "btnUpload")
+        private WebElement buttonUpload;
+
+        @FindBy(id = "btnSubmit")
+        private WebElement buttonSubmit;
+
+        @FindBy(id = "btnCancel")
+        private WebElement buttonCancel;
+    }
 }
diff --git 
a/dolphinscheduler-e2e/dolphinscheduler-e2e-core/src/main/java/org/apache/dolphinscheduler/e2e/core/Constants.java
 
b/dolphinscheduler-e2e/dolphinscheduler-e2e-core/src/main/java/org/apache/dolphinscheduler/e2e/core/Constants.java
new file mode 100644
index 0000000..1852fa8
--- /dev/null
+++ 
b/dolphinscheduler-e2e/dolphinscheduler-e2e-core/src/main/java/org/apache/dolphinscheduler/e2e/core/Constants.java
@@ -0,0 +1,51 @@
+/*
+ * 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.e2e.core;
+
+import java.nio.file.Paths;
+
+/**
+ * Constants
+ */
+public final class Constants {
+
+    private Constants() {
+        throw new UnsupportedOperationException("Construct Constants");
+    }
+
+    /**
+     * tmp directory path
+     */
+    public static final String HOST_TMP_PATH = 
System.getProperty("java.io.tmpdir");
+
+    /**
+     * chrome download path in host
+     */
+    public static final String HOST_CHROME_DOWNLOAD_PATH = 
Paths.get(System.getProperty("java.io.tmpdir"), 
"download").toFile().getAbsolutePath();
+
+    /**
+     * chrome download path in selenium/standalone-chrome-debug container
+     */
+    public static final String SELENIUM_CONTAINER_CHROME_DOWNLOAD_PATH = 
"/home/seluser/Downloads";
+
+    /**
+     * host os name
+     */
+    public static final String OS_NAME = 
System.getProperties().getProperty("os.name");
+
+}
diff --git 
a/dolphinscheduler-e2e/dolphinscheduler-e2e-core/src/main/java/org/apache/dolphinscheduler/e2e/core/DolphinSchedulerExtension.java
 
b/dolphinscheduler-e2e/dolphinscheduler-e2e-core/src/main/java/org/apache/dolphinscheduler/e2e/core/DolphinSchedulerExtension.java
index 518f9f6..0273df2 100644
--- 
a/dolphinscheduler-e2e/dolphinscheduler-e2e-core/src/main/java/org/apache/dolphinscheduler/e2e/core/DolphinSchedulerExtension.java
+++ 
b/dolphinscheduler-e2e/dolphinscheduler-e2e-core/src/main/java/org/apache/dolphinscheduler/e2e/core/DolphinSchedulerExtension.java
@@ -31,6 +31,7 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.time.Duration;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
@@ -116,8 +117,33 @@ final class DolphinSchedulerExtension
         } else {
             record = Files.createTempDirectory("record-");
         }
+
+        // According to 
https://github.com/SeleniumHQ/docker-selenium#mounting-volumes-to-retrieve-downloaded-files
+        if ("linux".equalsIgnoreCase(Constants.OS_NAME)) {
+            File file = new File(Constants.HOST_CHROME_DOWNLOAD_PATH);
+            boolean result = file.mkdir();
+
+            if (!result) {
+                throw new IOException(String.format("mkdir %s error", 
Constants.HOST_CHROME_DOWNLOAD_PATH));
+            }
+
+            String[] command = {"/bin/bash", "-c", String.format("sudo chown 
1200:1201 %s", Constants.HOST_CHROME_DOWNLOAD_PATH)};
+
+            try {
+                Process pro = Runtime.getRuntime().exec(command);
+                int status = pro.waitFor();
+                if (status != 0) {
+                    throw new IOException(String.format("Failed to call 
shell's command: %s", Arrays.toString(command)));
+                }
+            } catch (Exception e) {
+                throw new IOException(e);
+            }
+            
+        }
+
         browser = new BrowserWebDriverContainer<>()
             .withCapabilities(new ChromeOptions())
+            .withFileSystemBind(Constants.HOST_CHROME_DOWNLOAD_PATH, 
Constants.SELENIUM_CONTAINER_CHROME_DOWNLOAD_PATH)
             .withRecordingMode(RECORD_ALL, record.toFile(), MP4);
         if (network != null) {
             browser.withNetwork(network);
diff --git 
a/dolphinscheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/create/index.vue
 
b/dolphinscheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/create/index.vue
index 003e9eb..ef526e5 100644
--- 
a/dolphinscheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/create/index.vue
+++ 
b/dolphinscheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/create/index.vue
@@ -22,6 +22,7 @@
           <template slot="name"><strong>*</strong>{{$t('File 
Name')}}</template>
           <template slot="content">
             <el-input
+                    id="inputFileName"
                     type="input"
                     v-model="fileName"
                     maxlength="60"
@@ -66,8 +67,8 @@
           <template slot="name">&nbsp;</template>
           <template slot="content">
             <div class="submit">
-              <el-button type="primary" size="small" round 
:loading="spinnerLoading" @click="ok()">{{spinnerLoading ? $t('Loading...') : 
$t('Create')}} </el-button>
-              <el-button type="text" size="small" @click="() => 
$router.push({name: 'file'})"> {{$t('Cancel')}} </el-button>
+              <el-button id="btnSubmit" type="primary" size="small" round 
:loading="spinnerLoading" @click="ok()">{{spinnerLoading ? $t('Loading...') : 
$t('Create')}} </el-button>
+              <el-button id="btnCancel" type="text" size="small" @click="() => 
$router.push({name: 'file'})"> {{$t('Cancel')}} </el-button>
             </div>
           </template>
         </m-list-box-f>
diff --git 
a/dolphinscheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/edit/index.vue
 
b/dolphinscheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/edit/index.vue
index e2e26c8..0156747 100644
--- 
a/dolphinscheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/edit/index.vue
+++ 
b/dolphinscheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/edit/index.vue
@@ -27,8 +27,8 @@
               <textarea id="code-edit-mirror" 
name="code-edit-mirror"></textarea>
             </div>
             <div class="submit-c">
-              <el-button type="text" @click="close()" :disabled="disabled" 
size="small"> {{$t('Return')}} </el-button>
-              <el-button type="primary" :loading="spinnerLoading" 
@click="ok()" round size="small">{{spinnerLoading ? $t('Loading...') : 
$t('Save')}} </el-button>
+              <el-button id="btnCancel" type="text" @click="close()" 
:disabled="disabled" size="small"> {{$t('Return')}} </el-button>
+              <el-button id="btnSubmit" type="primary" 
:loading="spinnerLoading" @click="ok()" round size="small">{{spinnerLoading ? 
$t('Loading...') : $t('Save')}} </el-button>
             </div>
           </template>
           <m-no-data :msg="msg" v-if="msg"></m-no-data>
diff --git 
a/dolphinscheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/list/_source/list.vue
 
b/dolphinscheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/list/_source/list.vue
index 5f6806f..321ee53 100755
--- 
a/dolphinscheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/list/_source/list.vue
+++ 
b/dolphinscheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/list/_source/list.vue
@@ -54,13 +54,13 @@
         <el-table-column :label="$t('Operation')" width="150">
           <template slot-scope="scope">
             <el-tooltip :content="$t('Edit')" placement="top">
-              <span><el-button type="primary" size="mini" 
icon="el-icon-edit-outline" @click="_edit(scope.row)" 
:disabled="_rtDisb(scope.row)" circle></el-button></span>
+              <span><el-button id="btnEdit" type="primary" size="mini" 
icon="el-icon-edit-outline" @click="_edit(scope.row)" 
:disabled="_rtDisb(scope.row)" circle></el-button></span>
             </el-tooltip>
             <el-tooltip :content="$t('Rename')" placement="top">
-              <span><el-button type="primary" size="mini" icon="el-icon-edit" 
@click="_rename(scope.row,scope.$index)" circle></el-button></span>
+              <span><el-button id="btnRename" type="primary" size="mini" 
icon="el-icon-edit" @click="_rename(scope.row,scope.$index)" 
circle></el-button></span>
             </el-tooltip>
             <el-tooltip :content="$t('Download')" placement="top">
-              <span><el-button type="primary" size="mini" 
icon="el-icon-download" @click="_downloadFile(scope.row)" 
:disabled="scope.row.directory? true: false" circle></el-button></span>
+              <span><el-button id="btnDownload" type="primary" size="mini" 
icon="el-icon-download" @click="_downloadFile(scope.row)" 
:disabled="scope.row.directory? true: false" circle></el-button></span>
             </el-tooltip>
             <el-tooltip :content="$t('Delete')" placement="top">
               <el-popconfirm
diff --git 
a/dolphinscheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/list/_source/rename.vue
 
b/dolphinscheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/list/_source/rename.vue
index aa25fa6..156e6a0 100644
--- 
a/dolphinscheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/list/_source/rename.vue
+++ 
b/dolphinscheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/list/_source/rename.vue
@@ -22,6 +22,7 @@
           <template slot="name"><strong>*</strong>{{$t('Name')}}</template>
           <template slot="content">
             <el-input
+                    id="inputName"
                     type="input"
                     v-model="name"
                     size="small"
@@ -33,6 +34,7 @@
           <template slot="name">{{$t('Description')}}</template>
           <template slot="content">
             <el-input
+                    id="inputDescription"
                     type="textarea"
                     v-model="description"
                     size="small"
diff --git 
a/dolphinscheduler-ui/src/js/module/components/fileUpdate/fileUpdate.vue 
b/dolphinscheduler-ui/src/js/module/components/fileUpdate/fileUpdate.vue
index dcfe340..e864ced 100755
--- a/dolphinscheduler-ui/src/js/module/components/fileUpdate/fileUpdate.vue
+++ b/dolphinscheduler-ui/src/js/module/components/fileUpdate/fileUpdate.vue
@@ -70,7 +70,7 @@
             <template slot="content">
               <div class="file-update-box">
                 <template v-if="progress === 0">
-                  <input ref="file" name="file" type="file" 
class="file-update" @change="_onChange">
+                  <input id="btnUpload" ref="file" name="file" type="file" 
class="file-update" @change="_onChange">
                   <el-button type="dashed" size="mini">{{$t('Upload')}}<em 
class="el-icon-upload"></em></el-button>
                 </template>
                 <div class="progress-box" v-if="progress !== 0">
diff --git a/dolphinscheduler-ui/src/js/module/components/popup/popup.vue 
b/dolphinscheduler-ui/src/js/module/components/popup/popup.vue
index 9b7020e..57d7179 100644
--- a/dolphinscheduler-ui/src/js/module/components/popup/popup.vue
+++ b/dolphinscheduler-ui/src/js/module/components/popup/popup.vue
@@ -23,8 +23,8 @@
       <slot name="content"></slot>
     </div>
     <div class="bottom-p">
-      <el-button type="text" size="mini" round @click="close()" 
:disabled="disabled"> {{$t('Cancel')}} </el-button>
-      <el-button type="primary" size="mini" round :loading="spinnerLoading" 
@click="ok()" :disabled="disabled || apDisabled">{{spinnerLoading ? 
$t('Loading...') : okText}} </el-button>
+      <el-button id="btnCancel" type="text" size="mini" round @click="close()" 
:disabled="disabled"> {{$t('Cancel')}} </el-button>
+      <el-button id="btnSubmit" type="primary" size="mini" round 
:loading="spinnerLoading" @click="ok()" :disabled="disabled || 
apDisabled">{{spinnerLoading ? $t('Loading...') : okText}} </el-button>
     </div>
   </div>
 </template>

Reply via email to