Функциональное тестирование Symfony2 InvalidArgumentException: текущий список узлов пуст - PullRequest
11 голосов
/ 27 февраля 2012

Я получаю «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 ]

12 голосов
/ 27 февраля 2012

Вы можете отладить проблему, используя var_dump($client->getResponse()->getContent());

Кроме того, я думаю, вы должны написать это:

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

В противном случае вы будете проверять ответ первого URL перед отправкой формы.

7 голосов
/ 11 июля 2013

Я также боролся с этим, и оказалось, что метод selectButton вызвал эту ошибку.

После чтения документов DOM Crawler я обнаружил, что 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 , который я установил с помощью composer из упаковщик (в моем случае я добавил "fabpot/goutte": "1.0.*@dev")

2 голосов
/ 13 марта 2012

В качестве продолжения того, что написал @ greg0ire, проверьте, если

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

Возвращает страницу перенаправления вместо фактического содержимого.Если это так, вы можете добавить это:

$client->followRedirects(true);
1 голос
/ 02 апреля 2014

Я вижу вопрос до сих пор нет ответа.У меня была такая же проблема.

В моем случае 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);
0 голосов
/ 26 февраля 2015

У меня была такая же проблема с приложением 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();
...
0 голосов
/ 24 февраля 2014

Эта ошибка возникает, когда сканер не может найти запрошенный элемент формы; Довольно сложно, когда вы используете, например, конструктор форм, как при запуске, он создаст другое входное имя:

$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';
0 голосов
/ 28 февраля 2012

Вы можете попробовать использовать Codeception с модулем Symfony2.Он предоставляет гибкий интерфейс для функциональных тестов Symfony2 и имеет лучшие функции отладки.

...