使用RSelenium爬取票价时如何操作Flatpickr日历选择日期时间
可以直接向该Flatpickr日期控件传值,不需要模拟逐一点击日历元素,优先推荐使用执行JS修改输入框值的方案,两种实现方式如下:
方案1:直接修改输入框值(最优,无需操作弹窗)
Flatpickr组件默认绑定了对应的输入框,大部分场景下输入框被设置了只读属性,无法直接用sendKeysToElement传值,用JS修改属性和值即可:
# 定位日期输入框 date_input <- remDr$findElement(using = "id", value = "js-auskunft-datum-value") # 执行JS:移除只读属性、赋值、触发change事件让组件识别值变更 remDr$executeScript(" arguments[0].removeAttribute('readonly'); arguments[0].value = arguments[1]; arguments[0].dispatchEvent(new Event('change')); ", list(date_input, day)) # 用同样逻辑处理时间输入 time_input <- remDr$findElement(using = "id", value = "js-auskunft-time-value") remDr$executeScript(" arguments[0].removeAttribute('readonly'); arguments[0].value = arguments[1]; arguments[0].dispatchEvent(new Event('change')); ", list(time_input, time))
该方案不受页面语言、日历弹窗加载状态影响,运行效率最高。
方案2:模拟点击日历元素
如果需要完全模拟用户操作,可以点击触发日历弹窗后定位对应日期元素点击:
# 点击日期输入框触发日历弹窗 date_input$clickElement() Sys.sleep(2) # 等待弹窗加载完成 # 转换日期格式为aria-label对应的格式(如果是德语界面需修改为德语月份格式) target_date_label <- format(as.Date(day, "%d.%m.%Y"), "%B %d, %Y") # 定位目标日期元素并点击 target_day_elem <- remDr$findElement(using = "xpath", value = sprintf("//span[contains(@class, 'flatpickr-day') and @aria-label='%s']", target_date_label)) target_day_elem$clickElement()
注意:如果站点是德语界面,日历的aria-label会使用德语月份名称,该方案需要额外做月份名称的本地化适配,不如方案1通用。
内容的提问来源于stack exchange,提问作者Ezra
相关产品推荐
相关产品推荐

