保持会话开放 - Capybara / Cucumber

时间:2015-05-15 14:14:03

标签: ruby session cucumber capybara

我有一项功能需要运行超过100个场景,第一步是登录我的应用程序。这通常使用Before挂钩和After挂钩来处理,它会将您注销。这使我的测试彼此独立,对我来说通常是一个好主意。但是在这种情况下,我只想登录我的应用程序,运行所有方案并注销。

我似乎遇到了会话问题,因为在方案完成后我被重定向到about:blank并且我的会话被终止。

我已经尝试了

class Capybara::Selenium::Driver < Capybara::Driver::Base
def reset!
# Use instance variable directly so we avoid starting the browser just to reset the session
if @browser
  begin
    #@browser.manage.delete_all_cookies <= cookie deletion is commented out!
  rescue Selenium::WebDriver::Error::UnhandledError => e
    # delete_all_cookies fails when we've previously gone
    # to about:blank, so we rescue this error and do nothing
    # instead.
  end
  @browser.navigate.to('about:blank')
end
end
end

但是我在控制台中得到了以下错误

expected not to find xpath "/html/body/*", found ...

所以我的问题是如何完成一个场景,然后只需点击我网站中的另一个链接,然后进行下一个场景

由于

2 个答案:

答案 0 :(得分:0)

这是一个很好的例子,说明何时使用Cucumber的Background功能是个好主意。

如果您让用户在后台标记内登录,他们将在所有后续方案中登录。

答案 1 :(得分:0)

希望这会在类似的情况下帮助其他人,但在阅读Poltergeist Docs之后我才能实现一个简单的解决方案

这就是我想出来的

Given(/^I setup the form with the correct template \- benchmarking$/) do
  if !defined? $i == true
    login_to_app
  elsif page.current_url == "about:blank"
    options = { domain: 'mydomain',
                httponly: true, 
                name: 'name',
                path: '/',
                secure: true
              }
   page.driver.set_cookie("name", $session_cookie, options)
   page.visit('url')
  end
   click_link('mylink')
   wait_for_ajax
end

Then('This is my final step')
  $i = 1
  $session_cookie = page.driver.cookies["PHPSESSID"].value
end

所以在第一次迭代中$i没有定义所以我可以登录,第二种情况它被定义,这意味着我可以根据最后一个会话设置cookie信息并访问我需要的页面我的应用程序使用与我登录时相同的凭据。