使用Capybara + Rails3找不到要点击的元素

时间:2012-07-04 20:49:01

标签: ruby-on-rails testing rspec capybara

背景:我正在使用Capybara和Rspec来测试Rails 3应用。 使用的驱动程序:Selenium

问题: 我无法找到“登录”按钮,以便在我的测试中点击。

HTML code:

<form accept-charset="UTF-8" action="/" class="filter_form" id="login" method="post">
        <fieldset>
          <div class="modal-body">
            <div class="clearfix login-fields">
              <label for="user_email">Email</label>
              <div class="input login-inputs">
                <input class="input-text" id="user_email" name="user[email]" placeholder="email" size="30" type="email" value="">
              </div>
            </div>
            <div class="clearfix login-fields">
              <label for="user_password">Password</label>
              <div class="input login-inputs">
                <input class="input-text" id="user_password" name="user[password]" placeholder="password" size="30" type="password">
              </div>
            </div>
          </div>
          <div class="modal-footer">
            <input class="btn btn-primary login_btn" id="btn_login" name="commit" type="submit" value="Sign in">
            <a href="/lms/forgot_password" class="btn">Forgot password...</a>
            <a href="#" class="btn close cancel" data-dismiss="modal">Cancel</a>
          </div>
        </fieldset>
</form>

测试失败

it "should login correctly if the right credentials are given", :js => true do

    Capybara.default_wait_time = 5
    Capybara.reset_sessions!
    visit '/'
    click_link('login_link') #this will bring a modal window with the code posted above using js
    within("#login") do
      fill_in 'user_email', :with => "my-email@example.com"
      fill_in 'user_password', :with => "mypwd"
    end

    response.should have_selector('input#btn_login') #This passes
    click_on("input#btn_login") #Here it fails, saying it can't find an element with that selector
    response.should have_selector(:xpath, '//div[@class="alert-message block-message info"]')
  end

我的测试文件位于spec/requests

有什么想法吗? 谢谢!

10 个答案:

答案 0 :(得分:35)

请试试这个:

page.find("#btn_login").click

答案 1 :(得分:10)

这:https://stackoverflow.com/a/11348065/1504796

是正确的答案。

click_on不会使用CSS选择器,而是使用链接的文本或ID。你想要click_on("btn_login")。没有哈希标志或任何东西。

答案 2 :(得分:6)

find('#id',:visible => true).click

答案 3 :(得分:4)

尝试将“gem'stuny'”添加到您的Gemfile并放入 步骤文件中失败行之前的“save_and_open_page”行。

参考:http://techiferous.com/2010/04/using-capybara-in-rails-3/

答案 4 :(得分:4)

看起来你正试图点击某个模态css中的提交按钮。您需要首先调用模态元素的任何显示。

答案 5 :(得分:3)

我认为click_on不会采用这样的定位器 - 我认为它可能只需要一个id,名称或值。作为实验,尝试使用:

替换click_on(“input#btn_login”)

page.find( '#btn_login')。然后按

答案 6 :(得分:3)

  • click_button(&#34;登录&#34;)
  • find(:xpath,&#34; // * [@ id =&#39; btn_login&#39;]&#34;)。点击(或.trigger(&#39;点击&#39;))

如果其他方法失败,请通过控制台查看是否可以检查按钮是否存在:document.getElementById(&#34; btn_login&#34;)

答案 7 :(得分:2)

如果您知道链接文字,则可以使用page.find_link(text).click。 (source

答案 8 :(得分:1)

尝试在相关行之前添加save_and_open_page。这应该允许您查看页面以及可能阻止单击操作的任何错误。

答案 9 :(得分:1)

我使用带有铬的水豚

Capybara.register_driver :chrome do |app|   Capybara::Selenium::Driver.new(app, 
                                                           :browser => :chrome) 
end

Capybara.javascript_driver = :chrome

并安装chrome驱动程序:

brew install chromedriver

http://collectiveidea.com/blog/archives/2011/09/27/use-chrome-with-cucumber-capybara/