From 771fca1611916d35e2d034c7dcee37a33d90d406 Mon Sep 17 00:00:00 2001
From: Haoyu Sun <SunH26@cardiff.ac.uk>
Date: Fri, 21 Feb 2025 17:16:23 +0000
Subject: [PATCH] ChromeDriverTest and seleniumTest

---
 build.gradle                                  |   4 +
 src/main/resources/static/js/navBar.js        |  62 ++--
 src/test/java/sportsLeagueTest.side           | 346 ++++++++++++++++++
 .../ac/cf/spring/demo/ChromeDriverTest.java   |  74 ++++
 4 files changed, 455 insertions(+), 31 deletions(-)
 create mode 100644 src/test/java/sportsLeagueTest.side
 create mode 100644 src/test/java/uk/ac/cf/spring/demo/ChromeDriverTest.java

diff --git a/build.gradle b/build.gradle
index 0a64192..f79e901 100644
--- a/build.gradle
+++ b/build.gradle
@@ -44,6 +44,10 @@ dependencies {
 	testImplementation 'org.springframework.boot:spring-boot-starter-test'
 	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
 	testImplementation 'org.springframework.security:spring-security-test'
+	testImplementation("io.github.bonigarcia:webdrivermanager:5.1.0")
+	//selenium
+	testImplementation group: 'net.sourceforge.htmlunit', name: 'htmlunit', version: '2.32'
+	testImplementation group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '4.1.0'
 }
 
 tasks.named('test') {
diff --git a/src/main/resources/static/js/navBar.js b/src/main/resources/static/js/navBar.js
index 9976453..3186087 100644
--- a/src/main/resources/static/js/navBar.js
+++ b/src/main/resources/static/js/navBar.js
@@ -27,34 +27,34 @@ function loadNavbar(targetElementId) {
 }
 
 // Update authentication buttons based on user login state
-function updateAuthButtons() {
-    fetch('/users/current', { method: 'GET' })
-        .then(response => {
-            if (!response.ok) {
-                throw new Error('User not logged in');
-            }
-            return response.json();
-        })
-        .then(data => {
-            // If logged in, update Login button to display username
-            const authBtn = document.getElementById('auth-btn');
-            authBtn.textContent = data.username;
-            authBtn.href = '#'; // Disable navigation for username display
-            authBtn.classList.remove('login-btn');
-            authBtn.classList.add('username-btn');
-
-            // Show the Logout button
-            document.getElementById('logout-btn').style.display = 'block';
-        })
-        .catch(() => {
-            // If not logged in, reset the buttons to default state
-            const authBtn = document.getElementById('auth-btn');
-            authBtn.textContent = 'Login';
-            authBtn.href = '/html/login.html'; // Link back to the login page
-            authBtn.classList.add('login-btn');
-            authBtn.classList.remove('username-btn');
-
-            // Hide the Logout button
-            document.getElementById('logout-btn').style.display = 'none';
-        });
-}
+// function updateAuthButtons() {
+//     fetch('/users/current', { method: 'GET' })
+//         .then(response => {
+//             if (!response.ok) {
+//                 throw new Error('User not logged in');
+//             }
+//             return response.json();
+//         })
+//         .then(data => {
+//             // If logged in, update Login button to display username
+//             const authBtn = document.getElementById('auth-btn');
+//             authBtn.textContent = data.username;
+//             authBtn.href = '#'; // Disable navigation for username display
+//             authBtn.classList.remove('login-btn');
+//             authBtn.classList.add('username-btn');
+//
+//             // Show the Logout button
+//             document.getElementById('logout-btn').style.display = 'block';
+//         })
+//         .catch(() => {
+//             // If not logged in, reset the buttons to default state
+//             const authBtn = document.getElementById('auth-btn');
+//             authBtn.textContent = 'Login';
+//             authBtn.href = '/html/login.html'; // Link back to the login page
+//             authBtn.classList.add('login-btn');
+//             authBtn.classList.remove('username-btn');
+//
+//             // Hide the Logout button
+//             document.getElementById('logout-btn').style.display = 'none';
+//         });
+// }
diff --git a/src/test/java/sportsLeagueTest.side b/src/test/java/sportsLeagueTest.side
new file mode 100644
index 0000000..7e76805
--- /dev/null
+++ b/src/test/java/sportsLeagueTest.side
@@ -0,0 +1,346 @@
+{
+  "id": "16ffd25e-f706-4a5e-812c-fbb9b11e75cc",
+  "version": "2.0",
+  "name": "sportsLeagueTest",
+  "url": "http://localhost:8080",
+  "tests": [{
+    "id": "0664bd87-4218-41d5-833e-1d7ce52c2608",
+    "name": "testLoginandMatchTest",
+    "commands": [{
+      "id": "209c5b55-a832-4a2b-9372-e728e2c7aca6",
+      "comment": "",
+      "command": "open",
+      "target": "/html/login.html",
+      "targets": [],
+      "value": ""
+    }, {
+      "id": "5c887cdc-2af2-4872-b805-045796a73e08",
+      "comment": "",
+      "command": "setWindowSize",
+      "target": "652x672",
+      "targets": [],
+      "value": ""
+    }, {
+      "id": "6159b882-bf7e-4a0c-a26a-699e36d738fd",
+      "comment": "",
+      "command": "click",
+      "target": "id=email",
+      "targets": [
+        ["id=email", "id"],
+        ["name=email", "name"],
+        ["css=#email", "css:finder"],
+        ["xpath=//input[@id='email']", "xpath:attributes"],
+        ["xpath=//form[@id='loginForm']/input", "xpath:idRelative"],
+        ["xpath=//input", "xpath:position"]
+      ],
+      "value": ""
+    }, {
+      "id": "b4176d53-16e3-4162-8c95-d4dbf0a4ba3c",
+      "comment": "",
+      "command": "type",
+      "target": "id=email",
+      "targets": [
+        ["id=email", "id"],
+        ["name=email", "name"],
+        ["css=#email", "css:finder"],
+        ["xpath=//input[@id='email']", "xpath:attributes"],
+        ["xpath=//form[@id='loginForm']/input", "xpath:idRelative"],
+        ["xpath=//input", "xpath:position"]
+      ],
+      "value": "shy@creditsafe.com"
+    }, {
+      "id": "8248a227-e5d9-43e7-859a-aff3c895e870",
+      "comment": "",
+      "command": "click",
+      "target": "id=password",
+      "targets": [
+        ["id=password", "id"],
+        ["name=password", "name"],
+        ["css=#password", "css:finder"],
+        ["xpath=//input[@id='password']", "xpath:attributes"],
+        ["xpath=//form[@id='loginForm']/input[2]", "xpath:idRelative"],
+        ["xpath=//input[2]", "xpath:position"]
+      ],
+      "value": ""
+    }, {
+      "id": "73cfb95a-0326-48e4-b97a-06369d4eb339",
+      "comment": "",
+      "command": "type",
+      "target": "id=password",
+      "targets": [
+        ["id=password", "id"],
+        ["name=password", "name"],
+        ["css=#password", "css:finder"],
+        ["xpath=//input[@id='password']", "xpath:attributes"],
+        ["xpath=//form[@id='loginForm']/input[2]", "xpath:idRelative"],
+        ["xpath=//input[2]", "xpath:position"]
+      ],
+      "value": "shy"
+    }, {
+      "id": "44b3048d-06b1-4a31-be86-28dff3f52d98",
+      "comment": "",
+      "command": "click",
+      "target": "css=button",
+      "targets": [
+        ["css=button", "css:finder"],
+        ["xpath=//button[@type='submit']", "xpath:attributes"],
+        ["xpath=//form[@id='loginForm']/button", "xpath:idRelative"],
+        ["xpath=//button", "xpath:position"],
+        ["xpath=//button[contains(.,'Login')]", "xpath:innerText"]
+      ],
+      "value": ""
+    }, {
+      "id": "5f6090f4-5d83-417c-8a49-7b85e60a580b",
+      "comment": "",
+      "command": "click",
+      "target": "id=sportSelect",
+      "targets": [
+        ["id=sportSelect", "id"],
+        ["css=#sportSelect", "css:finder"],
+        ["xpath=//select[@id='sportSelect']", "xpath:attributes"],
+        ["xpath=//select", "xpath:position"]
+      ],
+      "value": ""
+    }, {
+      "id": "983cf95d-9003-4cda-9e7f-b6ad1b8873a8",
+      "comment": "",
+      "command": "select",
+      "target": "id=sportSelect",
+      "targets": [],
+      "value": "label=Pools"
+    }, {
+      "id": "b286ccc1-6cad-4701-b408-50086c7184a1",
+      "comment": "",
+      "command": "click",
+      "target": "id=sportSelect",
+      "targets": [
+        ["id=sportSelect", "id"],
+        ["css=#sportSelect", "css:finder"],
+        ["xpath=//select[@id='sportSelect']", "xpath:attributes"],
+        ["xpath=//select", "xpath:position"]
+      ],
+      "value": ""
+    }, {
+      "id": "1441088d-98fa-436d-b89c-923b26c5c272",
+      "comment": "",
+      "command": "select",
+      "target": "id=sportSelect",
+      "targets": [],
+      "value": "label=Darts"
+    }, {
+      "id": "565747ec-9749-4145-9313-0a5ae850264c",
+      "comment": "",
+      "command": "click",
+      "target": "id=sportSelect",
+      "targets": [
+        ["id=sportSelect", "id"],
+        ["css=#sportSelect", "css:finder"],
+        ["xpath=//select[@id='sportSelect']", "xpath:attributes"],
+        ["xpath=//select", "xpath:position"]
+      ],
+      "value": ""
+    }, {
+      "id": "7a51ec33-f510-4479-8aea-4a1f3522174a",
+      "comment": "",
+      "command": "select",
+      "target": "id=sportSelect",
+      "targets": [],
+      "value": "label=Table Tennis"
+    }, {
+      "id": "950a1838-f63d-4d69-a83f-01926ff620c2",
+      "comment": "",
+      "command": "click",
+      "target": "id=sportSelect",
+      "targets": [
+        ["id=sportSelect", "id"],
+        ["css=#sportSelect", "css:finder"],
+        ["xpath=//select[@id='sportSelect']", "xpath:attributes"],
+        ["xpath=//select", "xpath:position"]
+      ],
+      "value": ""
+    }, {
+      "id": "d5e44974-5e91-4255-8715-1794a9f6cbfe",
+      "comment": "",
+      "command": "select",
+      "target": "id=sportSelect",
+      "targets": [],
+      "value": "label=All Sports"
+    }, {
+      "id": "3d13848c-e203-471a-bc44-e0b8d60a8fd9",
+      "comment": "",
+      "command": "click",
+      "target": "id=statusSelect",
+      "targets": [
+        ["id=statusSelect", "id"],
+        ["css=#statusSelect", "css:finder"],
+        ["xpath=//select[@id='statusSelect']", "xpath:attributes"],
+        ["xpath=//select[2]", "xpath:position"]
+      ],
+      "value": ""
+    }, {
+      "id": "8e084da0-e59b-4ac9-b50e-dc609086e34e",
+      "comment": "",
+      "command": "select",
+      "target": "id=statusSelect",
+      "targets": [],
+      "value": "label=Pending"
+    }, {
+      "id": "e023b21b-ed4a-4454-9aab-a93a741636f8",
+      "comment": "",
+      "command": "click",
+      "target": "id=statusSelect",
+      "targets": [
+        ["id=statusSelect", "id"],
+        ["css=#statusSelect", "css:finder"],
+        ["xpath=//select[@id='statusSelect']", "xpath:attributes"],
+        ["xpath=//select[2]", "xpath:position"]
+      ],
+      "value": ""
+    }, {
+      "id": "cabca20b-76d7-493d-bee1-bf3dbaa34760",
+      "comment": "",
+      "command": "select",
+      "target": "id=statusSelect",
+      "targets": [],
+      "value": "label=Confirmed"
+    }, {
+      "id": "fb3a64d1-e62c-41db-acde-91dca7b84a39",
+      "comment": "",
+      "command": "click",
+      "target": "id=statusSelect",
+      "targets": [
+        ["id=statusSelect", "id"],
+        ["css=#statusSelect", "css:finder"],
+        ["xpath=//select[@id='statusSelect']", "xpath:attributes"],
+        ["xpath=//select[2]", "xpath:position"]
+      ],
+      "value": ""
+    }, {
+      "id": "b372f9e9-eb79-47c2-b82a-11cbdf162f93",
+      "comment": "",
+      "command": "select",
+      "target": "id=statusSelect",
+      "targets": [],
+      "value": "label=Completed"
+    }, {
+      "id": "d6905fbf-9814-49c2-bff6-b7cd4ffd0186",
+      "comment": "",
+      "command": "click",
+      "target": "id=statusSelect",
+      "targets": [
+        ["id=statusSelect", "id"],
+        ["css=#statusSelect", "css:finder"],
+        ["xpath=//select[@id='statusSelect']", "xpath:attributes"],
+        ["xpath=//select[2]", "xpath:position"]
+      ],
+      "value": ""
+    }, {
+      "id": "6eed2c7c-107f-48e9-a0dd-06ad5555caea",
+      "comment": "",
+      "command": "select",
+      "target": "id=statusSelect",
+      "targets": [],
+      "value": "label=All Sports"
+    }, {
+      "id": "0f56e0a9-75b0-40c7-a7c6-5ad2e4a07fd5",
+      "comment": "",
+      "command": "click",
+      "target": "id=sortTimeBtn",
+      "targets": [
+        ["id=sortTimeBtn", "id"],
+        ["css=#sortTimeBtn", "css:finder"],
+        ["xpath=//button[@id='sortTimeBtn']", "xpath:attributes"],
+        ["xpath=//div[2]/button", "xpath:position"],
+        ["xpath=//button[contains(.,'Sort by Time')]", "xpath:innerText"]
+      ],
+      "value": ""
+    }, {
+      "id": "0a21d7ae-0c6f-4136-94a6-8d544f42633c",
+      "comment": "",
+      "command": "click",
+      "target": "id=sortTimeBtn",
+      "targets": [
+        ["id=sortTimeBtn", "id"],
+        ["css=#sortTimeBtn", "css:finder"],
+        ["xpath=//button[@id='sortTimeBtn']", "xpath:attributes"],
+        ["xpath=//div[2]/button", "xpath:position"],
+        ["xpath=//button[contains(.,'Sort by Time')]", "xpath:innerText"]
+      ],
+      "value": ""
+    }, {
+      "id": "b985fc2e-1068-455b-b212-23c940790db5",
+      "comment": "",
+      "command": "click",
+      "target": "css=.match-item:nth-child(1)",
+      "targets": [
+        ["css=.match-item:nth-child(1)", "css:finder"],
+        ["xpath=//div[@id='matchesList']/div", "xpath:idRelative"],
+        ["xpath=//div[3]/div[3]/div", "xpath:position"]
+      ],
+      "value": ""
+    }, {
+      "id": "a02a6189-a333-4149-bd8c-696869367f06",
+      "comment": "",
+      "command": "click",
+      "target": "id=updateBtn",
+      "targets": [
+        ["id=updateBtn", "id"],
+        ["css=#updateBtn", "css:finder"],
+        ["xpath=//button[@id='updateBtn']", "xpath:attributes"],
+        ["xpath=//div[@id='matchDetails']/button", "xpath:idRelative"],
+        ["xpath=//button", "xpath:position"],
+        ["xpath=//button[contains(.,'Update Score')]", "xpath:innerText"]
+      ],
+      "value": ""
+    }, {
+      "id": "69365172-4d89-44d1-8959-1bf8d3f6db26",
+      "comment": "",
+      "command": "click",
+      "target": "id=matchDetails",
+      "targets": [
+        ["id=matchDetails", "id"],
+        ["css=#matchDetails", "css:finder"],
+        ["xpath=//div[@id='matchDetails']", "xpath:attributes"],
+        ["xpath=//div[3]/div", "xpath:position"]
+      ],
+      "value": ""
+    }, {
+      "id": "d3db7118-ff77-4602-8e55-fcb0c7d1264f",
+      "comment": "",
+      "command": "type",
+      "target": "id=scoreA",
+      "targets": [
+        ["id=scoreA", "id"],
+        ["name=scoreA", "name"],
+        ["css=#scoreA", "css:finder"],
+        ["xpath=//input[@id='scoreA']", "xpath:attributes"],
+        ["xpath=//form[@id='updateMatchForm']/input", "xpath:idRelative"],
+        ["xpath=//input", "xpath:position"]
+      ],
+      "value": "1"
+    }, {
+      "id": "d78e77a7-1fd2-4acc-a5b1-0f785d6b6ccc",
+      "comment": "",
+      "command": "click",
+      "target": "css=button:nth-child(23)",
+      "targets": [
+        ["css=button:nth-child(23)", "css:finder"],
+        ["xpath=//button[@type='submit']", "xpath:attributes"],
+        ["xpath=//form[@id='updateMatchForm']/button", "xpath:idRelative"],
+        ["xpath=//button", "xpath:position"],
+        ["xpath=//button[contains(.,'Update Score')]", "xpath:innerText"]
+      ],
+      "value": ""
+    }]
+  }],
+  "suites": [{
+    "id": "c5b624ea-1ae7-4147-b21a-7ebf68e013d9",
+    "name": "Default Suite",
+    "persistSession": false,
+    "parallel": false,
+    "timeout": 300,
+    "tests": ["0664bd87-4218-41d5-833e-1d7ce52c2608"]
+  }],
+  "urls": ["http://localhost:8080/"],
+  "plugins": []
+}
\ No newline at end of file
diff --git a/src/test/java/uk/ac/cf/spring/demo/ChromeDriverTest.java b/src/test/java/uk/ac/cf/spring/demo/ChromeDriverTest.java
new file mode 100644
index 0000000..f06e6fb
--- /dev/null
+++ b/src/test/java/uk/ac/cf/spring/demo/ChromeDriverTest.java
@@ -0,0 +1,74 @@
+package uk.ac.cf.spring.demo;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.runner.RunWith;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import org.openqa.selenium.firefox.FirefoxOptions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import io.github.bonigarcia.wdm.WebDriverManager;
+
+
+import static org.junit.Assert.assertTrue;
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class ChromeDriverTest {
+
+        @Value("${local.server.port}")
+        private int port;
+         WebDriver webDriver;
+        @BeforeEach
+        void setupTest() {
+            ChromeOptions options = new ChromeOptions();
+            options.addArguments("--remote-debugging-port=42227");
+            options.addArguments("--headless");
+            webDriver = new ChromeDriver(options);
+        }
+
+        @AfterEach
+        public void teardown() {
+            // 关闭浏览器
+            if (webDriver != null) {
+                webDriver.quit();
+            }
+        }
+
+        // 测试首页是否正确加载,并包含特定内容
+        @Test
+        public void greetingShouldReturnDefaultMessage() throws Exception {
+            // 访问首页
+            webDriver.get("http://localhost:" + port + "/html/matchSchedule.html");
+
+            // 验证页面中包含 "Sport" 字符串
+            assertTrue(webDriver.getPageSource().contains("Sport"));
+        }
+        @Test
+        public void loginAndSeeLoginMessage() throws Exception {
+        // 打开登录页面
+        webDriver.get("http://localhost:" + port + "/html/login.html");
+
+        // 模拟登录:找到输入框并输入数据
+        webDriver.findElement(By.name("email")).sendKeys("shy@creditsafe.com");
+        webDriver.findElement(By.name("password")).sendKeys("shy");
+
+        webDriver.findElement(By.xpath("//button[text()='Login']")).click();
+
+        // 等待页面加载,确保登录完成
+        Thread.sleep(2000); // 这里可以使用更专业的显式等待来代替
+
+        // 验证登录后页面中显示 "Login successful"
+        assertTrue(webDriver.getPageSource().contains("Login successful"));
+    }
+    }
+
+
+
-- 
GitLab