Symfony, PHPUnit: аутентификация клиента веб-драйвера - PullRequest
0 голосов
/ 18 февраля 2020

Мне нужно аутентифицировать мой клиент 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 без срока службы. Я думаю, что никто не будет читать это, но я буду обновлять его, если кто-то застрянет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...