2013-07-13 6 views
6

私は、次のエラー得続ける:symfony2クローラからフォームを選択しようとしてエラーが発生しましたか?

There was 1 error: 

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

をしかし、私はローカルホスト/ログインに移動したときに、私のフォームは正しい内容に移入されます。 ...

$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'; 
    } 
} 

小枝ビュー:

{# 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> 

答えて

7

はSymfony2の中に機能テストをやって開始し、あなたの質問に未回答見つかったので、ここで私達は行く、

selectButtonメソッドは、文字列引数として実際のボタンのテキストを取ります。したがって、あなたのボタンが「私のフォームを提出してください」であれば、そのテキストになります。

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

アウトアンドリューStackoverflow

+1

を提出すると、一つのビューに等IDがより次いで1つの形態とすることができるパラメータは、例えば、付加下線を必要'' '_username''' – Tjorriemorrie

0

selectButton()は、画像用name又はalt値でボタンを選択します。

0

によって答え、私はこのエラーを持っていたし、どのように私はそれを解決し、なぜ[OK]を、ここにあります。

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プロジェクトの仮想ホスト。

希望すると助かります!

16

Vineetの回答は正しいですが...私の意見ではボタンからフォームを取ることはお勧めできません。 良い試み:

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

またはクラスの名前を変更する同じ値

+3

すばらしいおかげで、ボタン以外のフォームを手に入れる方法があるのだろうかと疑問に思っていました! – timhc22

+0

テキストが変更され、開発者側に反映されない可能性があるので、間違いなく最適なオプションです(翻訳、クライアント要求によって変更された文言に依存します...) – MediaVince

関連する問題