尝试从symfony2抓取工具中选择表单时出错?

时间:2013-07-13 04:10:13

标签: php unit-testing testing symfony phpunit

我一直收到以下错误:

There was 1 error:

1) Caremonk\MainSiteBundle\Tests\Controller\SecurityControllerFunctionalTest::testIndex
InvalidArgumentException: The current node list is empty.

但是当我导航到localhost / login时,我的表单会填充正确的内容。这句话说......

$form = $crawler->selectButton('login')->form();

导致错误。我的考试有什么问题?

功能测试:

<?php

namespace Caremonk\MainSiteBundle\Tests\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class SecurityControllerFunctionalTest extends WebTestCase
{
    public function testIndex()
    {
        $client = static::createClient();

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

        $form = $crawler->selectButton('login')->form();
        $form['username'] = 'testActive';
        $form['password'] = 'passwordActive';
    }
}

Twig视图:

{# src/Acme/SecurityBundle/Resources/views/Security/login.html.twig #}
{% if error %}
    <div>{{ error.message }}</div>
{% endif %}

<form action="{{ path('caremonk_mainsite_login_check') }}" method="post">
    <label for="username">Username:</label>
    <input type="text" id="username" name="_username" value="{{ last_username }}" />

    <label for="password">Password:</label>
    <input type="password" id="password" name="_password" />

    {#
        If you want to control the URL the user is redirected to on success (more details below)
        <input type="hidden" name="_target_path" value="/account" />
    #}

    <button type="submit">login</button>
</form>

4 个答案:

答案 0 :(得分:17)

Vineet的答案是正确的但是......在我看来,从按钮采取形式并不是一个好主意。 更好的尝试:

$crawler->filter('form[name=yourAwesomeFormName]')->form();

或更改类,ID等的名称。在一个视图上可以有超过1个具有相同提交值的表单

答案 1 :(得分:7)

开始在symfony2中进行功能测试,发现你的问题没有答案,所以我们走了,

selectButton方法将实际按钮文本作为字符串参数。因此,如果您的按钮是“请提交我的表格”,那将是您的文字。

$form = $crawler->selectButton('submit my form please')->form();

通过安德鲁Stackoverflow

查看答案

答案 2 :(得分:0)

selectButton()为图片选择namealt值的按钮。

答案 3 :(得分:0)

好的,这就是为什么我有这个错误以及我是如何解决它的。

(使用Goutte) 爬虫就像一个带GET的浏览器。

所以,在做的时候:

$client = new Client();
$crawler = $client->request('GET', '/login');

抓取工具正在尝试访问http://localhost/login

所以,基本上,我把它改为:

$client = new Client();
$crawler = $client->request('GET', 'http://site.dev/app_dev.php/login');

site.dev 是我的symfony项目的虚拟主机。

希望它有所帮助!