Rspec 如何用水豚填充隐藏区域?

Rspec 如何用水豚填充隐藏区域?,rspec,capybara,Rspec,Capybara,我已经发现,当我想为文本字段、文本区域或密码字段设置值时,我可以在中使用id、name或label作为某物填充某物,:with=>某个值。然而,当我试图将值设置为字段时,这种方法失败了(我之所以想这样做,是因为这些通常是填充的客户端脚本,我会单独测试)。我怎么能用水豚设置这样一个隐藏的区域?可能吗 HTML: 给出: 1) posting new offer should add new offer Failure/Error: fill_in 'offer[latitude]', :wi

我已经发现,当我想为文本字段、文本区域或密码字段设置值时,我可以在
中使用id、name或label作为
某物
填充某物,:with=>某个值
。然而,当我试图将值设置为
字段时,这种方法失败了(我之所以想这样做,是因为这些通常是填充的客户端脚本,我会单独测试)。我怎么能用水豚设置这样一个隐藏的区域?可能吗

HTML:

给出:

1) posting new offer should add new offer
   Failure/Error: fill_in 'offer[latitude]', :with => '11.11'
   Capybara::ElementNotFound:
     cannot fill in, no text field, text area or password field with id, name, or label 'offer[latitude]' found

您需要找到隐藏字段并设置其值。有两种方法,这可能是最简单的

find(:xpath, "//input[@id='my_hidden_field_id']").set "my value"
如果您正在生产环境中执行客户端脚本,您可以告诉capybara使用符合javascript的驱动程序运行它

page.execute_script("$('hidden_field_id').my_function()")

如果您使用poltergeist/phantomjs作为驱动程序,而jquery对您不起作用,那么总会有好的老式js:

page.execute_script("document.getElementById('#some-id').value = 'some-value'");

有很多方法可以达到同样的效果。我最喜欢的是:

first('input#id.class', visible: false).set("your value")

这就是我的工作

find_field(id: 'your_hidden_field_id', type: :hidden).set('Field value here')

  

通常一个人不能填写隐藏的字段,因此水豚不会填写它们。有关更多讨论,请参阅。但通常情况下,您要么在服务器上填充它,要么使用javascript。@Doon的评论非常正确。如果您想检查/更改隐藏的输入,很可能是使用了错误的工具。Capybara设计用于在各种场景中测试整个应用程序,而不是测试JS组件。结帐或付款。然而,在某些情况下,填充HTML5输入是明智的,因为HTML5输入在不兼容的浏览器中是多填充的。多边形填充通常隐藏正确的输入并插入额外的标记。是的,XPath完成了这项工作。您在@附近有一个输入错误,它应该是
find(:xpath,//input[@id='my'u hidden'u field\u id'])。设置“我的值”
CSS匹配器对我来说也很好
find(“#my'u hidden'u field”)。设置(“我的值”)
FWIW,从Capybara 2.7.1开始,这不再适用于我。通过将
visible:false
传递到
#find
方法进行修复。@RyanDlugosz-
页面。执行脚本
肯定仍然有效,即使在Capybara对单击隐藏/不可见DOM元素的新约束下也是如此。与skalee和ryan dlugosz注释结合使用时效果最佳:
查找(“我的隐藏字段”,visible:false)。设置(“我的值”)
仅当您对返回值(并且它不是对象)感兴趣时才使用
评估脚本
执行脚本
在这种情况下更好。回答很好,但jQuery使用的是poltergeist/phantomjs。可能您的id是“某个id”,而不是“某个id”。首先('input#id.class',visible:false)。设置('your value'))谢谢。更新了我的回复。考虑到id是唯一的,你可以使用
find('#id')。set(“value”)
visible:false
找到它,但是我在
set()
上发现了这个错误。
元素当前不可见,因此可能无法与之交互(Selenium::WebDriver::error::ElementNotVisibleError)
page.execute_脚本(“document.getElementById('some_id')。value={some_value}”)
first('input#id.class', visible: false).set("your value")
find_field(id: 'your_hidden_field_id', type: :hidden).set('Field value here')