【问题标题】:How to check page content after button click correctly?正确单击按钮后如何检查页面内容?
【发布时间】:2016-05-19 16:35:07
【问题描述】:

我想检查单击“登录”按钮后是否加载了正确的页面。

users_spec.rb

before :each do
  user = User.create(:email => 'admin@cm.com', :password => '123')
end

it "signs me in" do
  visit '/users/sign_in'
  within("#new_user") do
    fill_in 'Email', :with => 'admin@cm.com'
    fill_in 'Password', :with => '123'
    click_button 'Sign in'
  end
  expect(page).to have_content '#{user.name}' 
end

expect(page).to have_content 'Dashboard' 检查表单所在的同一页面上是否有 user.name 字样。那么,click_button 有什么意义呢?如何让它检查页面上应该在 click_button 之后加载的内容?顺便说一句,如何正确命名此类测试? 抱歉,如果这是一个愚蠢的问题,我是 rspec 的新手:c

谢谢!

【问题讨论】:

    标签: ruby-on-rails rspec capybara


    【解决方案1】:

    您必须选择用户登录后出现在页面上的一些内容。您的应用是否会显示一条消息,例如“您现在已登录”,如果可以的话,您可以这样做

    expect(page).to have_content("You are now logged in")
    

    如果没有,它会在标题栏中显示用户名吗?然后你可以做类似的事情

    expect(page).to have_css("header", text: user.name)

    等... 关键是您要搜索的任何内容都需要出现在下一页上,而不是出现在带有表单的页面上。在这两种情况下,Capybara 将等待最多 Capybara.default_max_wait_time 秒,同时重试查找文本(假设您使用的是机架测试以外的驱动程序),这应该给下一页加载时间。如果您使用的是 rack-test 驱动程序,那么没有 JS 或异步支持,click_button 应该已经提交了一个表单,并且在加载下一页之前,expect 不会执行。

    至于测试命名 - 将其命名为对您有意义的名称,以便您知道一年后它在做什么。

    【讨论】:

    • 如果我写 expect(page).to have_content("You are now logged in"),即使有 dusc 消息,测试也不会通过。但是只有当我从 sign_in 表单所在的内容中检查 smth 时测试才会通过。这不一定是关于 user.name。如果登录后页面有'Hello',如果sign_in表单所在页面没有这个词,expect(page).to have_content("Hello")不通过。这就是问题所在,我不明白为什么要使用 button_click,如果测试在这个按钮所指的页面上不起作用或者我做错了什么(
    • 你做错了——当你点击按钮时应用程序实际上没有登录,或者你没有检查下一页上存在的文本——你的测试日志应该显示你提出的实际要求。由于您是 rspec 和 capybara 的新手,我假设您使用的是 rack-test 驱动程序,它不支持 JS - 如果 JS 被禁用或者它是否需要 JS 工作,您的应用程序是否实际登录 - 如果是这样,您将需要使用 Capybaras 其他驱动程序之一
    猜你喜欢
    • 2011-12-24
    • 1970-01-01
    • 2012-11-25
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 2016-10-16
    • 2022-08-14
    相关资源
    最近更新 更多