2014-03-19 56 views
4

我正在嘗試使用Behat/Mink測試「記住我」功能。這裏是我的情況:如何重新啓動瀏覽器在Behat中保存cookie?

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" 

下面是重新啓動瀏覽器的定義:

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

我也曾嘗試$this->getSession()->reset();

問題是因爲Cookie是在瀏覽器重啓刪除,「記得我「功能不再有效。有沒有辦法在不清除cookie的情況下重啓貂皮?

回答

3

你可以get a cookie重新啓動會話和set it back事後才:

$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

一種方式來做到這一點是關閉並重新打開瀏覽器,然後設置回所有這些有明確到期日的cookie前得到所有的cookies。訣竅是使用selenium webdriver會話來獲取cookie,而不是通用的mink會話,因爲webdriver會話返回cookie(路徑,到期日期等)的所有內容,而不僅僅是值。在我的上下文中的代碼如下所示:

/** @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); 
     } 
    } 
} 
相關問題