繁体   English   中英

Rails Capybara没有看到字段

[英]Rails Capybara not seeing fields

我觉得我要疯了。 对我的Post模型进行例行的水豚测试。 具体来说,请确保新页面在有效提交后重定向到新创建的帖子。 所以在我的spec / requests文件夹中,我得到了:

describe "Valid post submission --" do

    it "should log in a user and redirect to new post" do

      # Sign in works find, so I won't reproduce it

      # Make a blogpost
      Post.destroy_all
      fill_in :name_here, with: "Post Name Here"
      fill_in :content_here, with: "This is the content of a really short post."
      screenshot_and_open_image
      click_on "Post It"
      screenshot_and_open_image
      puts current_path
      page.should have_selector 'h2', text: "prohibited this post"
      page.should have_selector 'h1', text: "Post Name Here"
      page.should have_selector '.alert', text: "Post was successfully created."
      page.should have_selector 'title', text: full_title('Post Name Here')

    end

屏幕截图和放置在这里以澄清发生了什么。 基本上有两种不同的情况。

  1. 我只保留字段be并测试默认ID(“ post_name”和“ post_content”); 显然,以上测试适用于情况二:
  2. 我将字段ID更改为“ name_here”和“ content_here”,以测试标签名称或其他任何内容是否受到干扰。 这就是上面的规范。

在第2种情况下,该帖子被拒绝了,因为Capybara找不到任何一个字段。

在情况1中,只有内容为空,但名称字段将被内容填充

情况1的精确错误是:

2) Posts Invalid post - should refresh with error if content empty
     Screenshot: /Users/myusername/rails/appname/tmp/capybara/screenshot_2013-03-14-22-37-36.634.png
     Failure/Error: fill_in :post_name, with: "Post Name Here"
     Capybara::ElementNotFound:
       cannot fill in, no text field, text area or password field with id, name, or label 'post_name' found
     # (eval):2:in `fill_in'
     # ./spec/requests/posts_spec.rb:43:in `block (3 levels) in <top (required)>'

情况2不会因找不到合适的内容而引发错误,我相信是因为标签也具有该ID。

这太荒谬了,因为我在测试出错之前就对HTML durin进行了快照。 这是案例2-除了ID差异外,这两种情况在这里看起来都相同90%:

<form accept-charset="UTF-8" action="/posts" class="new_post" id="new_post" method="post">
 <div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓"></div>
 <div class="field">
  <label for="post_name">Name</label>
   <br><input id="name_here" name="post[name]" size="30" type="text">
 </div>
 <div class="field text-area">
  <label for="post_content">Content</label>
  <br><textarea cols="50" id="content_here" name="post[content]" rows="20"></textarea>
 </div>
 <div class="actions btn-group">
  <input class="btn" name="commit" type="submit" value="Post It">
 </div>
</form>

请注意post_content字段的明确存在。 如果两者均失败(情况1),则同时存在content_here和name_here字段。 因此字段在那里。 而且水豚通常可以正常工作(这种情况在我的应用程序的其他部分中可以找到)。 而且问题不在于标签名称,因为在输入字段上放置不同的ID不会帮助水豚找到它们。

顺便说一句,这一切在现实中完美地工作。

知道这里到底发生了什么吗? 我超级沮丧/无知。

更新 -根据user2172816的建议,我更改了HAML,因此HTML如下所示:

<form accept-charset="UTF-8" action="/posts" class="new_post" id="new_post" method="post">
 <div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓"></div>
 <div class="field">
  <label for="post_name">Name</label>
  <br><input id="name" name="post[name]" size="30" type="text">
 </div>
 <div class="field text-area">
  <label for="post_content">Content</label>
  <br><textarea cols="50" id="content" name="post[content]" rows="20"></textarea>
 </div>
 <div class="actions btn-group">
  <input class="btn" name="commit" type="submit" value="Post It">
 </div>
</form>

现在,测试如下所示:

 # Make a blogpost
  Post.destroy_all
  fill_in "Name", with: "Post Name Here"
  fill_in "Content", with: "This is the content of a really short post."
  page.should have_selector 'h2', text: "prohibited this post"
  page.should have_selector 'h1', text: "Post Name Here"
  page.should have_selector '.alert', text: "Post was successfully created."
  page.should have_selector 'title', text: full_title('Post Name Here')

但这仍然是错误的(在相同规格的新部分中也是如此!):

  1) Posts Invalid post - should refresh with error if content empty
     Screenshot: /Users/username/rails/appname/tmp/capybara/screenshot_2013-03-14-23-54-38.072.png
     Failure/Error: fill_in :name, with: "Post Name Here"
     Capybara::ElementNotFound:
       cannot fill in, no text field, text area or password field with id, name, or label 'name' found
     # (eval):2:in `fill_in'
     # ./spec/requests/posts_spec.rb:43:in `block (3 levels) in <top (required)>'

  2) Posts Invalid post - should refresh with error if name empty
     Screenshot: /Users/username/rails/appname/tmp/capybara/screenshot_2013-03-14-23-54-38.274.png
     Failure/Error: fill_in :name, with: ""
     Capybara::ElementNotFound:
       cannot fill in, no text field, text area or password field with id, name, or label 'name' found
     # (eval):2:in `fill_in'
     # ./spec/requests/posts_spec.rb:33:in `block (3 levels) in <top (required)>'

  3) Posts Valid post submission -- should log in a user and redirect to new post
     Screenshot: /Users/username/rails/appname/tmp/capybara/screenshot_2013-03-14-23-54-38.459.png
     Failure/Error: fill_in :name, with: "Post Name Here"
     Capybara::ElementNotFound:
       cannot fill in, no text field, text area or password field with id, name, or label 'name' found
     # (eval):2:in `fill_in'
     # ./spec/requests/posts_spec.rb:67:in `block (3 levels) in <top (required)>'

标签的“ for”属性应为输入元素的“ id”,即

<label for="name_here">Name</label>
   <br><input id="name_here" name="post[name]" size="30" type="text">

在规范中,您应该致电:

fill_in 'Name', with: "Post Name Here"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM