Tengo dificultades para seleccionar una fecha de un menú desplegable en un sitio:
https://www3.hkexnews.hk/sdw/search/mutualmarket.aspx?t=hk&t=hk
Se ve que hay un menú desplegable de fecha de calendario con código HTML
<input name="txtShareholdingDate" type="text" value="2022/07/15" id="txtShareholdingDate" class="input-searchDate active" data-reset="2022/07/16" readonly="readonly">Mi primera estrategia para seleccionar una fecha arbitraria es:
from selenium import webdriver browser = webdriver.Chrome(executable_path=r'D:\chromedriver.exe') browser.get(link) dateelem = browser.find_element_by_id('txtShareholdingDate') dateelem.click()Y en el navegador sin cabeza parece tener 3 columnas desplegables: "Año", "Mes", "Día".
A partir de aquí, me he quedado atascado tratando de seleccionar una fecha aleatoria aquí (por ejemplo, 21/09/2021), y busqué en Google una gran cantidad de soluciones alternativas. La mayoría de esas soluciones propuestas involucraban el uso find_element_by_css_selector() o xpaths con etiquetas anidadas, pero siempre recibía errores como "No se puede ubicar el elemento".
Otro tipo de soluciones que probé fue
from selenium.webdriver.support.ui import Select dateelem = Select(browser.find_element_by_id('txtShareholdingDate'))y luego saldría el siguiente error:
UnexpectedTagNameException: Message: Select only works on <select> elements, not on <input>Entonces, ¿cómo podría evitar las múltiples capas del menú desplegable para obtener una fecha general?
El selector de fecha se genera a través de una etiqueta <input>

Entonces no puedes usar la clase Select() .
Además, el elemento <input> tiene establecido el atributo readonly="readonly" .
Para seleccionar una fecha diferente, puede usar el método removeAttribute() para eliminar el atributo de readonly y luego usar el método setAttribute() para establecer el nuevo valor de la siguiente manera:
driver.get('https://www3.hkexnews.hk/sdw/search/mutualmarket.aspx?t=hk&t=hk') calendar = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#txtShareholdingDate"))) driver.execute_script("arguments[0].removeAttribute('readonly')", calendar) driver.execute_script("arguments[0].setAttribute('value','2021/08/16')", calendar)Nota : debe agregar las siguientes importaciones:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as ECInstantánea del navegador:

Prueba el siguiente código, solo cámbialo como quieras
driver.execute_script("document.getElementById('txtShareholdingDate').value='2022/03/14'") sleep(7) btnSearch=driver.find_element(By.ID,"btnSearch") btnSearch.click()Importar
from selenium import webdriver from selenium.webdriver.common.by import By