input[type="date"]를 Selenium으로 조작할 때의 주의점
11638 단어 Chrome셀레늄selenium-webdriverHTML5루비
소개
<input type="date"/>
의 입력을 Selenium Webdriver의 send_keys
에서 입력하려고 했는데, 의도하지 않은 값이 입력되었으므로 자세히 조사해 보았습니다.
「과연! 그랬던 것인가!!」를 조사 결과를 더해 해설해 갑니다.
결론
W3C(HTML측)에서의 문헌을 찾을 수 없었습니다만, ECMA 문서 에 의하면, 275760년 9월 13일까지 입력할 수 있다고 합니다.
Time Values and Time Range
(中略)
Time is measured in ECMAScript in milliseconds since 01 January, 1970 UTC.
In time values leap seconds are ignored.
It is assumed that there are exactly 86,400,000 milliseconds per day.
ECMAScript Number values can represent all integers from
–9,007,199,254,740,992 to 9,007,199,254,740,992;
this range suffices to measure times to millisecond precision
for any instant that is within approximately 285,616 years,
either forward or backward, from 01 January, 1970 UTC.
The actual range of times supported by ECMAScript Date objects is
slightly smaller: exactly –100,000,000 days to 100,000,000 days
measured relative to midnight at the beginning of 01 January, 1970 UTC.
This gives a range of 8,640,000,000,000,000 milliseconds
to either side of 01 January, 1970 UTC.
275760년을 입력해 보면 275760/09/13까지만 표시됩니다.
또한 275761년은 입력 시점에 들어가지 않았습니다.
확실히 쓰여진 사양과 일치합니다! !
즉...
그래서 이하, 3개의 대처 방법을 생각했습니다.
해결 방법
W3C(HTML측)에서의 문헌을 찾을 수 없었습니다만, ECMA 문서 에 의하면, 275760년 9월 13일까지 입력할 수 있다고 합니다.
Time Values and Time Range
(中略)
Time is measured in ECMAScript in milliseconds since 01 January, 1970 UTC.
In time values leap seconds are ignored.
It is assumed that there are exactly 86,400,000 milliseconds per day.
ECMAScript Number values can represent all integers from
–9,007,199,254,740,992 to 9,007,199,254,740,992;
this range suffices to measure times to millisecond precision
for any instant that is within approximately 285,616 years,
either forward or backward, from 01 January, 1970 UTC.
The actual range of times supported by ECMAScript Date objects is
slightly smaller: exactly –100,000,000 days to 100,000,000 days
measured relative to midnight at the beginning of 01 January, 1970 UTC.
This gives a range of 8,640,000,000,000,000 milliseconds
to either side of 01 January, 1970 UTC.
275760년을 입력해 보면 275760/09/13까지만 표시됩니다.
또한 275761년은 입력 시점에 들어가지 않았습니다.
확실히 쓰여진 사양과 일치합니다! !
즉...
그래서 이하, 3개의 대처 방법을 생각했습니다.
해결 방법
<input type="date"/>
의 사양에 대응한 값으로 한다개인적으로는, 3이 제일 깨끗이입니다만, 각각의 방법에 대한 나의 견해를 써 둡니다.
1 또는 2는 테스트 코드 측에서 대응할 수 있습니다.
3은 어플리케이션측의 뷰(HTML)를 변경할 필요가 있습니다만, 테스트 코드는 위화감이 없는 것이 됩니다.
1은 사용자의 매뉴얼 조작과는 다르고, 사양을 이해하고 있지 않은 사람이 보면 의미 불명한 테스트 코드가 되어 버립니다.
2는 테스트 코드로서도 위화감없이 HTML 측의 수정도 불필요합니다만, 그 부분만 Javascript의 요소가 더해집니다.
이하, SeleniumWebDriver(Ruby)로 검증을 한 코드를 실어 둡니다.
Selenium Webdriver (Ruby)의 검증
브라우저와 Selenium은 다음 버전을 사용했습니다.
date.html
<!DOCTYPE html>
<html>
<body>
<form>
<input type="date" id="date"/>
</form>
</body>
</html>
Gemfile
source 'https://rubygems.org'
gem 'selenium-webdriver'
의도하지 않은 입력 값이되는 경우
NG 케이스 1 : 하이픈 (-)없이 날짜를 sendkeys
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :chrome
driver.get('file://[date.htmlの絶対パス]')
ele = driver.find_element(:css, '#date')
ele.send_keys('20210131')
puts ele.attribute('value') # => 202101-03-01
NG케이스 2:하이픈(-) 단락의 일자를 sendkeys
:
ele.send_keys('2021-01-31')
puts ele.attribute('value') # => 202101-03-01
NG케이스 3:슬래시(/) 단락의 일자를 sendkeys
:
ele.send_keys('2021/01/31')
puts ele.attribute('value') # => 202101-03-01
NG케이스 4: 선두에 0을 1개 부여한 값을 sendkeys
:
ele.send_keys('020210131')
puts ele.attribute('value') # => 20210-12-01
의도한 입력값이 되는 경우
이하, 입력치는 모두 2021/01/31 가 되어, 의도대로의 결과가 됩니다.
OK케이스 1:선두에 0을 2개 부여한 값을 sendkeys
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :chrome
driver.get('file://[date.htmlの絶対パス]')
ele = driver.find_element(:css, '#date')
ele.send_keys('0020210131')
puts ele.attribute('value') # => 2021/01/31
OK케이스 2:하이픈(-) 단락의 일자의 선두에 0을 2개 부여한 값을 sendkeys
ele.send_keys('002021-01-31')
puts ele.attribute('value') # => 2021/01/31
OK케이스 3:Javascript로 value를 입력
driver.execute_script('document.getElementById("date").value="2021-01-31";')
puts ele.attribute('value') #=> 2021-01-31
OK 케이스 4 : input 태그에 max 속성을 추가하여 하이픈 (-)없이 날짜를 sendkeys
date_max.html
<!DOCTYPE html>
<html>
<body>
<form>
<input type="date" id="date_max" max="2999-12-31"/>
</form>
</body>
</html>
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :chrome
driver.get('file://[date_max.htmlの絶対パス]')
ele = driver.find_element(:css, '#date_max')
ele.send_keys('20210131')
puts ele.attribute('value') #=> 2021-01-31
OK 케이스 5 : input 태그에 max 속성을 추가하여 슬래시 (/)로 구분 된 날짜를 sendkeys
ele = driver.find_element(:css, '#date_max')
ele.send_keys('2021/01/31')
puts ele.attribute('value') #=> 2021-01-31
Reference
이 문제에 관하여(input[type="date"]를 Selenium으로 조작할 때의 주의점), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/oh_rusty_nail/items/9afb124e423e9e12c020텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)