因此,我正在使用水豚编写验收测试。该方案是将我们的新闻通讯系统连接到外部邮件服务。
我们将重定向到我们的外部服务页面,以请求访问外部邮件服务。成功后,我们将被重定向回我们的系统页面。
When "I grant authorization" do
fill_in "username", :with => "myapp"
fill_in "password", :with => "secret"
click_button "Allow Access"
end
Then "I should see 'Connection Established'" do
page.should have_content "Connection Established"
end
And "I should see that I'm connected to Sample External Service" do
page.should have_content "Connection Established: Sample External Service"
page.should have_content "Deactivate Sample External Service syncing"
end
但是如果我不在sleep
之前使用page.should have_content "Connection Established"
。规格将失败。据我了解,使用睡眠不是最佳做法,因为这会使我们的测试运行缓慢。
如何使其等待重定向到我们的系统
答案 0 :(得分:1)
有3种方法可以调整Capybaras方法等待其期望为真/元素存在的最大时间
Capybara.default_max_wait_time = <seconds>
-这是全局设置,对于绝大多数方法调用,应该将其设置得足够高
Capybara.using_wait_time(<seconds>) do ... end
-这会临时更改块中的default_max_wait_time
,然后在完成后将其恢复为原始设置。当您有许多要使用新的等待时间来调用的方法,或者需要将等待时间设置为不同的值来调用帮助器方法时,这很有意义。
:wait
选项-所有的水豚发现者和期望方法都接受:wait
选项,这将更改该方法调用的最大等待时间。当您遇到需要比正常情况多等待的特定案例时,使用此选项很有意义
# This will wait up to 10 seconds for the content to exist in the page
page.should have_content "Connection Established: Sample External Service", wait: 10
注意:将来发布问题时,如果您提供作为问题一部分的完整准确的错误消息,通常会很有帮助。
答案 1 :(得分:0)
在特殊情况下,您可以使用Capybara.using_wait_time(seconds)临时更改Capybara.default_max_wait_time
的值:
Capybara.using_wait_time(10) do
page.should have_content "Connection Established"
end
答案 2 :(得分:0)
对于页面转换,我想先等待URL更改,然后再等待页面上的内容。如果重定向失败,它将给您一个更具体的错误,并且自然地将漫长的等待分为两个部分。有两次机会击中default_max_wait_time
,超时可能会加倍,而无需实际更改。如果还不够,您随时可以使用have_current_path
参数向wait:
传递自定义超时。
expect(page).to have_current_path("externalservice.com")
expect(page).to have_content("Connection Established")
可能有一个page.should
等效项,但是我认为official guidance会改用expect
语法,因为不推荐使用should
语法。
答案 3 :(得分:0)
您可以使用capybara_watcher
gem,这是等待pege
内容更改的一种优雅方法。
Check it out on RubyGems.org
示例:
wait_until_content_has "Connection Established" do |text|
page.should have_content text
end
使用此功能的好处是,睡眠时间是页面进行更改所花费的实际时间,您可以将其配置为在您选择页面不变的第二秒后退出。
答案 4 :(得分:0)
我对类似问题的解决方案:
module WaitUntil
def wait_until(max_wait_time = Capybara.default_max_wait_time)
Timeout.timeout(max_wait_time) do
sleep(0.2) until yield
end
end
end
使用:
wait_until { page.has_css?('li', text: 'test', visible: true) }