【问题标题】:How to restart the browser keeping the cookies in Behat?如何重新启动将 cookie 保存在 Behat 中的浏览器?
【发布时间】:2014-03-19 05:35:10
【问题描述】:

我正在尝试使用 Behat/Mink 测试“记住我”功能。这是我的场景:

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();

问题是由于浏览器重启后cookies被删除,“记住我”功能不再起作用。有什么方法可以在不清除 cookie 的情况下在 mink 中重新启动?

【问题讨论】:

    标签: session-cookies behat remember-me mink


    【解决方案1】:

    一种方法是在关闭和重新打开浏览器之前获取所有 cookie,然后设置所有具有明确过期日期的 cookie。诀窍是使用 selenium webdriver session 而不是通用 mink session 获取 cookie,因为 webdriver session 返回 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);
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以在重新启动会话之前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);
      

      【讨论】:

        【解决方案3】:

        我已经通过添加新功能使测试关闭浏览器解决了这个问题。

        /**
         * @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
        ...
        

        【讨论】:

          猜你喜欢
          • 2017-02-02
          • 2019-05-31
          • 2011-09-20
          • 1970-01-01
          • 1970-01-01
          • 2018-05-19
          • 2020-12-11
          • 2019-09-07
          • 1970-01-01
          相关资源
          最近更新 更多