diff --git a/Sources/SwiftWebDriver/WebDriver.swift b/Sources/SwiftWebDriver/WebDriver.swift index 3364eeb..6b223b6 100644 --- a/Sources/SwiftWebDriver/WebDriver.swift +++ b/Sources/SwiftWebDriver/WebDriver.swift @@ -134,7 +134,13 @@ public class WebDriver { try await driver.setAttribute(element: element, attributeName: attributeName, newValue: newValue) } - public func getProperty(element: Element, property: String) async throws -> PostExecuteResponse { - try await driver.getProperty(element: element, property: property) + @available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *) + public func getProperty(element: Element, propertyName: String) async throws -> PostExecuteResponse { + try await driver.getProperty(element: element, propertyName: propertyName) + } + + @available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *) + public func setProperty(element: Element, propertyName: String, newValue: String) async throws { + try await driver.setProperty(element: element, propertyName: propertyName, newValue: newValue) } } diff --git a/Sources/SwiftWebDriver/WebDrivers/Chrome/ChromeDriver.swift b/Sources/SwiftWebDriver/WebDrivers/Chrome/ChromeDriver.swift index 6ad2ac3..c77c619 100644 --- a/Sources/SwiftWebDriver/WebDrivers/Chrome/ChromeDriver.swift +++ b/Sources/SwiftWebDriver/WebDrivers/Chrome/ChromeDriver.swift @@ -309,16 +309,29 @@ public class ChromeDriver: Driver { try await execute(script, args: args, type: .sync) } - public func getProperty(element: Element, property: String) async throws -> PostExecuteResponse { + public func getProperty(element: Element, propertyName: String) async throws -> PostExecuteResponse { let script = "return arguments[0][arguments[1]];" let args: [AnyEncodable] = [ AnyEncodable(["element-6066-11e4-a52e-4f735466cecf": element.elementId]), - AnyEncodable(property) + AnyEncodable(propertyName) ] return try await execute(script, args: args, type: .sync) } + public func setProperty(element: Element, propertyName: String, + newValue: String) async throws + { + let script = "arguments[0][arguments[1]] = arguments[2];" + let args: [AnyEncodable] = [ + AnyEncodable(["element-6066-11e4-a52e-4f735466cecf": element.elementId]), + AnyEncodable(propertyName), + AnyEncodable(newValue) + ] + + try await execute(script, args: args, type: .sync) + } + deinit { let url = url let sessionId = sessionId diff --git a/Sources/SwiftWebDriver/WebDrivers/Driver.swift b/Sources/SwiftWebDriver/WebDrivers/Driver.swift index e8e1069..57088b5 100644 --- a/Sources/SwiftWebDriver/WebDrivers/Driver.swift +++ b/Sources/SwiftWebDriver/WebDrivers/Driver.swift @@ -49,5 +49,7 @@ public protocol Driver: FindElementProtocol { func setAttribute(element: Element, attributeName: String, newValue: String) async throws - func getProperty(element: Element, property: String) async throws -> PostExecuteResponse + func getProperty(element: Element, propertyName: String) async throws -> PostExecuteResponse + + func setProperty(element: Element, propertyName: String, newValue: String) async throws } diff --git a/TestAssets/elementHandleTestPage.html b/TestAssets/elementHandleTestPage.html index 51caefa..d241b95 100644 --- a/TestAssets/elementHandleTestPage.html +++ b/TestAssets/elementHandleTestPage.html @@ -1,4 +1,5 @@ + expect title + +
- - -
- - + + +
+ + + diff --git a/Tests/SwiftWebDriverIntegrationTests/ChromeDriver/Element/ChromeDriverGetPropertyIntegrationTests.swift b/Tests/SwiftWebDriverIntegrationTests/ChromeDriver/Element/ChromeDriverGetPropertyIntegrationTests.swift deleted file mode 100644 index 0ad1f1c..0000000 --- a/Tests/SwiftWebDriverIntegrationTests/ChromeDriver/Element/ChromeDriverGetPropertyIntegrationTests.swift +++ /dev/null @@ -1,32 +0,0 @@ -// ChromeDriverGetPropertyIntegrationTests.swift -// Copyright (c) 2025 GetAutomaApp -// All source code and related assets are the property of GetAutomaApp. -// All rights reserved. - -@testable import SwiftWebDriver -import Testing - -@Suite("Chrome Driver Get Property", .serialized) -internal class ChromeDriverGetPropertyIntegrationTests: ChromeDriverTest { - @Test("Get Property") - func getProperty() async throws { - page = "elementHandleTestPage.html" - try await driver.navigateTo(urlString: testPageURL.absoluteString) - let updatedElementValue = "NewElementValue" - try await driver.execute(""" - let element = document.getElementById('attribute') - element.value = '\(updatedElementValue)' - """) - let element = try await driver.findElement(.css(.id("attribute"))) - guard - let elementValue = try await driver.getProperty(element: element, property: "value").value?.stringValue - else { - #expect(Bool(false), "Could not convert element value to string value") - return - } - - #expect(elementValue == updatedElementValue) - } - - deinit {} -} diff --git a/Tests/SwiftWebDriverIntegrationTests/ChromeDriver/Element/ChromeDriverPropertyIntegrationTests.swift b/Tests/SwiftWebDriverIntegrationTests/ChromeDriver/Element/ChromeDriverPropertyIntegrationTests.swift new file mode 100644 index 0000000..96f9022 --- /dev/null +++ b/Tests/SwiftWebDriverIntegrationTests/ChromeDriver/Element/ChromeDriverPropertyIntegrationTests.swift @@ -0,0 +1,51 @@ +// ChromeDriverPropertyIntegrationTests.swift +// Copyright (c) 2025 GetAutomaApp +// All source code and related assets are the property of GetAutomaApp. +// All rights reserved. + +@testable import SwiftWebDriver +import Testing + +@Suite("Chrome Driver Property Integration Tests", .serialized) +internal class ChromeDriverPropertyIntegrationTests: ChromeDriverTest { + @Test("Get Property") + func getProperty() async throws { + page = "elementHandleTestPage.html" + try await driver.navigateTo(urlString: testPageURL.absoluteString) + let updatedElementValue = "NewElementValue" + try await driver.execute(""" + let element = document.getElementById('attribute') + element.value = '\(updatedElementValue)' + """) + let element = try await driver.findElement(.css(.id("attribute"))) + guard + let elementValue = try await driver.getProperty(element: element, propertyName: "value").value?.stringValue + else { + #expect(Bool(false), "Could not convert element value to string value") + return + } + + #expect(elementValue == updatedElementValue) + } + + @Test("Set Property") + func setProperty() async throws { + page = "elementHandleTestPage.html" + try await driver.navigateTo(urlString: testPageURL.absoluteString) + let element = try await driver.findElement(.css(.id("setproperty"))) + let newPropertyValue = "element new inner text" + + try await driver.setProperty(element: element, propertyName: "innerText", newValue: newPropertyValue) + guard + let elementInnerTextValue = try await driver.getProperty(element: element, propertyName: "innerText").value? + .stringValue + else { + #expect(Bool(false), "Could not convert element innerText value to string value") + return + } + + #expect(newPropertyValue == elementInnerTextValue) + } + + deinit {} +}