2014-03-19 68 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); 
     } 
    } 
} 
相关问题