代码之家  ›  专栏  ›  技术社区  ›  NGobin

如何在水豚中获得表单字段的值?

  •  0
  • NGobin  · 技术社区  · 2 年前

    有没有办法从Capybara中获取表单字段的值?

    我知道我可以通过以下方式检查Minitest中的表单字段是否正确预填:

    assert page.has_field? "some_field", with: "some_value"

    但是,有没有一种方法可以像水豚读取表单字段的方式一样获得表单字段值?我问这个问题的原因是,我正试图让capybara测试datetime_field的前缀是否正确,而且我很难使strftime格式正确。如果我可以使用调试器或put获得一次capybara正在检查的值,那么设计 with: "some_value" 正确地

    --编辑-- 好吧,与我的评论相反,我仍在为此而挣扎。我通过匹配的格式来处理表单的一部分 value="" 属性。

    但现在我要处理表单的另一部分,其中默认值是使用先前输入的值基于turbo帧刷新来填充的。

    当我尝试 save_page 在Capybara中,html源代码包含以下内容:

    <input class="form-control" value="2024-02-07T00:17:00" type="datetime-local" name="record[actual_end_datetime]" id="record_actual_end_datetime">
    

    但是这个Minitest断言失败了:

    puts the_time = p_e_time.in_time_zone.strftime("%Y-%m-%dT%H:%M:00")
    assert page.has_field? "record[actual_end_datetime]", with: the_time
    

    即使put输出与html:2024-02-07T00:17:00中看到的字符串完全匹配。如果我评论出“with:”,测试就会通过,所以我真的很难知道如何让这场比赛发挥作用。

    任何见解都将不胜感激!

    1 回复  |  直到 2 年前
        1
  •  1
  •   Thomas Walpole    2 年前

    您关于使用find_field(…).value的回答是正确的,并返回与HTML中的value属性不同的value属性,因为value属性是通过用户编辑更新的。话虽如此,您永远不应该将Capybaras谓词与类似资产一起使用

    assert page.has_field? ...
    

    通过使用它,您可能会删除Capybaras重试行为(对异步页面更新很重要),并丢失详细的错误消息,这些错误消息可能会首先给您想要的内容。相反,您应该使用Capybara提供的断言

    assert_field("record[actual_end_datetime]", with: the_time)
    
        2
  •  1
  •   NGobin    2 年前

    解决了它:

    puts find_field("record[actual_end_datetime]").value
    

    输出的正是Capybara试图匹配的内容(不一定等于 value html的字段)。一旦我有了这个,几秒钟内就解决了。

    推荐文章