如何使用Selenium Python在onkeydown=“return false”的输入日期控件中发送日期

uidvcgyl  于 2023-06-29  发布在  Python
关注(0)|答案(4)|浏览(179)

我有一个最小的HTML:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <input type="date" max="2023-03-09" value="2023-03-09" onkeydown="return false">
  5. </body>
  6. </html>

它只要求输入日期,但onkeydown="return false"阻止键盘输入。所以我必须浏览(我猜是浏览器生成的)日历,但不知道如何访问它。甚至控件中的日历图标也很难访问。我已经采取了点击与固定的偏移量,但也许有一个更好的方法。
我的最小Python代码是:

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. from selenium.webdriver import ActionChains
  4. import time
  5. driver = webdriver.Firefox()
  6. driver.get("E:\\Web\\TestDate\\public_html\\index.html")
  7. buttonDate = driver.find_element(By.TAG_NAME, "input")
  8. action = ActionChains(driver)
  9. w, h = buttonDate.size['width'], buttonDate.size['height']
  10. x, y = buttonDate.location['x'], buttonDate.location['y']
  11. wx, wy = driver.get_window_size()['width'], driver.get_window_size()['height']
  12. action.move_to_element_with_offset(buttonDate, w - 10, h - 7)
  13. action.click()
  14. action.perform()
  15. time.sleep(30)
  16. driver.quit()

这样我就可以打开日历控件,但不能使用send_keys()来更改日期。

332nm8kg

332nm8kg1#

只要删除事件处理程序

  1. driver.execute_script("document.querySelector('input[type=\"date\"]').onkeydown = () => {}")

JavaScript代码

  1. document.querySelector('input[type="date"]').onkeydown = () => {}

完整代码,如

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. from selenium.webdriver import ActionChains
  4. import time
  5. driver = webdriver.Firefox()
  6. driver.get("E:\\Web\\TestDate\\public_html\\index.html")
  7. buttonDate = driver.find_element(By.TAG_NAME, "input")
  8. # Call Javascript Here.
  9. driver.execute_script("document.querySelector('input[type=\"date\"]').onkeydown = () => {}")
  10. # Now send the keys here to the element
  11. buttonDate.send_keys("20230629")
  12. action = ActionChains(driver)
  13. time.sleep(30)
  14. driver.quit()

通过jsfiddle在线测试

展开查看全部
rpppsulh

rpppsulh2#

您可以使用Selenium的execute_script方法来运行JavaScript并将文本传递到所需的文本框中。参考下面的代码:

  1. date= "2023-03-09"
  2. input_box = driver.find_element(By.XPATH, "//input[@type='date']")
  3. driver.execute_script('arguments[0].value=arguments[1]', input_box, date)

**注意:**类似于从后台将文本插入网页。这种解决方案不会像selenium的send_keys那样模仿人类的行为。

hfwmuf9z

hfwmuf9z3#

给定HTML:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <input type="date" max="2023-03-09" value="2023-03-09" onkeydown="return false">
  5. </body>
  6. </html>

要发送自定义日期,可以使用removeAttribute()方法删除onkeydown属性,然后调用send_keys(),如下所示:

  1. driver.get("file:///C:/Users/debanjan.bhattacharj/Desktop/My%20Documents/Selenium/date.html")
  2. driver.execute_script("arguments[0].removeAttribute('onkeydown')", WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "input[type='date']"))))
  3. driver.find_element(By.CSS_SELECTOR, "input[type='date']").send_keys("29062023")

浏览器快照:

参考资料

您可以在以下内容中找到一些相关的详细讨论:

展开查看全部
e0uiprwp

e0uiprwp4#

可以使用JS setAttribute()函数直接修改日期:

  1. script = (
  2. """document.querySelector('%s').setAttribute('%s','%s');"""
  3. % ('input[type="date"]', "value", "2023-06-29")
  4. )
  5. driver.execute_script(script)

相关问题