在使用selenium爬取数据时,有时会需要选择日期,来获取某个时间段的数据。网页上日历控件一般是一个文本输入框,鼠标点击,就会弹出日历界面,可以选择具体日期。这篇就介绍用selenium如何实现自动化控制日历控件。
基本思路
方法一:可以模拟鼠标点击,拖动的方式。
方法二:使用js进行控制直接输入日期文本内容。
这里主要介绍第二种方法。因为大部分的日期控件,都可以把它当成一个普通的input框处理,进行输入操作。但是日历控件一般都会有一个readonly
属性,让用户只能够通过鼠标选择,不能够输入。
因此,需要先将这一属性去掉,再通过js控制,在input框内直接输入日期,这样就可以达到控制日历控件的目的。其中,selenium有两种执行方法,一是执行js代码,二是通过send_keys
进行输入。
具体代码
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.12306.cn/index/")
# 等待 首页 元素出现
element=WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH,'//li[@class="nav-item nav-item-w1 active"]/a')))
# 处理开始时间
# js去掉readonly属性
js = 'document.getElementById("train_date").removeAttribute("readonly");'
driver.execute_script(js)
# 第一种:使用js控制
js_value = "document.getElementById('train_date').value='{}'" .format("2018-05-20")
driver.execute_script(js_value)
# 第二种:直接输入日期
#driver.find_element_by_id('train_date').clear()
#driver.find_element_by_id('train_date').send_keys('2018-05-20')
time.sleep(5)
driver.close()
效果
可以看到,上面的日历控件的日期已经被修改了。
但是input标签的value值并没有改变,我猜测这个value值是一个初始化值,应该会在提交的时候,获取修改过后的值赋给另外一个变量。
如果你有不同的想法,或者知道正确的逻辑,欢迎在评论告诉我。