如何用水豚填写日期时间本地字段?

问题描述 投票:0回答:4

我正在使用 Cocoon 添加记录。 ID 看起来像

workshop_instance_sessions_attributes_1477654140_start_time
。目前,我正在遍历 DOM 并获取动态生成的 ID(这很好用),这样我就可以使用它们来引用要填写的输入。我已经尝试了很多东西(许多在控制台中工作),但似乎仍然无法得到工作规范。下面是我尝试过的一些事情(
first
是保存id的变量,
@time
基本上是Time.now,随着块的执行而递增)。

在控制台中工作:

page.evaluate_script("document.getElementById('#{first}').value = '#{@time.strftime('%Y-%m-%eT%H:%M')}'")

page.evaluate_script("$('##{first}').val('#{@time.strftime("%Y-%m-%eT%H:%M")}')")

在控制台中不起作用:

fill_in first, with: @time.strftime("%Y-%m-%eT%H:%M")

find("##{first}").set(@time.strftime("%Y-%m-%eT%H:%M"))

这些都已经在一个内部块中(我遇到的一个常见问题),我知道它们工作正常,因为第一个变量被正确设置。

作为参考,我的 html 看起来像这样:

<input class="form-control" type="datetime-local" name="workshop_instance[sessions_attributes][1477655024][start_time]" id="workshop_instance_sessions_attributes_1477655024_start_time">

任何有关如何使该规范发挥作用的指示将不胜感激。

ruby rspec capybara
4个回答
8
投票

根据 Capybara 发行说明此处

Selenium 驱动程序在填写日期/时间/日期时间本地输入时支持日期/时间

所以回答你的问题:

fill_in first, with: Time.new(2018, 01, 02, 12)

7
投票

这将根据所使用的驱动程序/浏览器而有所不同。假设您在 chrome 中使用 selenium-webdriver,您需要设置要输入控件的按键,以便设置 2000 年 12 月 13 日下午 3:15,您需要这样做

fill_in first, with: "12132000\t0315p"

1
投票

我必须使用简单的解决方案结合 hack 来触发 React 的

onChange

fill_in "Date and hour", with: 1.day.from_now
# HACK: triggers onChange
find("input[type=datetime-local]").send_keys(:arrow_up)

它改变了日期


0
投票

为了完整起见,它似乎也适用于简单的 ISO 格式:

fill_in first, with: "2017-08-02T15:27"

与选择的输入格式无关,但我在验证方面遇到了相关问题,因为当更改值时,我的浏览器(chrome)期望一个值具有与上次相同的秒数。为了解决这个问题,我必须将 step 属性设置为“1”(“any”也可能有效):

datetime_field(:created_at, step: 1)

Step 默认为 60,这意味着时间必须向上或向下舍入到最接近的 60 秒(1 分钟)。在我的例子中这看起来没问题,因为我不需要第二精度。但问题是,如果您加载包含秒数的值(

datetime_field
默认情况下执行的操作),那么在更改它时,您必须保持相同的秒数,否则会收到验证错误。例如,如果您最初有“15:12:24”,则可以将其更改为“16:42:24”,但不能更改为“16:42:00”。很高兴知道:)

© www.soinside.com 2019 - 2024. All rights reserved.