是否使用 selenium 更改输入日期框的值?

ds97pgxw  于 2023-01-09  发布在  其他
关注(0)|答案(1)|浏览(102)

我想在本网站上将日期更改/选择为"12/03/2022":
https://www.cyberarena.live/schedule-efootball
使用以下代码:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager

if __name__ == '__main__':
  options = Options()
  options.add_experimental_option ('excludeSwitches', ['enable-logging'])
  options.add_argument("start-maximized")
  options.add_argument('window-size=1920x1080')                               
  options.add_argument('--no-sandbox')
  options.add_argument('--disable-gpu')  
  srv=Service(ChromeDriverManager().install())
  driver = webdriver.Chrome (service=srv, options=options)    
  waitWD = WebDriverWait (driver, 10)         
  
  link = f"https://www.cyberarena.live/schedule-efootball" 
  driver.get (link)       
  tdayString = "12/03/2022"
  driver.execute_script("arguments[0].setAttribute('value',arguments[1])", waitWD.until(EC.element_to_be_clickable((By.XPATH, "//input[contains(@id,'input_comp')]"))), tdayString)
  input("Press!")

但是打开的网站没有任何变化-它仍然是用这个代码选择的实际日期。我如何在输入/选择框中更改日期?

vuktfyat

vuktfyat1#

Javascript不起作用如果我们试图清除输入框

date_element = driver.find_element(By.XPATH, "//input[contains(@id,'input_comp')]")
date_element.clear()

我们得到错误

InvalidElementStateException: Element is not currently interactable and may not be manipulated

所以我看到的唯一解决方案是从日期选择器菜单中手动选择日期(注意target_datecurrent_date有不同的日期格式!如果你想改变这一点,你必须在target_date的定义中编辑字符串'%d/%m/%Y'

# open the date picker
driver.find_element(By.CSS_SELECTOR, '.EYZRr3').click()

# date to be set
from datetime import datetime
target_date_str = '1/1/2022' # day / month / year
target_date = datetime.strptime(target_date_str, '%d/%m/%Y')

# current date
date_element = driver.find_element(By.XPATH, "//input[contains(@id,'input_comp')]")
current_date = datetime.strptime(date_element.get_attribute('value'), '%m/%d/%Y') # month / day / year

currentMonthYear = driver.find_element(By.CSS_SELECTOR, 'button[data-testid=currentMonthYear]')

# select the month
while currentMonthYear.text != target_date.strftime('%B %Y'): # compare month name and year, example 'January 2023' != 'March 2022'
    # compare year and month as integers, example 202205 > 202301
    if int(target_date.strftime('%Y%m')) > int(current_date.strftime('%Y%m')):
        driver.find_element(By.CSS_SELECTOR, 'button[data-testid=nextMonth]').click()
    else:
        driver.find_element(By.CSS_SELECTOR, 'button[data-testid=prevMonth]').click()
    currentMonthYear = driver.find_element(By.CSS_SELECTOR, 'button[data-testid=currentMonthYear]')

# select the day
driver.find_element(By.XPATH, f"//table[@role='table']//span[text()='{target_date.day}']").click()

相关问题