Symfony Panther:无法使用表单登录

时间:2018-12-29 21:00:54

标签: php symfony authentication symfony-panther

我正在用Symfony Panther测试一个应用程序。我要登录的用户未提供匿名条件下的元素。这是我的测试课:

namespace App\Tests\Functional;

use Symfony\Component\Panther\PantherTestCase;

class SecurityControllerTest extends PantherTestCase
{
    public function testConnexion()
    {
        $client = static::createPantherClient('127.0.0.1', '9001');

        $crawler = $client->request('GET', '/connexion');

        $form = $crawler->selectButton('Se connecter')->form();
        $form['_email'] = 'email@domain.com';
        $form['_password'] = 'password';

        $crawler = $client->submit($form);

//        $link = $crawler->filter('a:contains("Déconnexion")')->link();
//        $crawler = $client->click($link);

        $link = $crawler->selectLink('Déconnexion');
        $link->click();
        $this->assertSame(self::$baseUri.'/', $client->getCurrentURL());
    }
}

关联的模板(connexion.html.twig):

{% extends "layout.html.twig" %}

{% block page_title 'Login' %}

{% block final_javascripts %}
    {{ encore_entry_script_tags('sendCredentials') }}
{% endblock %}


{% block content %}

        (...)

            <div class="row mt-4">
                <div class="col-md-6">
                    <form id="connexion-form" action="{{ path('security_connexion') }}" method="post">
                        <div class="form-group">
                            <label for="email">Email</label>
                            <input type="text" id="email" name="_email" class="form-control">
                        </div>

                        <div class="form-group">
                            <label for="password">Mot de passe</label>
                            <input type="password" id="password" name="_password" class="form-control">
                        </div>

                        <button type="submit" class="btn btn-primary button">Se connecter</button>
                    </form>
                </div>

            </div>
        </div>
    </div></div>
{% endblock %}

还有代表导航栏的_nav.html.twig模板:

<nav class="navbar navbar-expand-lg navbar-light bg-light">
    <div class="container">
        <a class="navbar-brand" href="{{ path("index") }}"><img src="{{ asset("images/temporary-logo.png") }}" alt="shinigami-laser-logo" style="max-height: 60px;"></a>
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>

        (...)

            {% if is_granted('IS_AUTHENTICATED_FULLY') %}


                {% if is_granted('ROLE_USER') %}
                    <li>
                        <a href="{{ path('logged_infos') }}" class="nav-link  shogun-link">Mes infos</a>
                    </li>
                    <li>
                        <a href="#" class="nav-link  shogun-link">Gerer mes cartes</a>
                    </li>
                    <li>
                        <a href="#" class="nav-link  shogun-link">Mes stats</a>
                    </li>
                {% endif %}
                <li class="nav-item">
                    <a class="nav-link  shogun-link" href="{{ path('security_deconnexion') }}">Déconnexion</a>
                </li>
            {% else %}
                <li class="nav-item">
                    <a class="nav-link  shogun-link" href="{{ path('user_enregistrement') }}">S'enregistrer</a>
                </li>

                <li class="nav-item">
                    <a class="nav-link  shogun-link" href="{{ path('security_connexion') }}">Se connecter</a>
                </li>
            {% endif %}
                </ul>
        </div>
    </div>
</nav>

在开发模式下,用户可以使用导航栏中的Déconnexion链接进行身份验证和注销。 但是命令php bin/phpunit tests/Functional/SecurityControllerTest.php表示:InvalidArgumentException: The current node list is empty.指向此行:$link->click();揭示了Déconnexion链接不可见。 该用户未登录吗? 如何解决该问题并访问已认证用户提供的元素,例如Déconnexion链接?

1 个答案:

答案 0 :(得分:0)

试试这些方法:

$crawler->selectButton('.btn-primary');
$crawler->executeScript("document.querySelector('.btn-primary').click()");

https://symfony.com/doc/current/components/dom_crawler.html#forms