我得到" 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);
}
答案 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();
...