From 14be5e8cacc1bc29b3007d217816fb16c58b5a64 Mon Sep 17 00:00:00 2001 From: Adam Pounder <3522358-Poundex@users.noreply.gitlab.com> Date: Fri, 11 Oct 2024 10:38:03 +0100 Subject: [PATCH] Use JavaScript to set the value of datetime-local inputs (for Chrome) Relates #188 --- .../geb/module/DateTimeLocalInput.groovy | 20 +++++++++++++++++-- .../geb/module/DateTimeLocalInputSpec.groovy | 12 ++++++----- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/module/geb-core/src/main/groovy/geb/module/DateTimeLocalInput.groovy b/module/geb-core/src/main/groovy/geb/module/DateTimeLocalInput.groovy index 92c7f46f3..0d56f6de2 100644 --- a/module/geb-core/src/main/groovy/geb/module/DateTimeLocalInput.groovy +++ b/module/geb-core/src/main/groovy/geb/module/DateTimeLocalInput.groovy @@ -22,11 +22,27 @@ class DateTimeLocalInput extends AbstractInput { final String inputType = 'datetime-local' void setDateTime(LocalDateTime dateTime) { - value(dateTime.toString()) + doSetDateTime(dateTime.toString()) } void setDateTime(String iso8601FormattedDateTime) { - value(iso8601FormattedDateTime) + doSetDateTime(iso8601FormattedDateTime) + } + + private void doSetDateTime(String iso8601FormattedDateTime) { + String truncated = iso8601FormattedDateTime.substring(0, 23) + allElements().each { elem -> + browser.js.exec(elem, truncated, '''\ + if (document.activeElement !== arguments[0]){ + arguments[0].focus(); + } + if (arguments[0].value != arguments[1]) { + arguments[0].value = arguments[1] + arguments[0].dispatchEvent(new InputEvent('input')); + arguments[0].dispatchEvent(new Event('change', { bubbles: true })); + } +''') + } } LocalDateTime getDateTime() { diff --git a/module/geb-core/src/test/groovy/geb/module/DateTimeLocalInputSpec.groovy b/module/geb-core/src/test/groovy/geb/module/DateTimeLocalInputSpec.groovy index 2c4c6447c..357e43a77 100644 --- a/module/geb-core/src/test/groovy/geb/module/DateTimeLocalInputSpec.groovy +++ b/module/geb-core/src/test/groovy/geb/module/DateTimeLocalInputSpec.groovy @@ -24,7 +24,6 @@ import java.time.LocalDateTime @Chrome @RequiresRealBrowser // maybe due to https://sourceforge.net/p/htmlunit/bugs/1923/ -@Ignore("https://github.com/geb/geb/issues/188") class DateTimeLocalInputSpec extends GebSpecWithCallbackServer { def setup() { @@ -47,7 +46,7 @@ class DateTimeLocalInputSpec extends GebSpecWithCallbackServer { input.dateTime = dateTime then: - input.dateTime == dateTime + input.dateTime == truncated(dateTime) where: dateTime = LocalDateTime.now() @@ -58,7 +57,7 @@ class DateTimeLocalInputSpec extends GebSpecWithCallbackServer { input.dateTime = dateTime.toString() then: - input.dateTime == dateTime + input.dateTime == truncated(dateTime) where: dateTime = LocalDateTime.now() @@ -69,13 +68,16 @@ class DateTimeLocalInputSpec extends GebSpecWithCallbackServer { input.dateTime = dateTime and: - input.dateTime = dateTime.plusDays(1) + input.dateTime = truncated(dateTime.plusDays(1)) then: - input.dateTime == dateTime.plusDays(1) + input.dateTime == truncated(dateTime.plusDays(1)) where: dateTime = LocalDateTime.now() } + private static LocalDateTime truncated(LocalDateTime dateTime) { + return LocalDateTime.parse(dateTime.toString().substring(0, 23)) + } }