Capybara测试页面跳转后读取旧页面内容的问题排查与解决
Capybara测试页面跳转后获取旧内容的问题解决
问题场景
在Ruby on Rails应用中,homescreen.haml页面的Add按钮点击后会跳转到addscreen.haml页面。使用Capybara+Selenium编写测试验证h1标题变更时,浏览器确实打开了新页面并显示正确标题,但测试始终获取旧页面的内容,报错:
RSpec::Expectations::ExpectationNotMetError: expected to find text "Add member" in "Home"
原因分析
问题出在homescreen.haml中Add按钮的链接属性:
= link_to addscreen_path, class: 'button-link', target: '_blank', method: :post do %span Add
其中target="_blank"会让链接在新浏览器标签页中打开,但Capybara默认会停留在原来的标签页,不会自动切换到新标签页。因此测试代码仍在旧标签页中查找元素,自然获取到的是旧页面的"Home"标题。
解决方法
方法一:移除target="_blank"(推荐)
如果不需要在新标签页打开页面,直接移除该属性,让页面在当前标签页跳转,Capybara会自动跟随页面跳转,无需额外修改测试代码:
# homescreen.haml 修改后的Add链接 = link_to addscreen_path, class: 'button-link', method: :post do %span Add
方法二:手动切换到新标签页(保留target="_blank"时使用)
如果业务需要保留新标签页打开的行为,需要在测试代码中手动切换到新打开的标签页:
# 修改When步骤,添加标签页切换逻辑 When(/^I (?:click|have clicked) the add button$/) do original_window = page.current_window click_link_or_button('Add') # 切换到最后打开的新窗口 page.switch_to_window(page.windows.last) end # 可选:测试完成后切回原窗口(若后续测试需要) Then(/^I will see the add member screen$/) do expect(find('body > h1')).to have_text('Add member') page.switch_to_window(original_window) end
补充说明
Capybara的window_opened_by方法也可以用来捕获新窗口,写法如下:
When(/^I (?:click|have clicked) the add button$/) do new_window = window_opened_by { click_link_or_button('Add') } switch_to_window new_window end
内容的提问来源于stack exchange,提问作者Hywel Griffiths
相关产品推荐
相关产品推荐

