Rspec 当第一个页面与第二个页面具有相同字段时,等待第二个页面加载Capybara的正确方法

Rspec 当第一个页面与第二个页面具有相同字段时,等待第二个页面加载Capybara的正确方法,rspec,capybara,rspec2,Rspec,Capybara,Rspec2,我对访问两个表单的规范有一个问题,这两个表单上都有相同字段的电子邮件。如果我没有手动睡眠,水豚似乎会在测试的第二部分的第一次访问中找到电子邮件字段 # visit the first form and fill out a subscription visit new_front_form_subscription_path(@web_form_1.id) fill_in "Email", with: "subscriber@example.com" fi

我对访问两个表单的规范有一个问题,这两个表单上都有相同字段的电子邮件。如果我没有手动睡眠,水豚似乎会在测试的第二部分的第一次访问中找到电子邮件字段

# visit the first form and fill out a subscription
visit new_front_form_subscription_path(@web_form_1.id)
fill_in "Email", with: "subscriber@example.com"
fill_in "Field 1", with: "my first data"
click_button "Subscribe"

# visit the second form and fill out a subscription
visit new_front_form_subscription_path(@web_form_2.id)
sleep 1
fill_in "Email", with: "subscriber@example.com"
fill_in "Field 2", with: "my second data"
click_button "Subscribe"
有了睡眠,天赋就能顺利通过。在没有睡眠的情况下,第二次表单提交会得到一个验证错误——将其归咎于空白的电子邮件值


有没有合适的方法来处理这个问题?我不喜欢在规范中引入手动休眠。

以下是几种解决方法:

使用仅出现在第二页的其他定位器选择电子邮件字段:

find('#second_page #email').set('subscriber@example.com')
编写一条语句,等待加载第二页而不是休眠:

visit new_front_form_subscription_path(@web_form_2.id)
expect(page).to have_css('locator_present_only_at_second_page')
fill_in "Email", with: "subscriber@example.com"

如果您求助于上面Andrey的2,您可能希望签出,这将允许您编写一个等待加载元素的块,然后在该元素加载后移动到fill_in方法。

通常,可以这样做。例如,要单击在加载模式弹出窗口或其他页面后找到的按钮,请将以下块添加到宏文件中

def wait_until_modal
   page.has_css?('.modal')
end

在弹出页面的上可以找到class.modal

上述答案是正确的,但如果您有一个大型测试套件,则很难实现,因为您必须在每个页面上找到唯一的元素。如果你是迈克尔·哈特尔铁路学院的毕业生,有一个简单的方法来解决这个问题。Hartl教授为每个控制器操作设置不同的@title实例变量。然后在application.html.erb中使用它为每个页面设置html标题元素

我当然这样做了,而且它提供了一种非常简单的方法来修复所有由于页面未正确加载而失败的测试。找不到标题标记,因为它不可见。因此,我所做的是将下面的代码放在application.html.erb的底部

<%= content_tag :div, "[#{title}]", class: 'rspec_eyes_only' if Rails.env.test? %>
我已经有另一个助手来测试正确的标题,所以我将其修改为添加wait_for_page_load,即

这些简单的更改几乎清除了我所有的薄弱测试。

尝试添加,等待:10到新页面加载后的第一行:

visit new_front_form_subscription_path(@web_form_2.id)
fill_in "Email", with: "subscriber@example.com", wait: 10 # <--
我只是遇到了类似的情况:

visit promo_path
fill_in 'promo_code', with: 'HALFPRICEPROMO'
click_button 'Activate' # onClick does things and eventually loads the next page
assert page.has_content? 'Confirm your email address', wait: 10 # <--
没有上述等待,任何和所有断言都会失败。我投了10分,让它更加安全;对于我的情况来说,3似乎是最低限度的


我在这里找到了答案:

使用SitePrism,您可以使用wait\u until\u true来测试当前的url


这有点笨拙,但可能是最好的方法。谢谢你的回复!也许我弄错了,但是如果第二个页面还没有加载,expect行不可能失败吗?@AceofBastgreeg几乎所有的水豚方法都会自动等待,包括rspec匹配器-酷!促使我读到:等价于e=HoldOn.untiltimeout:60,间隔:5{s.first:css,divburst}是e=find'divburst',wait:60,match::first。Holdon gem完全没有必要。但我不想通过:匹配参数:找到“DivBudd”,等等:60
visit new_front_form_subscription_path(@web_form_2.id)
fill_in "Email", with: "subscriber@example.com", wait: 10 # <--
visit promo_path
fill_in 'promo_code', with: 'HALFPRICEPROMO'
click_button 'Activate' # onClick does things and eventually loads the next page
assert page.has_content? 'Confirm your email address', wait: 10 # <--
new_path = new_front_form_subscription_path(@web_form_2.id)
visit new_path
wait_until_true { current_url.include? new_path }
fill_in "Email", with: "subscriber@example.com"
fill_in "Field 2", with: "my second data"
click_button "Subscribe"