Symfony2功能测试InvalidArgumentException:当前节点列表为空

时间:2012-02-27 17:59:17

标签: symfony phpunit functional-testing

我得到" InvalidArgumentException:当前节点列表为空。"通过PHPUnit运行功能测试。这是我写的测试:

public function testAdd()
{
    $client = static::createClientWithAuthentication('main');

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

    $send_button = $crawler->selectButton('submit');

    $form = $send_button->form(array(
        'PrCompany[email]' => 'test@example.ua',
        'PrCompany[first_name]' => 'Anton',
        'PrCompany[last_name]' => 'Tverdiuh',
        'PrCompany[timezone]' => 'Europe/Amsterdam'
    ));

    $form['PrCompany[companies][1]']->tick();

    $client->submit($form);


    $this->assertTrue($crawler->filter('html:contains("User is invited")')->count() > 0);

}

7 个答案:

答案 0 :(得分:12)

您可以使用var_dump($client->getResponse()->getContent());

调试问题

另外,我认为你应该这样写:

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

否则,您将在提交表单之前测试第一个网址的响应。

答案 1 :(得分:6)

我也在努力解决这个问题,似乎selectButton方法触发了此错误。

在阅读DOM Crawler docs之后,我发现selectButton方法将实际的按钮文本作为字符串参数。因此,如果您的按钮是“请提交我的表格”,那将是您的文字。

它也需要不同的参数,如下所示(取自文档)

A selectButton() method is available on the Crawler which returns another 
Crawler that matches a button (input[type=submit], input[type=image], 
or a button) with the given text.

修改

在最终成功完成测试后,我还建议您按照此示例来测试表单:

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://github.com/login');

$form = $crawler->selectButton('Log in')->form();
$form['login'] = 'symfonyfan';
$form['password'] = 'anypass';

$crawler = $client->submit($form);
$this->assertTrue($crawler->filter('html:contains("Welcome Back")')->count() > 0);

主要区别在于,我使用了Goutte软件包,我使用the packagist中的作曲家安装了该软件包(在我的情况下,我添加了"fabpot/goutte": "1.0.*@dev"

答案 2 :(得分:2)

作为@ greg0ire所写内容的后续内容,请查看是否

var_dump($client->getResponse()->getContent());

返回重定向页面而不是实际内容。如果是这样,您可以添加:

$client->followRedirects(true);

答案 3 :(得分:1)

我看到问题仍然没有答案。我遇到了同样的问题。

在我的情况下,goutte无法执行此请求,因为输入名称已被javascript动态更改。

当goutte收到html时,它看到了一个表单。当使用预先填充的参数提交时,表单输入元素无法与$form->setValues($params)匹配,因此抛出了InvalidArgumentException。

通过手工提出要求解决。

// $form->setValues($data);
// $this->getGoutte()->submit($form);

$data = array(
    'input_name[key]' => 'value'
);
$this->getGoutte()->request($form->getMethod(), $form->getUri(), $params);

答案 4 :(得分:0)

您可以尝试将Codeception与Symfony2模块一起使用。它为Symfony2功能测试提供了灵活的接口,并具有更好的调试功能。

答案 5 :(得分:0)

当抓取工具找不到请求的表单元素时,会发生此错误;例如,当您使用表单构建器时,它会非常棘手,它将创建不同的输入名称:

$form = $this-> createFormBuilder($store)
           ->add('storeNumber','text')
           ->add('storeName','text')
           ->add('save', 'submit')
           ->getForm(); 

将输出字段名称,如:

form_storeNumber

应该在测试类中使用:

$form=$crawler->selectButton('save')->form();
$form['form_storeNumber']='10';

答案 6 :(得分:0)

我遇到了与Silex应用程序相同的问题。我在寻找

$buttonCrawler = $crawler->selectButton('input[type="submit"]');

相反,正确的方法是给出按钮的

$buttonCrawler = $crawler->selectButton('value_of_the_button');


例如,在您的页面中:

<form>
    ...
    <input type="submit" value="Click Me">
</form>


在你的测试中:

$buttonCrawler = $crawler->selectButton('Click Me');
$form = $buttonCrawler->form();
...