diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/base/BaseDriver.java b/e2e/src/test/java/org/apache/dolphinscheduler/base/BaseDriver.java
index 7d3ab9b837..044e28f082 100644
--- a/e2e/src/test/java/org/apache/dolphinscheduler/base/BaseDriver.java
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/base/BaseDriver.java
@@ -19,6 +19,7 @@ package org.apache.dolphinscheduler.base;
import org.apache.dolphinscheduler.constant.TestConstant;
import org.apache.dolphinscheduler.util.PropertiesReader;
+import org.openqa.selenium.Cookie;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
@@ -35,7 +36,7 @@ public class BaseDriver {
/**
* driver
*/
- private WebDriver driver;
+ private static WebDriver driver;
/**
* chrome driver path
@@ -88,6 +89,7 @@ public class BaseDriver {
chromeOptions.setPageLoadStrategy(PageLoadStrategy.NONE);
chromeOptions.addArguments("--no-sandbox");
chromeOptions.addArguments("--disable-dev-shm-usage");
+ //Browser client running requires annotation --headless
chromeOptions.addArguments("--headless");
chromeOptions.addArguments("--disable-gpu");
chromeOptions.addArguments("--whitelisted-ips");
@@ -120,7 +122,7 @@ public class BaseDriver {
*
* @return driver
*/
- public WebDriver getDriver() {
+ public static WebDriver getDriver() {
return driver;
}
@@ -141,7 +143,7 @@ public class BaseDriver {
public void closeBrowser() throws InterruptedException {
// JS Show a pop-up box to indicate the end of the test
Thread.sleep(TestConstant.ONE_THOUSANG);
- ((JavascriptExecutor) driver).executeScript("alert('Test completed, browser closes after 3s')");
+// ((JavascriptExecutor) driver).executeScript("alert('Test completed, browser closes after 3s')");
Thread.sleep(TestConstant.THREE_THOUSANG);
if (driver != null) {
driver.quit();
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/base/BaseTest.java b/e2e/src/test/java/org/apache/dolphinscheduler/base/BaseTest.java
index c12c19fc1d..88012e9f42 100644
--- a/e2e/src/test/java/org/apache/dolphinscheduler/base/BaseTest.java
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/base/BaseTest.java
@@ -17,7 +17,6 @@
package org.apache.dolphinscheduler.base;
-import org.apache.dolphinscheduler.page.LoginPage;
import org.apache.dolphinscheduler.util.PropertiesReader;
import org.openqa.selenium.WebDriver;
import org.testng.annotations.*;
@@ -28,6 +27,7 @@ import java.util.Properties;
/**
* base test class
*/
+@Test(groups={"functionTests"})
public class BaseTest {
/**
* properties
@@ -43,7 +43,7 @@ public class BaseTest {
/**
* driver
*/
- public WebDriver driver;
+ public static WebDriver driver;
/**
* Executed before executing a test suite
@@ -54,7 +54,7 @@ public class BaseTest {
*/
@BeforeSuite(alwaysRun = true)
@Parameters({"propertiesPath"})
- public void beforeSuite(@Optional("src/test/resources/config/config.properties") String propertiesPath) throws IOException {
+ public void beforeSuite(@Optional("src/test/resources/config/config.properties") String propertiesPath) throws Exception {
// read properties
properties = PropertiesReader.readProperties(propertiesPath);
}
@@ -70,14 +70,13 @@ public class BaseTest {
driver = baseDriver.getDriver();
}
+
+
/**
* Executed before executing a class method in a test case
*/
@BeforeClass(alwaysRun = true)
- public void setUp() throws IOException, InterruptedException {
- LoginPage loginPage = new LoginPage(driver);
- loginPage.jumpPage();
- loginPage.login();
+ public void setUp() throws Exception {
}
@@ -85,7 +84,7 @@ public class BaseTest {
* Execute after executing a class method in a test case
*/
@AfterClass(alwaysRun = true)
- public void afterClass() {
+ public void afterClass() throws InterruptedException {
// logout
}
@@ -102,6 +101,6 @@ public class BaseTest {
* Execute after executing a testsuite
*/
@AfterSuite(alwaysRun = true)
- public void afterSuite() {
+ public void afterSuite() throws InterruptedException {
}
}
\ No newline at end of file
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/data/LoginData.java b/e2e/src/test/java/org/apache/dolphinscheduler/data/LoginData.java
index 532849565c..e56df5a448 100644
--- a/e2e/src/test/java/org/apache/dolphinscheduler/data/LoginData.java
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/data/LoginData.java
@@ -39,5 +39,5 @@ public class LoginData {
*/
public static final String PASSWORD = PropertiesReader.getKey("PASSWORD");
- public static final String TENANT = "Tenant Manage - DolphinScheduler";
+ public static final String TENANT = "租户管理 - DolphinScheduler";
}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/data/project/CreatWorkflowData.java b/e2e/src/test/java/org/apache/dolphinscheduler/data/project/CreatWorkflowData.java
index 765a54f406..70f4238610 100644
--- a/e2e/src/test/java/org/apache/dolphinscheduler/data/project/CreatWorkflowData.java
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/data/project/CreatWorkflowData.java
@@ -18,7 +18,7 @@ package org.apache.dolphinscheduler.data.project;
public class CreatWorkflowData {
//input shell task name
- public static final String SHELL_TASK_NAME = "shell task description test";
+ public static final String SHELL_TASK_NAME = "shell task description test1";
//input shell task description
public static final String SHELL_TASK_DESCRIPTION = "shell task description test";
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/data/project/CreatProjectData.java b/e2e/src/test/java/org/apache/dolphinscheduler/data/project/CreateProjectData.java
similarity index 91%
rename from e2e/src/test/java/org/apache/dolphinscheduler/data/project/CreatProjectData.java
rename to e2e/src/test/java/org/apache/dolphinscheduler/data/project/CreateProjectData.java
index 8f6c9c8e97..57d79e87d7 100644
--- a/e2e/src/test/java/org/apache/dolphinscheduler/data/project/CreatProjectData.java
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/data/project/CreateProjectData.java
@@ -16,9 +16,9 @@
*/
package org.apache.dolphinscheduler.data.project;
-public class CreatProjectData {
+public class CreateProjectData {
// create project name
- public static final String PROJECT_NAME = "selenium_project";
+ public static final String PROJECT_NAME = "selenium_project_3";
// create project description
public static final String DESCRIPTION = "test create project description";
// project page title
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/data/project/CreateWorkflowData.java b/e2e/src/test/java/org/apache/dolphinscheduler/data/project/CreateWorkflowData.java
new file mode 100644
index 0000000000..31b5bdd1e0
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/data/project/CreateWorkflowData.java
@@ -0,0 +1,73 @@
+/*
+ * 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.data.project;
+
+public class CreateWorkflowData {
+ /**
+ * create workflow data
+ */
+ //input shell task name
+ public static final String SHELL_TASK_NAME = "shell_task_selenium_5";
+
+ //input shell task description
+ public static final String SHELL_TASK_DESCRIPTION = "shell task description test";
+
+ //input timeout
+ public static final String INPUT_TIMEOUT = "60";
+
+ //input shell script
+ public static final String SHELL_SCRIPT = "echo 1111111";
+
+ //input custom parameters
+ public static final String INPUT_CUSTOM_PARAMETERS = "selenium_parameter";
+
+ //input custom parameters value
+ public static final String INPUT_CUSTOM_PARAMETERS_VALUE = "selenium_parameter_123";
+
+ //input add custom parameters
+ public static final String INPUT_ADD_CUSTOM_PARAMETERS = "selenium_parameter_delete";
+
+ //input add custom parameters value
+ public static final String INPUT_ADD_CUSTOM_PARAMETERS_VALUE = "selenium_parameter_delete_456";
+
+ //create workflow title
+ public static final String WORKFLOW_TITLE = "创建流程定义 - DolphinScheduler";
+
+ /**
+ * save workflow data
+ */
+ //input workflow name
+ public static final String INPUT_WORKFLOW_NAME = "selenium_shell_1";
+
+ //input workflow description
+ public static final String INPUT_WORKFLOW_DESCRIPTION = "test selenium_shell_1 description";
+
+ //input workflow timeout
+ public static final String INPUT_WORKFLOW_TIMEOUT = "30";
+
+ //input workflow global parameters
+ public static final String INPUT_WORKFLOW_GLOBAL_PARAMETERS = "selenium_global_parameters_1";
+
+ //input workflow global parameters value
+ public static final String INPUT_WORKFLOW_GLOBAL_PARAMETERS_VALUES = "selenium_global_parameters_value_1";
+
+ //input to add workflow global parameters
+ public static final String INPUT_ADD_WORKFLOW_GLOBAL_PARAMETERS = "selenium_global_parameters_2";
+
+ //input to add workflow global parameters value
+ public static final String INPUT_ADD_WORKFLOW_GLOBAL_PARAMETERS_VALUES = "selenium_global_parameters_value_2";
+}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/data/security/TenantManageData.java b/e2e/src/test/java/org/apache/dolphinscheduler/data/security/TenantManageData.java
index e6f6ee6b86..100351b600 100644
--- a/e2e/src/test/java/org/apache/dolphinscheduler/data/security/TenantManageData.java
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/data/security/TenantManageData.java
@@ -20,18 +20,12 @@
*/
package org.apache.dolphinscheduler.data.security;
-import org.apache.dolphinscheduler.data.LoginData;
public class TenantManageData {
- /**
- * Tenant URL
- */
- public static final String TENANAT_URL = LoginData.URL + "/ui/#/security/tenant";
-
/**
* Tenant Code
*/
- public static final String TENANAT_CODE = "dolphinscheduler_tenant_code2";
+ public static final String TENANAT_CODE = "dolphinscheduler_tenant_code15";
/**
* Tenant Name
@@ -48,7 +42,7 @@ public class TenantManageData {
*/
public static final String DESCRIPTION = "creat tenant test";
- public static final String TENANAT_MANAGE = "Tenant Manage - DolphinScheduler";
+ public static final String TENANAT_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/security/UserManageData.java
index 03c985fd81..6fcd923c53 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
@@ -16,12 +16,9 @@
*/
package org.apache.dolphinscheduler.data.security;
-import org.apache.dolphinscheduler.data.LoginData;
public class UserManageData {
- public static final String USER_URL = LoginData.URL + "/ui/#/security/users";
-
- public static final String USERNAME = "selenium111";
+ public static final String USERNAME = "selenium_5";
public static final String PASSWORD = "123456qwe";
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 f063d6ef61..25defcf53f 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
@@ -20,12 +20,20 @@ package org.apache.dolphinscheduler.locator.project;
import org.openqa.selenium.By;
public class CreateWorkflowLocator {
+
+ /**
+ * jump workflow define page
+ */
+
// click project name
public static final By CLICK_PROJECT_NAME = By.xpath("//span/a");
// click workflow define
public static final By CLICK_WORKFLOW_DEFINE = By.xpath("//li/span");
+ /**
+ * create workflow
+ */
// click create workflow button
public static final By CLICK_CREATE_WORKFLOW_BUTTON = By.xpath("//button/span");
@@ -96,15 +104,15 @@ public class CreateWorkflowLocator {
public static final By INPUT_CUSTOM_PARAMETERS = By.xpath("//div[2]/div/div/div/div/div/input");
//input custom parameters value
- public static final By INPUT_CUSTOM_PARAMETERS_VALUE = By.xpath("//div[2]/input");
+ public static final By INPUT_CUSTOM_PARAMETERS_VALUE = By.xpath("//div[2]/div/div/div/div[1]/div[2]/input");
- //click add custom parameters
- public static final By CLICK_ADD_CUSTOM_PARAMETERS = By.xpath("//span[2]/a/em");
+ //click to add custom parameters
+ public static final By CLICK_ADD_CUSTOM_PARAMETERS = By.xpath("//div[2]/div/div/div/div/span[2]/a/em");
- //input add custom parameters
- public static final By INPUT_ADD_CUSTOM_PARAMETERS = By.xpath("//div[2]/div/div/div/div[2]/div/input");
+ //input to add custom parameters
+ public static final By INPUT_ADD_CUSTOM_PARAMETERS = By.xpath("//div[2]/div/div/div/div[2]/div[1]/input");
- //input add custom parameters value
+ //input to add custom parameters value
public static final By INPUT_ADD_CUSTOM_PARAMETERS_VALUE = By.xpath("//div[2]/div[2]/input");
//delete custom parameters
@@ -112,4 +120,53 @@ public class CreateWorkflowLocator {
//click submit button
public static final By CLICK_SUBMIT_BUTTON = By.xpath("//button[2]/span");
+
+
+ /**
+ * save workflow
+ */
+ //click save workflow button
+ public static final By CLICK_SAVE_WORKFLOW_BUTTON = By.xpath("//button/span");
+
+ //input workflow name
+ public static final By INPUT_WORKFLOW_NAME = By.xpath("//input");
+
+ //input workflow description
+ public static final By INPUT_WORKFLOW_DESCRIPTION = By.xpath("//textarea");
+
+ //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");
+
+
+ //click workflow timeout alarm
+ public static final By CLICK_WORKFLOW_TIMEOUT_ALARM = By.xpath("//span[2]/span/span");
+
+ //input workflow timeout
+ public static final By INPUT_WORKFLOW_TIMEOUT = By.xpath("//span/div/input");
+
+ //click workflow global parameters
+ public static final By CLICK_WORKFLOW_GLOBAL_PARAMETERS = By.xpath("//span/a/em");
+
+ //input workflow global parameters
+ public static final By INPUT_WORKFLOW_GLOBAL_PARAMETERS = By.xpath("//div[8]/div/div/div/div/input");
+
+ //input workflow global parameters value
+ public static final By INPUT_WORKFLOW_GLOBAL_PARAMETERS_VALUES = By.xpath("//div[2]/input");
+
+ //click to add workflow global parameters
+ public static final By CLICK_ADD_WORKFLOW_GLOBAL_PARAMETERS = By.xpath("//span[2]/a/em");
+
+ //input to add workflow global parameters
+ public static final By INPUT_ADD_WORKFLOW_GLOBAL_PARAMETERS = By.xpath("//div[8]/div/div/div[2]/div/input");
+
+ //input to add workflow global parameters value
+ public static final By INPUT_ADD_WORKFLOW_GLOBAL_PARAMETERS_VALUES = By.xpath("//div[2]/div[2]/input");
+
+ //delete workflow global parameters value
+ public static final By CLICK_DELETE_WORKFLOW_GLOBAL_PARAMETERS = By.xpath("//div[2]/span/a/em");
+
+ //click add button
+ public static final By CLICK_ADD_BUTTON = By.xpath("//button[2]/span");
+
}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/locator/security/TenantManageLocator.java b/e2e/src/test/java/org/apache/dolphinscheduler/locator/security/TenantManageLocator.java
index 7d9c8a57ce..d95265cf0b 100644
--- a/e2e/src/test/java/org/apache/dolphinscheduler/locator/security/TenantManageLocator.java
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/locator/security/TenantManageLocator.java
@@ -19,7 +19,9 @@ package org.apache.dolphinscheduler.locator.security;
import org.openqa.selenium.By;
public class TenantManageLocator{
- public static final By CREATE_TENANT_BUTTON = By.xpath("//button[@class='ans-btn ans-btn-ghost ans-btn-small']");
+ public static final By TENANT_MANAGE = By.xpath("//div[2]/div/a/div/a/span");
+
+ public static final By CREATE_TENANT_BUTTON = By.xpath("//button/span");
public static final By TENANT_INPUT_CODE = By.xpath("//div[2]/div/div/div[2]/div/input");
@@ -30,4 +32,8 @@ public class TenantManageLocator{
public static final By DESCRIPTION = By.xpath("//textarea");
public static final By SUBMIT_BUTTON = By.xpath("//div[3]/button[2]/span");
+
+ public static final By DELETE_TENANT_BUTTON = By.xpath("//div[3]/div[1]/div/table/tr[2]/td[8]/span/button");
+
+ public static final By CONFIRM_DELETE_TENANT_BUTTON = By.xpath("//div[2]/div/button[2]/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 0d84692cb2..b5ecccc67d 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
@@ -42,4 +42,7 @@ public class UserManageLocator {
public static final By SUBMIT = By.xpath("//div[3]/button[2]/span");
+ public static final By DELETE_USER_BUTTON = By.xpath("//span[2]/button/i");
+
+ 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/LoginPage.java b/e2e/src/test/java/org/apache/dolphinscheduler/page/LoginPage.java
index cd6b318651..14970bead5 100644
--- a/e2e/src/test/java/org/apache/dolphinscheduler/page/LoginPage.java
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/page/LoginPage.java
@@ -21,6 +21,7 @@ import org.apache.dolphinscheduler.constant.TestConstant;
import org.apache.dolphinscheduler.data.LoginData;
import org.apache.dolphinscheduler.locator.LoginLocator;
import org.apache.dolphinscheduler.util.RedisUtil;
+import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
@@ -38,18 +39,25 @@ public class LoginPage extends PageCommon {
/**
* jump page
*/
- public void jumpPage() {
- System.out.println("jump login page");
+ public void jumpPageEnlish() {
+ System.out.println("jump to English login page");
super.jumpPage(LoginData.URL);
+ Cookie cookie = new Cookie("language", "en_US", "/", null);
+ driver.manage().addCookie(cookie);
}
+ public void jumpPageChinese() {
+ super.jumpPage(LoginData.URL);
+ Cookie cookie = new Cookie("language", "zh_CN", "/", null);
+
+ driver.manage().addCookie(cookie);
+ }
/**
* login
*
* @return Whether to enter the specified page after searching
*/
public boolean login() throws InterruptedException {
- System.out.println("LoginPage");
// login data
sendInput(LoginLocator.LOGIN_INPUT_USER, LoginData.USER);
sendInput(LoginLocator.LOGIN_INPUT_PASSWORD, LoginData.PASSWORD);
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 8dd1010a82..d8e1ef655d 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
@@ -18,7 +18,7 @@ package org.apache.dolphinscheduler.page.project;
import org.apache.dolphinscheduler.common.PageCommon;
import org.apache.dolphinscheduler.constant.TestConstant;
-import org.apache.dolphinscheduler.data.project.CreatProjectData;
+import org.apache.dolphinscheduler.data.project.CreateProjectData;
import org.apache.dolphinscheduler.locator.project.CreateProjectLocator;
import org.openqa.selenium.WebDriver;
@@ -26,6 +26,7 @@ public class CreateProjectPage extends PageCommon {
public CreateProjectPage(WebDriver driver) {
super(driver);
}
+
/**
* jump page
*/
@@ -36,7 +37,7 @@ public class CreateProjectPage extends PageCommon {
}
/**
- * creatTenant
+ * createTenant
*
* @return Whether to enter the specified page after creat tenant
*/
@@ -46,13 +47,13 @@ public class CreateProjectPage extends PageCommon {
Thread.sleep(TestConstant.ONE_THOUSANG);
// input create project data
- sendInput(CreateProjectLocator.PROJECT_NAME, CreatProjectData.PROJECT_NAME);
- sendInput(CreateProjectLocator.PROJECT_DESCRIPTION, CreatProjectData.DESCRIPTION);
+ sendInput(CreateProjectLocator.PROJECT_NAME, CreateProjectData.PROJECT_NAME);
+ sendInput(CreateProjectLocator.PROJECT_DESCRIPTION, CreateProjectData.DESCRIPTION);
// click submit button
clickButton(CreateProjectLocator.SUBMIT_BUTTON);
// Whether to enter the specified page after submit
- return ifTitleContains(CreatProjectData.PROJECT_TITLE);
+ 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 aeec83cd19..d115124d8f 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
@@ -18,7 +18,7 @@ package org.apache.dolphinscheduler.page.project;
import org.apache.dolphinscheduler.common.PageCommon;
import org.apache.dolphinscheduler.constant.TestConstant;
-import org.apache.dolphinscheduler.data.project.CreatWorkflowData;
+import org.apache.dolphinscheduler.data.project.CreateWorkflowData;
import org.apache.dolphinscheduler.locator.project.CreateWorkflowLocator;
import org.openqa.selenium.WebDriver;
@@ -26,29 +26,33 @@ public class CreateWorkflowPage extends PageCommon {
public CreateWorkflowPage(WebDriver driver) {
super(driver);
}
+
/**
- * jump page
+ * jump create workflow page
*/
-
public boolean createWorkflow() throws InterruptedException {
+ System.out.println("Click on the project name to jump to the project homepage");
// click project name
clickElement(CreateWorkflowLocator.CLICK_PROJECT_NAME);
Thread.sleep(TestConstant.ONE_THOUSANG);
+ System.out.println("Click on workflow define");
// click workflow define
clickElement(CreateWorkflowLocator.CLICK_WORKFLOW_DEFINE);
Thread.sleep(TestConstant.ONE_THOUSANG);
+ System.out.println("Click create workflow button");
// click create workflow button
clickElement(CreateWorkflowLocator.CLICK_CREATE_WORKFLOW_BUTTON);
Thread.sleep(TestConstant.ONE_THOUSANG);
+ System.out.println("drag shell task");
//drag shell_task
dragAndDrop(CreateWorkflowLocator.MOUSE_DOWN_AT_SHELL,CreateWorkflowLocator.MOUSE_MOVE_SHELL_AT_DAG);
//input shell task _name
- sendInput(CreateWorkflowLocator.INPUT_SHELL_TASK_NAME , CreatWorkflowData.SHELL_TASK_NAME);
+ sendInput(CreateWorkflowLocator.INPUT_SHELL_TASK_NAME , CreateWorkflowData.SHELL_TASK_NAME);
//click stop run type
clickElement(CreateWorkflowLocator.CLICK_STOP_RUN_TYPE);
@@ -57,7 +61,7 @@ public class CreateWorkflowPage extends PageCommon {
clickElement(CreateWorkflowLocator.CLICK_NORMAL_RUN_TYPE);
//input shell task description
- sendInput(CreateWorkflowLocator.INPUT_SHELL_TASK_DESCRIPTION , CreatWorkflowData.SHELL_TASK_DESCRIPTION);
+ sendInput(CreateWorkflowLocator.INPUT_SHELL_TASK_DESCRIPTION , CreateWorkflowData.SHELL_TASK_DESCRIPTION);
//select task priority
clickElement(CreateWorkflowLocator.CLICK_TASK_PRIORITY);
@@ -73,19 +77,15 @@ public class CreateWorkflowPage extends PageCommon {
//select failed retry interval
clickElement(CreateWorkflowLocator.SELECT_FAIL_RETRIES_INTERVAL);
-
//click timeout alarm
clickElement(CreateWorkflowLocator.CLICK_TIMEOUT_ALARM);
-
//select timeout fail
clickElement(CreateWorkflowLocator.SELECT_TIMEOUT_FAIL);
-
//cancel timeout alarm
clickElement(CreateWorkflowLocator.CANCEL_TIMEOUT_ALARM);
-
//select timeout alarm
clickElement(CreateWorkflowLocator.SELECT_TIMEOUT_ALARM);
@@ -94,10 +94,10 @@ public class CreateWorkflowPage extends PageCommon {
clearInput(CreateWorkflowLocator.SELECT_TIMEOUT);
//input timeout
- sendInput(CreateWorkflowLocator.SELECT_TIMEOUT,CreatWorkflowData.INPUT_TIMEOUT);
+ sendInput(CreateWorkflowLocator.SELECT_TIMEOUT, CreateWorkflowData.INPUT_TIMEOUT);
//click codeMirror and input script
- inputCodeMirror(CreateWorkflowLocator.CLICK_CODE_MIRROR, CreateWorkflowLocator.INPUT_SCRIPT,CreatWorkflowData.SHELL_SCRIPT);
+ inputCodeMirror(CreateWorkflowLocator.CLICK_CODE_MIRROR, CreateWorkflowLocator.INPUT_SCRIPT, CreateWorkflowData.SHELL_SCRIPT);
scrollToElementBottom();
Thread.sleep(TestConstant.ONE_THOUSANG);
@@ -105,10 +105,10 @@ public class CreateWorkflowPage extends PageCommon {
clickElement(CreateWorkflowLocator.CLICK_CUSTOM_PARAMETERS);
//input custom parameters
- sendInput(CreateWorkflowLocator.INPUT_CUSTOM_PARAMETERS, CreatWorkflowData.INPUT_CUSTOM_PARAMETERS);
+ sendInput(CreateWorkflowLocator.INPUT_CUSTOM_PARAMETERS, CreateWorkflowData.INPUT_CUSTOM_PARAMETERS);
//input custom parameters value
- sendInput(CreateWorkflowLocator.INPUT_CUSTOM_PARAMETERS_VALUE, CreatWorkflowData.INPUT_CUSTOM_PARAMETERS_VALUE);
+ sendInput(CreateWorkflowLocator.INPUT_CUSTOM_PARAMETERS_VALUE, CreateWorkflowData.INPUT_CUSTOM_PARAMETERS_VALUE);
//click add custom parameters
clickElement(CreateWorkflowLocator.CLICK_ADD_CUSTOM_PARAMETERS);
@@ -117,10 +117,10 @@ public class CreateWorkflowPage extends PageCommon {
Thread.sleep(TestConstant.ONE_THOUSANG);
//input add custom parameters
- sendInput(CreateWorkflowLocator.INPUT_ADD_CUSTOM_PARAMETERS,CreatWorkflowData.INPUT_ADD_CUSTOM_PARAMETERS);
+ sendInput(CreateWorkflowLocator.INPUT_ADD_CUSTOM_PARAMETERS, CreateWorkflowData.INPUT_ADD_CUSTOM_PARAMETERS);
//input add custom parameters value
- sendInput(CreateWorkflowLocator.INPUT_ADD_CUSTOM_PARAMETERS_VALUE,CreatWorkflowData.INPUT_ADD_CUSTOM_PARAMETERS_VALUE);
+ sendInput(CreateWorkflowLocator.INPUT_ADD_CUSTOM_PARAMETERS_VALUE, CreateWorkflowData.INPUT_ADD_CUSTOM_PARAMETERS_VALUE);
//click delete custom parameters
clickElement(CreateWorkflowLocator.CLICK_DELETE_CUSTOM_PARAMETERS);
@@ -129,9 +129,64 @@ public class CreateWorkflowPage extends PageCommon {
//click submit button
clickElement(CreateWorkflowLocator.CLICK_SUBMIT_BUTTON);
Thread.sleep(TestConstant.ONE_THOUSANG);
-
+ System.out.println("Task node set up successfully");
+ System.out.println("move to Dag Element ");
moveToDragElement(CreateWorkflowLocator.MOUSE_MOVE_SHELL_AT_DAG,-300,-100);
- return ifTitleContains(CreatWorkflowData.WORKFLOW_TITLE);
+ return ifTitleContains(CreateWorkflowData.WORKFLOW_TITLE);
+ }
+
+ /**
+ * save workflow
+ */
+ public boolean saveWorkflow() throws InterruptedException {
+ System.out.println("start to save workflow ");
+
+ //click save workflow button
+ clickElement(CreateWorkflowLocator.CLICK_SAVE_WORKFLOW_BUTTON);
+
+ //input workflow name
+ sendInput(CreateWorkflowLocator.INPUT_WORKFLOW_NAME, CreateWorkflowData.INPUT_WORKFLOW_NAME);
+
+ //input workflow description
+ sendInput(CreateWorkflowLocator.INPUT_WORKFLOW_DESCRIPTION, CreateWorkflowData.INPUT_WORKFLOW_DESCRIPTION);
+
+ //select tenant
+ clickElement(CreateWorkflowLocator.CLICK_TENANT);
+ clickElement(CreateWorkflowLocator.SELECT_TENANT);
+
+ //click workflow timeout alarm
+ clickElement(CreateWorkflowLocator.CLICK_WORKFLOW_TIMEOUT_ALARM);
+ clearInput(CreateWorkflowLocator.INPUT_WORKFLOW_TIMEOUT);
+
+ //input workflow timeout
+ sendInput(CreateWorkflowLocator.INPUT_WORKFLOW_TIMEOUT, CreateWorkflowData.INPUT_WORKFLOW_TIMEOUT);
+
+ //click workflow global parameters
+ clickElement(CreateWorkflowLocator.CLICK_WORKFLOW_GLOBAL_PARAMETERS);
+
+ //input workflow global parameters
+ sendInput(CreateWorkflowLocator.INPUT_WORKFLOW_GLOBAL_PARAMETERS, CreateWorkflowData.INPUT_WORKFLOW_GLOBAL_PARAMETERS);
+
+ //input workflow global parameters value
+ sendInput(CreateWorkflowLocator.INPUT_WORKFLOW_GLOBAL_PARAMETERS_VALUES, CreateWorkflowData.INPUT_WORKFLOW_GLOBAL_PARAMETERS_VALUES);
+
+ //click to add workflow global parameters
+ clickElement(CreateWorkflowLocator.CLICK_ADD_WORKFLOW_GLOBAL_PARAMETERS);
+
+ //input to add workflow global parameters
+ sendInput(CreateWorkflowLocator.INPUT_ADD_WORKFLOW_GLOBAL_PARAMETERS, CreateWorkflowData.INPUT_ADD_WORKFLOW_GLOBAL_PARAMETERS);
+
+ //input to add workflow global parameters value
+ sendInput(CreateWorkflowLocator.INPUT_ADD_WORKFLOW_GLOBAL_PARAMETERS_VALUES, CreateWorkflowData.INPUT_ADD_WORKFLOW_GLOBAL_PARAMETERS_VALUES);
+
+ //delete workflow global parameters value
+ clickElement(CreateWorkflowLocator.CLICK_DELETE_WORKFLOW_GLOBAL_PARAMETERS);
+ Thread.sleep(TestConstant.ONE_THOUSANG);
+
+ //click add button
+ clickElement(CreateWorkflowLocator.CLICK_ADD_BUTTON);
+ System.out.println("submit workflow");
+ return ifTitleContains(CreateWorkflowData.WORKFLOW_TITLE);
}
}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/page/security/TenantManagePage.java b/e2e/src/test/java/org/apache/dolphinscheduler/page/security/TenantManagePage.java
index 4c88f6575e..618e1bc213 100644
--- a/e2e/src/test/java/org/apache/dolphinscheduler/page/security/TenantManagePage.java
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/page/security/TenantManagePage.java
@@ -34,15 +34,6 @@ public class TenantManagePage extends PageCommon {
super(driver);
}
-
- /**
- * jump page
- */
- public void jumpPage() {
- System.out.println("jump tenant page");
- super.jumpPage(TenantManageData.TENANAT_URL);
- }
-
/**
* createTenant
*
@@ -50,6 +41,7 @@ public class TenantManagePage extends PageCommon {
*/
public boolean createTenant() throws InterruptedException {
Thread.sleep(TestConstant.ONE_THOUSANG);
+ clickButton(TenantManageLocator.TENANT_MANAGE);
//create tenant
clickButton(TenantManageLocator.CREATE_TENANT_BUTTON);
@@ -66,4 +58,20 @@ public class TenantManagePage extends PageCommon {
// Whether to enter the specified page after submit
return ifTitleContains(TenantManageData.TENANAT_MANAGE);
}
+
+ public boolean deleteTenant() throws InterruptedException {
+ Thread.sleep(TestConstant.ONE_THOUSANG);
+ clickButton(TenantManageLocator.TENANT_MANAGE);
+ Thread.sleep(TestConstant.ONE_THOUSANG);
+
+ // click delete button
+ clickButton(TenantManageLocator.DELETE_TENANT_BUTTON);
+ Thread.sleep(TestConstant.ONE_THOUSANG);
+
+ //click confirm delete button
+ clickButton(TenantManageLocator.CONFIRM_DELETE_TENANT_BUTTON);
+
+ // Whether to enter the specified page after submit
+ return ifTitleContains(TenantManageData.TENANAT_MANAGE);
+ }
}
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 3e2be2d126..70311f129e 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
@@ -26,16 +26,9 @@ public class UserManagePage extends PageCommon {
public UserManagePage(WebDriver driver) {
super(driver);
}
- /**
- * jump page
- */
- public void jumpPage() {
- System.out.println("jump tenant page");
- super.jumpPage(UserManageData.USER_URL);
- }
/**
- * creatTenant
+ * createTenant
*
* @return Whether to enter the specified page after creat tenant
*/
@@ -64,4 +57,20 @@ public class UserManagePage extends PageCommon {
// Whether to enter the specified page after submit
return ifTitleContains(UserManageData.USER_MANAGE);
}
+
+ public boolean deleteUser() throws InterruptedException {
+ Thread.sleep(TestConstant.ONE_THOUSANG);
+ // click user manage
+ clickElement(UserManageLocator.CLICK_USER_MANAGE);
+ Thread.sleep(TestConstant.ONE_THOUSANG);
+
+ // click delete user button
+ clickButton(UserManageLocator.DELETE_USER_BUTTON );
+
+ // click confirm delete button
+ clickButton(UserManageLocator.CONFIRM_DELETE_USER_BUTTON);
+
+ // Whether to enter the specified page after submit
+ return ifTitleContains(UserManageData.USER_MANAGE);
+ }
}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/testcase/LoginTest.java b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/LoginTest.java
index bd3c31d38b..47ce11287d 100644
--- a/e2e/src/test/java/org/apache/dolphinscheduler/testcase/LoginTest.java
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/LoginTest.java
@@ -1,37 +1,26 @@
-/*
- * 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;
-import org.apache.dolphinscheduler.base.BaseTest;
import org.apache.dolphinscheduler.page.LoginPage;
+import org.testng.Assert;
import org.testng.annotations.Test;
+import static org.apache.dolphinscheduler.base.BaseTest.driver;
-public class LoginTest extends BaseTest {
+@Test(groups={"functionTests","login"})
+public class LoginTest {
private LoginPage loginPage;
+
@Test(description = "LoginTest", priority = 1)
public void testLogin() throws InterruptedException {
- // init login page
loginPage = new LoginPage(driver);
+ System.out.println("===================================");
+ System.out.println("jump to Chinese login page");
+ loginPage.jumpPageChinese();
- // enter login page
- loginPage.jumpPage();
+ System.out.println("start login");
+ assert loginPage.login();
+ System.out.println("end login");
+ System.out.println("===================================");
- //assert login page
- assert loginPage.login();
}
}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/testcase/deleteData/DeleteTenantTest.java b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/deleteData/DeleteTenantTest.java
new file mode 100644
index 0000000000..ddbc9d603b
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/deleteData/DeleteTenantTest.java
@@ -0,0 +1,37 @@
+/*
+ * 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.deleteData;
+
+import org.apache.dolphinscheduler.base.BaseTest;
+import org.apache.dolphinscheduler.page.security.TenantManagePage;
+import org.testng.annotations.Test;
+
+public class DeleteTenantTest extends BaseTest {
+ private TenantManagePage tenantManagePage;
+
+ @Test(groups={"functionTests"},dependsOnGroups = { "login","createTenant"},description = "DeleteTenantTest")
+ public void testDeleteTenant() throws InterruptedException {
+ tenantManagePage = new TenantManagePage(driver);
+ //assert tenant manage page
+ System.out.println("start delete tenant");
+ assert tenantManagePage.deleteTenant();
+ System.out.println("end delete tenant");
+ System.out.println("===================================");
+ }
+
+
+}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/testcase/deleteData/DeleteUserTest.java b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/deleteData/DeleteUserTest.java
new file mode 100644
index 0000000000..770fae077d
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/deleteData/DeleteUserTest.java
@@ -0,0 +1,36 @@
+/*
+ * 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.deleteData;
+
+import org.apache.dolphinscheduler.base.BaseTest;
+import org.apache.dolphinscheduler.page.security.UserManagePage;
+import org.testng.annotations.Test;
+
+public class DeleteUserTest extends BaseTest {
+ private UserManagePage userManagePage;
+
+ @Test(groups={"functionTests"},dependsOnGroups = { "login","user" },description = "DeleteUserTest")
+ public void testDeleteUser() throws InterruptedException {
+ userManagePage = new UserManagePage(driver);
+ //assert user manage page
+ System.out.println("start delete user");
+ assert userManagePage.deleteUser();
+ System.out.println("end delete user");
+ System.out.println("===================================");
+ }
+}
+
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/testcase/project/CreateProjectTest.java b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/project/CreateProjectTest.java
index 8abd09d37c..546792f0d8 100644
--- a/e2e/src/test/java/org/apache/dolphinscheduler/testcase/project/CreateProjectTest.java
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/project/CreateProjectTest.java
@@ -23,13 +23,16 @@ import org.testng.annotations.Test;
public class CreateProjectTest extends BaseTest {
private CreateProjectPage createProjectPage;
- @Test(description = "TenantTest", priority = 1)
- public void testUserManage() throws InterruptedException {
+ @Test(groups={"functionTests"},dependsOnGroups = { "login" },description = "CreateProjectTest",priority=4)
+ public void testCreateProject() throws InterruptedException {
createProjectPage = new CreateProjectPage(driver);
// enter user manage page
createProjectPage.jumpProjectManagePage();
//assert user manage page
+ System.out.println("start create project");
assert createProjectPage.createProject();
+ System.out.println("end create project");
+ System.out.println("===================================");
}
}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/testcase/project/CreateWorkflowTest.java b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/project/CreateWorkflowTest.java
index 6ac13f8124..ea87f48529 100644
--- a/e2e/src/test/java/org/apache/dolphinscheduler/testcase/project/CreateWorkflowTest.java
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/project/CreateWorkflowTest.java
@@ -26,12 +26,16 @@ public class CreateWorkflowTest extends BaseTest {
private CreateProjectPage createProjectPage;
- @Test(description = "CreateWorkflowTest", priority = 1)
- public void CreateWorkflowTest() throws InterruptedException {
+ @Test(groups={"functionTests"},dependsOnGroups = { "login" },description = "CreateWorkflowTest",priority=5)
+ public void testCreateWorkflow() throws InterruptedException {
createProjectPage = new CreateProjectPage(driver);
createProjectPage.jumpProjectManagePage();
+
createWorkflowPage = new CreateWorkflowPage(driver);
- //assert create workflow
+ System.out.println("start create workflow");
assert createWorkflowPage.createWorkflow();
+ assert createWorkflowPage.saveWorkflow();
+ System.out.println("end create workflow");
+ System.out.println("===================================");
}
}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/testcase/security/TenantManageTest.java b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/security/TenantManageTest.java
index 7124b4e094..8b21d3bb61 100644
--- a/e2e/src/test/java/org/apache/dolphinscheduler/testcase/security/TenantManageTest.java
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/security/TenantManageTest.java
@@ -20,15 +20,20 @@ import org.apache.dolphinscheduler.base.BaseTest;
import org.apache.dolphinscheduler.page.security.TenantManagePage;
import org.testng.annotations.Test;
+
public class TenantManageTest extends BaseTest {
private TenantManagePage tenantManagePage;
- @Test(description = "TenantTest", priority = 1)
+ @Test(groups={"functionTests","createTenant"},dependsOnGroups = { "login" },description = "TenantManageTest")
public void testTenantManage() throws InterruptedException {
tenantManagePage = new TenantManagePage(driver);
- // enter tenant manage page
- tenantManagePage.jumpPage();
//assert tenant manage page
+ System.out.println("start create tenant");
assert tenantManagePage.createTenant();
+ System.out.println("end create tenant");
+ System.out.println("===================================");
+
}
+
+
}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/testcase/security/UserManageTest.java b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/security/UserManageTest.java
index 834ebdbbf0..9381b68c75 100644
--- a/e2e/src/test/java/org/apache/dolphinscheduler/testcase/security/UserManageTest.java
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/security/UserManageTest.java
@@ -23,12 +23,14 @@ import org.testng.annotations.Test;
public class UserManageTest extends BaseTest {
private UserManagePage userManagePage;
- @Test(description = "TenantTest", priority = 1)
+ @Test(groups={"functionTests","user"},dependsOnGroups = { "login" },description = "UserManageTest")
public void testUserManage() throws InterruptedException {
userManagePage = new UserManagePage(driver);
- // enter user manage page
- userManagePage.jumpPage();
//assert user manage page
+ System.out.println("start create user");
assert userManagePage.createUser();
+ System.out.println("end create user");
+ System.out.println("===================================");
+
}
}
diff --git a/e2e/suite.xml b/e2e/suite.xml
deleted file mode 100644
index d9d7ae6845..0000000000
--- a/e2e/suite.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/e2e/testng.xml b/e2e/testng.xml
index 757ffab248..56c9649135 100644
--- a/e2e/testng.xml
+++ b/e2e/testng.xml
@@ -1,19 +1,23 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
-
-
-
-
-
+