使用Behat

时间:2016-06-09 21:26:14

标签: selenium symfony behat mink

我想创建一个behat定义来使用cookie验证用户。

the behat scenario上没有@javascript标记时,它适用于Behat BrowserKitDriver 。 但是当@javascript标记为like here时,它无法与Behat Selenium2Driver 一起使用。

我使用the symfony-demo application for demonstrate my tests

我的定义有什么问题?

/**
 * @Given I am logged in as :username
 */
public function iAmLoggedInAs($username)
{
    $driver = $this->getSession()->getDriver();
    $session = $this->kernel->getContainer()->get('session');
    $user = $this->kernel->getContainer()->get('security.user.provider.concrete.database_users')->loadUserByUsername($username);
    $providerKey = 'secured_area';

    $token = new UsernamePasswordToken($user, null, $providerKey, $user->getRoles());
    $session->set('_security_'.$providerKey, serialize($token));
    $session->save();

    if ($driver instanceof BrowserKitDriver) {
        $client = $driver->getClient();
        $cookie = new Cookie($session->getName(), $session->getId());
        $client->getCookieJar()->set($cookie);
    } else if ($driver instanceof Selenium2Driver) {
        $this->visitPath('/');
    } else {
        throw new \Exception('Unsupported Driver');
    }

    $this->getSession()->setCookie($session->getName(), $session->getId());
}

我只是希望my last behat test有效 我不知道我是否清楚......如果没有问。

如果您可以使用修复程序执行Pull Request,那将是完美的。

2 个答案:

答案 0 :(得分:1)

你有几种方法

选项1.只需使用Mink

  • 如果您使用 Mink ,您的上下文将扩展RawWebContextWebContext,以便您可以使用getSession()访问Mink会话。

  • 然后,使用setCookie

正如您所看到的,幸运的是,对于我们来说,这是与Mink合作的重点,Cookie Manipulationsupported by many drivers

// ...
$this->visitPath('/');
$this->getSession()->setCookie(
    $session->getName(),
    $session->getId()
);

注1:请注意,以下内容不一样:

注意2:想要查看您的Cookie?

var_dump($driver->getClient()->getCookieJar());

选项2.访问Selenium2会话

请不要犹豫,深入了解Selenium2 WebDriver Session的工作原理。

你一定会找到absolute joy and peace of mind

else if ($driver instanceof Selenium2Driver) {
      $this->visitPath('/');
      $cookie =  array(
           "domain" => "", <----- You can even add your domain here 
           "name" => $session->getName(), 
           "value" => $session->getId(),
           "path" => "/",
           "secure" => False
      );
      $driver->getWebDriverSession()->setCookie($cookie);
} 

注3:想看看你的cookies?

var_dump($driver->getWebDriverSession()->getAllCookies());

答案 1 :(得分:0)

在这里,您使用的代码可自动作为USER进行身份验证。这样可以节省大量时间(无论如何都应该在另一个功能文件中进行登录测试):

将示例场景放入YOUR_FILE.feature示例文件中:

  Scenario: List Backend Products
    Given I auto authenticate as "YOUR_USER_NAME"
    Then  I go to "http://YOUR_SITE/backend/products"
    Then  I should see "Backend Products Management"

 /**
 * @Given /^I auto authenticate as "([^"]*)"$/
 */
public function iAutoAuthenticateAs($userName)
{
    $user = $this->getContainer()->get('fos_user.user_manager')->findUserByUsername($userName);
    $providerKey = $this->getContainer()->getParameter('fos_user.firewall_name');
    $token = new UsernamePasswordToken($user, null, $providerKey, $user->getRoles());

    $context = $this->getContainer()->get('security.token_storage');
    $session = $this->getContainer()->get('session');

    $context->setToken($token);
    $session->set('_security_'.$providerKey, serialize($token));
    $session->save();

    $this->getSession()->setCookie($session->getName(), $session->getId());
}