【问题标题】:How to send a date directly as text to a calendar control with readonly attribute using Selenium through Python?如何通过 Python 使用 Selenium 将日期作为文本直接发送到具有只读属性的日历控件?
【发布时间】:2019-12-18 08:03:40
【问题描述】:

我正在尝试使用 python 和 selenium 从日历中选择一个日期,但我需要一些帮助,我在 VBA 中执行此操作,但我想在 python 中执行此操作。 提前致谢。

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)

【问题讨论】:

    标签: javascript python selenium calendar readonly-attribute


    【解决方案1】:

    这是一个只读输入 - 如果你查看 HTML src,它有 readonly 属性。这意味着send_keys,它通过模拟按键就像它是一个真正的用户一样工作(也触发任何监听输入变化的事件监听器),试图输入你的值,但可以't,因为它是只读的。但是,您仍然可以手动设置 - 尝试:

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

    这会执行以下JS代码:

    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.
    

    他们似乎只是在示例网站上使用基本字符串来表示日期,因为它是一个自定义日期选择器。因此,他们没有做任何特别的事情,例如使用实际的日期格式或 Date 对象。但是,由于根据标题,这是您想要的,我将举一个例子,让其他在谷歌上搜索过这个问题的人这样做:

    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
    )
    

    【讨论】:

      【解决方案2】:

      &lt;label&gt; 出生日期 关联的&lt;input&gt; 字段具有只读 属性。所以要调用send_keys(),你必须:

      • 滚动以将元素置于视口中。
      • 使用execute_script() 删除readonly 属性。
      • 调用send_keys() 发送日期。
      • 您可以使用以下解决方案:

        • 代码块:

          from selenium import webdriver
          from selenium.webdriver.support.ui import WebDriverWait
          from selenium.webdriver.common.by import By
          from selenium.webdriver.support import expected_conditions as EC
          
          driver.get("https://burghquayregistrationoffice.inis.gov.ie/Website/AMSREG/AMSRegWeb.nsf/AppSelect?OpenForm")
          dob = driver.find_element_by_css_selector("input#DOB")
          driver.execute_script("window.scrollBy(0, 400)")
          driver.execute_script("arguments[0].removeAttribute('readonly')", dob);
          driver.find_element_by_css_selector("input#DOB").send_keys("10/08/2019")
          
      • 浏览器快照:

      【讨论】:

      • 谢谢,效果很好,我试了好几天,没想到要删除某些属性。
      猜你喜欢
      • 1970-01-01
      • 2021-11-10
      • 2018-04-11
      • 2019-09-23
      • 2020-05-28
      • 2018-07-04
      • 2012-05-25
      • 1970-01-01
      • 2022-08-14
      相关资源
      最近更新 更多