我想创建一个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,那将是完美的。
答案 0 :(得分:1)
如果您使用 Mink ,您的上下文将扩展RawWebContext
或WebContext
,以便您可以使用getSession()
访问Mink会话。
然后,使用setCookie。
正如您所看到的,幸运的是,对于我们来说,这是与Mink合作的重点,Cookie Manipulation是supported by many drivers
// ...
$this->visitPath('/');
$this->getSession()->setCookie(
$session->getName(),
$session->getId()
);
注1:请注意,以下内容不一样:
$session
(参见您的问题)是Symfony\Component\HttpFoundation\Session\Session
$this->getSession()
返回Behat\Mink\Session
注意2:想要查看您的Cookie?
var_dump($driver->getClient()->getCookieJar());
请不要犹豫,深入了解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());
}