Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to send a date directly as text to a calendar control with readonly attribute using Selenium through Python?

I'm trying to select a date form a calendar with python and selenium but I need some help, I did this in VBA but I want to do this in python. Thanks in advance.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver=webdriver.Firefox(executable_path=r'..\geckodriver.exe')
driver.get('https://burghquayregistrationoffice.inis.gov.ie/Website/AMSREG/AMSRegWeb.nsf/AppSelect?OpenForm')    

# this is the problem
driver.find_element_by_id('GNIBExDT').send_keys(10/08/2019)
like image 677
Paul Nobrega Avatar asked Oct 18 '25 10:10

Paul Nobrega


1 Answers

It's a read-only input - if you look in the HTML src, it's got the readonly attribute. This means that send_keys, which works by emulating key presses as if it were a real user (to also trigger any eventlisteners listening for change in the input), is trying to type your value, but can't, since it's read-only. However, you can still set it manually - try:

driver.execute_script("document.getElementById('GNIBExDT').value = '10/08/2019'")

This executes the following JS code:

document.getElementById('GNIBExDT') // Equivalent of driver.find_element_by_id('GNIBExDT') in pure JS
    .value = // Used to set the 'value' of the input, which is what will be read on the backend when the form is submitted. This just sets the value directly, so it doesn't matter if it's read-only.
    '10/08/2019' // The date, in string form.

It seems like they're just using basic strings on the example website to represent dates, since it's a custom datepicker. So, they're not doing anything special, such as using actual date formats or Date objects. However, since based on the title this is what you'd like, I'll give an example to do such for anyone else who's Googled this problem:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver=webdriver.Firefox(executable_path=r'..\geckodriver.exe')
driver.get('https://www.w3schools.com/html/tryit.asp?filename=tryhtml_input_date')

driver.execute_script("document.getElementsByTagName('input')[0]"  # Get the date picker from the DOM
                     +".valueAsDate"  # Set the value *as a date object* - this is only available in real date pickers (`<input type='date'>`)
                     +" = new Date('2020-03-11')"  # We therefore need to define it as a date object, which we do in 'yyyy-mm-dd hh:mm:ss GMT+hhmm' format
)
like image 62
Geza Kerecsenyi Avatar answered Oct 19 '25 23:10

Geza Kerecsenyi



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!