Мне нужно аутентифицировать мой клиент WebDriver для функциональных тестов.
Например, в моих интеграционных тестах я делаю что-то подобное:
namespace Tests\Controller;
use App\Entity\Donor;
use App\Entity\User;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Tools\SchemaTool;
use SebastianBergmann\Type\RuntimeException;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class DonorTest extends WebTestCase
{
private static $client;
/**
* @var EntityManager
*/
private $entityManager;
/**
* @var SchemaTool
*/
private $schemaTool;
public function __construct(?string $name = null, array $data = [], string $dataName = '')
{
parent::__construct($name, $data, $dataName);
static::ensureKernelShutdown();
if (!self::$client) {
self::$client = static::createClient([], [
'PHP_AUTH_USER' => 'Same Old User',
'PHP_AUTH_PW' => 'Same Old Password',
]);
}
$this->entityManager = self::bootKernel()
->getContainer()
->get('doctrine')
->getManager();
$this->schemaTool = new SchemaTool($this->entityManager);
/** Safeguard */
$connection = $this->entityManager->getConnection()->getParams();
if ($connection['driver'] != 'pdo_sqlite' || $connection['path'] != '/tmp/test_db.sqlite') {
throw new RuntimeException('Wrong database, darling ! Please set-up your testing database correctly. See /config/packages/test/doctrine.yaml and /tests/README.md');
}
}
Я просто прохожу учетные данные в параметрах, и это работает.
Но в моих функциональных тестах я использую WebDriver. Он не принимал учетные данные в аргументах:
<?php
namespace App\Tests\Functional\Entities\Donor;
use App\Entity\Donor;
use App\Tests\Functional\Helpers\Carrier\CarrierHelper;
use App\Tests\Functional\Helpers\Donor\DonorHelper;
use Doctrine\ORM\EntityManager;
use Facebook\WebDriver\WebDriverBy;
use Symfony\Component\Finder\Finder;
use Symfony\Component\Panther\PantherTestCase;
use Symfony\Component\Panther\Client;
class DonorTest extends PantherTestCase
{
/**
* @var EntityManager
*/
private $entityManager;
/**
* @var CarrierHelper
*/
private $helper;
/**
* @var Client
*/
private $client;
public function __construct(?string $name = null, array $data = [], string $dataName = '')
{
parent::__construct($name, $data, $dataName);
$this->entityManager = self::bootKernel()
->getContainer()
->get('doctrine')
->getManager();
$this->helper = new DonorHelper();
}
public static function setUpBeforeClass(): void
{
// Do something
}
public function setUp(): void
{
parent::setUp(); // TODO: Change the autogenerated stub
$this->client = Client::createChromeClient();
$this->client->manage()->window()->maximize();
}
Я не могу передать аргументы входа в систему в методе createChromeClient()
. Я думаю, что мне нужно играть с cookie-файлами в cookieJar или токене, но я не знаю как.
Не стесняйтесь спрашивать меня о моем методе идентификации, но я следовал документации: https://symfony.com/doc/current/security/form_login_setup.html
РЕДАКТИРОВАТЬ
Я только что попробовал что-то еще. Войдите в мой браузер, чтобы создать повара ie, и попытались изготовить другого с тем же PHPSESSID
public function setUp(): void
{
parent::setUp(); // TODO: Change the autogenerated stub
$this->client = Client::createChromeClient();
$this->client->manage()->window()->maximize();
$cookie = new Cookie('PHPSESSID', 'pafvg5nommcooa60q14nqhool0');
$cookie->setDomain('127.0.0.1');
$cookie->setHttpOnly(true);
$cookie->setSecure(false);
$cookie->setPath('/');
$this->client->manage()->addCookie($cookie);
}
Но получите эту ошибку:
Facebook \ WebDriver \ Исключение \ InvalidCookieDomainException: недопустимый повар ie домен
Домен хорош, как и мой веб-браузер. Я буду обновлять по мере продвижения моих расследований.
РЕДАКТИРОВАТЬ 2
ОК ... Понятно.
Согласно этой теме: Невозможно чтобы установить куки в Selenium Webdriver
Для настройки куки ['domain'], вы должны сначала запросить на домене, ТО настроить куки ie ...
ТАК, это почти работает:
public function setUp(): void
{
parent::setUp(); // TODO: Change the autogenerated stub
$this->client = Client::createChromeClient();
$this->client->manage()->window()->maximize();
$this->client->request('GET', 'http://127.0.0.1/randompage');
$handcookie = Cookie::createFromArray([
'name' => 'PHPSESSID',
'value' => 'pcvbf3sjlla16rfb1b1274qk01',
'domain' => '127.0.0.1',
'path' => '/'
]);
$this->client->manage()->addCookie($handcookie);
}
Следующий шаг: найдите способ создать постоянный повар ie без срока службы. Я думаю, что никто не будет читать это, но я буду обновлять его, если кто-то застрянет.