2014-03-19 2 views
4

Behat/Mink를 사용하여 "remember me"기능을 테스트하려고합니다. 여기Behat에서 쿠키를 보관하는 브라우저를 다시 시작하는 방법은 무엇입니까?

Scenario: A user logs in ticking "Remember me". As he closes his browser and visits back the site, he should be automatically logged in 
    Given I am on "/login" 
    Then I should see "Site Login" 
    When I fill in "Username" with "test" 
    And I fill in "Password" with "test" 
    And I check "Remember me" 
    When I press "Login" 
    Then I should see "Welcome" 
    When I restart the browser 
    Then I go to "/login" 
    Then I should see "Welcome" 

브라우저를 다시 시작에 대한 정의 것 : 여기 내 시나리오의 나는 또한 쿠키는 브라우저 재시작시 삭제되기 때문에 문제가

$this->getSession()->reset();을 시도

/** 
* @When /^I restart the browser$/ 
*/ 
public function iRestartTheBrowser() 
{ 
    $this->getSession()->restart(); 
} 

에서, "기억 나 "기능이 더 이상 작동하지 않습니다. 쿠키를 삭제하지 않고 밍크에서 재시작 할 수있는 방법이 있습니까?

답변

3

당신 수 나중에 세션 set it back를 다시 시작하기 전에 get a cookie : 나는 브라우저를 닫 테스트를 가능하게하는 새로운 기능을 추가하여이 문제를 해결 한

$cookie = $session->getCookie('remember_me'); 

$session->restart(); 

// I'm not sure if visiting a page before setting a cookie is actually needed 
// after restarting the session. 
// It's definitely needed when setting a cookie before the first request 
// (to set the cookie domain). 
$session->visit('/') 

$session->setCookie('remember_me', $cookie); 
+0

정말 멋졌습니다. 감사 :) –

1

.

/** 
* @When /^I close the browser$/ 
*/ 
public function iCloseTheBrowser(){ 
    $this->getSession()->getDriver()->stop(); 
} 

이 기능의 단계는 다음과 같습니다 : 그것은 닫고 브라우저를 재개하고 명시 적으로 유효 기간이있는 모든 쿠키를 다시 설정하기 전에 모든 쿠키를 얻을 수 있습니다 할

... 
When I close the browser 
And I am on the "My" page 
Then I should see "Logged: icon 
... 
0

한 가지 방법. 트릭은 webdriver 세션이 값이 아니라 쿠키 (경로, 만료 날짜 등)에 대한 모든 것을 반환하므로 일반 밍크 세션이 아닌 selenium webdriver 세션을 사용하여 쿠키를 얻는 것입니다. 내 컨텍스트의 코드는 다음과 같습니다.

/** @When I restart the browser */ 
public function iRestartTheBrowser() 
{ 
    /** @var Selenium2Driver $driver */ 
    $driver = $this->getSession()->getDriver(); 
    /** @var \WebDriver\Session $session */ 
    $seleniumSession = $driver->getWebDriverSession(); 
    $cookies = $seleniumSession->getAllCookies(); 

    $minkSession = $this->getSession(); 
    $minkSession->restart(); 

    //The following is necessary - as the cookies can only be set after 
    //you're already on the domain - this can be any page, even an error page 
    $minkSession->visit($this->getMinkParameter('base_url')); 

    $seleniumSession = $driver->getWebDriverSession(); 
    foreach ($cookies as $cookie) { 
     if (isset($cookie['expiry'])) { 
      $seleniumSession->setCookie($cookie); 
     } 
    } 
}