From 4f09af3508f112dc8f0d3e33ef446cd04d7207e7 Mon Sep 17 00:00:00 2001 From: William Date: Tue, 30 Jun 2026 14:46:47 +0200 Subject: [PATCH] feat(Element): implemented send chord function and test --- .../API/Request/Elements/ElementsTypes.swift | 26 ++++++++++++++++++- Sources/SwiftWebDriver/Element/Element.swift | 19 +++++++++++++- ...eDriverElementHandleIntegrationTests.swift | 18 ++++++++++++- 3 files changed, 60 insertions(+), 3 deletions(-) diff --git a/Sources/SwiftWebDriver/API/Request/Elements/ElementsTypes.swift b/Sources/SwiftWebDriver/API/Request/Elements/ElementsTypes.swift index 35bdb28..99db4fa 100644 --- a/Sources/SwiftWebDriver/API/Request/Elements/ElementsTypes.swift +++ b/Sources/SwiftWebDriver/API/Request/Elements/ElementsTypes.swift @@ -1,5 +1,5 @@ // ElementsTypes.swift -// Copyright (c) 2025 GetAutomaApp +// Copyright (c) 2026 GetAutomaApp // All source code and related assets are the property of GetAutomaApp. // All rights reserved. @@ -30,6 +30,30 @@ public enum ElementsTypes { /// Used to move focus between interactive elements (e.g., form fields) in a web page. case TAB = "\u{E004}" + case NULL = "\u{E000}" + case CANCEL = "\u{E001}" + case HELP = "\u{E002}" + case BACKSPACE = "\u{E003}" + case CLEAR = "\u{E005}" + case SHIFT = "\u{E008}" + case CONTROL = "\u{E009}" + case ALT = "\u{E00A}" + case PAUSE = "\u{E00B}" + case ESCAPE = "\u{E00C}" + case SPACE = "\u{E00D}" + case PAGE_UP = "\u{E00E}" + case PAGE_DOWN = "\u{E00F}" + case END = "\u{E010}" + case HOME = "\u{E011}" + case LEFT_ARROW = "\u{E012}" + case UP_ARROW = "\u{E013}" + case RIGHT_ARROW = "\u{E014}" + case DOWN_ARROW = "\u{E015}" + case INSERT = "\u{E016}" + case DELETE = "\u{E017}" + case F1 = "\u{E031}" + case F2 = "\u{E032}" + /// The raw Unicode representation of the key. /// /// This string value is what will be sent to the WebDriver `sendKeys` diff --git a/Sources/SwiftWebDriver/Element/Element.swift b/Sources/SwiftWebDriver/Element/Element.swift index 3c6b14b..f10f177 100644 --- a/Sources/SwiftWebDriver/Element/Element.swift +++ b/Sources/SwiftWebDriver/Element/Element.swift @@ -1,5 +1,5 @@ // Element.swift -// Copyright (c) 2025 GetAutomaApp +// Copyright (c) 2026 GetAutomaApp // All source code and related assets are the property of GetAutomaApp. // All rights reserved. @@ -264,6 +264,23 @@ public struct Element: ElementCommandProtocol, Sendable { return response.value } + @discardableResult + @available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *) + public func sendKeys( + keys: ElementsTypes.SendValueActionKeyTypes..., + characters: String = "" + ) async throws -> String? { + let text = keys.map(\.rawValue).joined() + characters + let request = PostElementSendValueRequest( + baseURL: baseURL, + sessionId: sessionId, + elementId: elementId, + text: text + ) + let response = try await APIClient.shared.request(request) + return response.value + } + /// Takes a screenshot of the element. /// /// - Returns: A Base64-encoded string representing the image. diff --git a/Tests/SwiftWebDriverIntegrationTests/ChromeDriver/Element/ChromeDriverElementHandleIntegrationTests.swift b/Tests/SwiftWebDriverIntegrationTests/ChromeDriver/Element/ChromeDriverElementHandleIntegrationTests.swift index 8a1aea6..6ac3977 100644 --- a/Tests/SwiftWebDriverIntegrationTests/ChromeDriver/Element/ChromeDriverElementHandleIntegrationTests.swift +++ b/Tests/SwiftWebDriverIntegrationTests/ChromeDriver/Element/ChromeDriverElementHandleIntegrationTests.swift @@ -1,5 +1,5 @@ // ChromeDriverElementHandleIntegrationTests.swift -// Copyright (c) 2025 GetAutomaApp +// Copyright (c) 2026 GetAutomaApp // All source code and related assets are the property of GetAutomaApp. // All rights reserved. @@ -95,6 +95,22 @@ internal class ChromeDriverElementHandleIntegrationTests: ChromeDriverTest { #expect(text == "newValue") } + @Test("Send Chord") + public func sendChord() async throws { + page = "elementHandleTestPage.html" + try await driver.navigateTo(urlString: testPageURL.absoluteString) + let element = try await driver.findElement(.css(.id("sendValue"))) + try await element.send(value: "newValue") + let text = try await driver.execute("return document.querySelector('#sendValue').value").value?.stringValue + #expect(text == "newValue") + + // Remove text from element + try await element.sendKeys(keys: .CONTROL, characters: "a") + try await element.sendKeys(keys: .BACKSPACE) + let newText = try await driver.execute("return document.querySelector('#sendValue').value").value?.stringValue + #expect(newText == "") + } + @Test("Get Screenshot") public func getScreenshot() async throws { page = "elementHandleTestPage.html"