Держите сеанс открытым — капибара/огурец

У меня есть функция, для запуска которой требуется более 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 ...

Итак, мой вопрос: как я могу закончить сценарий, а затем просто щелкнуть другую ссылку на моем сайте, а затем выполнить следующий сценарий?

Спасибо


person Richlewis    schedule 15.05.2015    source источник


Ответы (2)


Это хороший пример использования функции Background. огурца.

Если вы заставите пользователя войти в систему внутри фонового тега, он будет входить в систему для всех последующих сценариев.

person Dan    schedule 15.05.2015
comment
спасибо, если я не ошибаюсь, хотя The background is run before each of your scenarios but after any of your Before Hooks. так что он все равно будет запускаться несколько раз? - person Richlewis; 15.05.2015
comment
Ах да, я неправильно прочитал! У вас потенциально может быть шаг, который запускает другую группу шагов github. com/cucumber/cucumber/wiki/ Итак, после входа в систему есть шаги, которые запускают каждый из шагов разных сценариев. Хотя должен быть лучший подход - person Dan; 15.05.2015

Оказывается, после прочтения Документации по полтергейсту я мог реализовать простое решение

Вот что я придумал:

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 на основе последнего сеанса и получить доступ к странице, которая мне нужна в моем приложении, используя те же учетные данные, что и если бы я залогинился.

person Richlewis    schedule 18.05.2015