0

HTML ソース (文字列)でフォームを送信できるようにしたいと考えています。つまり、フォームの HTML ソースを含む文字列からPOST パラメータを生成する機能が少なくとも必要です。これは、Django プロジェクトの単体テストで必要です。おそらく解決策が欲しいです。

  • 標準の Python ライブラリと Django のみを使用します。
  • 複数のフォームが存在する場合、特定のフォームからパラメーターを生成できます。
  • 送信前に値を変更できます。

特定のフォーム クラスから (Django) フォーム インスタンスを返すソリューションが最適です。検証を使用できるようになるためです。理想的には、ソース (文字列)、フォーム クラス、およびオプションでフォーム名を消費し、レンダリング前のインスタンスを返します。

注: これが簡単な作業ではないことは承知しており、おそらくその成果は必要な労力に見合うものではありません。しかし、実用的で信頼できる方法でこれを行う方法に興味があります。もし可能なら。

4

4 に答える 4

4

Django のテスト フレームワークに関するドキュメント、特にテスト クライアントを使用したビュー (およびフォーム) のテストに関する部分を読み直してください。

テスト クライアントは単純な Web ブラウザーとして機能し、Django ビューに対して作成GETおよび要求を行うことができます。POST応答 HTML を読み取るかContext、テンプレートが受け取った同じオブジェクトを取得できます。オブジェクトには、探しているContext実際のインスタンスが含まれている必要があります。forms.Form

例として、URL のビュー/form/がコンテキスト{'myform': forms.Form()}をテンプレートに渡す場合、次の方法で取得できます。

from django.test.client import Client
c = Client()

# request the web page:
response = c.get('/form/')

# get the Form object:
form = response.context['myform']

form_data = form.cleaned_data
my_form_data = {} # put your filled-out data in here...
form_data.update(my_form_data)

# submit the form back to the web page:
new_form = forms.Form(form_data)
if new_form.is_valid():
    c.post('/form/', new_form.cleaned_data)

HTML の解析に煩わされることなく、目的が達成されることを願っています。

編集: フォームに関する Django ドキュメントを読み直した後、フォームは不変であることがわかりました。ただし、新しいFormインスタンスを作成して送信するだけで問題ありません。これに合わせてコード例を変更しました。

于 2008-12-05T22:08:09.743 に答える
2

それは簡単です...そして同時に難しいです。
免責事項: 私は Python についてはあまり知りませんし、Django についてもまったく知りません...そこで、言語にとらわれない一般的なアドバイスをします...上記のアドバイスのいずれかがうまくいかない場合は、手動で行うことをお勧めします。 :

  • HTML パーサーでページを読み込み、フォームを一覧表示します。
  • method属性が POST (大文字と小文字を区別しない) の場合は、属性actionを取得して、要求の URL を取得します (相対にすることができます)。
  • フォームで、すべてinputselectタグを取得します。(名前がnameないid場合は) 属性は、要求パラメーターのキーです。属性 (存在しない場合はvalue空) は対応する値です。
  • の場合select、値は選択したものであるoptionか、表示されるテキストはvalue属性ではありません。

これらの名前と値は、GET リクエストでは URL エンコードする必要がありますが、POST リクエストではエンコードしないでください。

HTH。

于 2008-12-05T13:16:50.207 に答える
2

Django テスト フレームワークがこれを行うため、何を求めているのかわかりません。

フォームを持つ Django アプリをテストしますか?

  • その場合、最初の GET を実行する必要があります
  • 結果の POST が続きます

別のサイトにフォームを送信する Django アプリを作成 (およびテスト) しますか?

フォームを使用して Django アプリをテストする方法を次に示します。

class Test_HTML_Change_User( django.test.TestCase ):
    fixtures = [ 'auth.json', 'someApp.json' ]
    def test_chg_user_1( self ):
        self.client.login( username='this', password='this' )
        response= self.client.get( "/support/html/user/2/change/" )
        self.assertEquals( 200, response.status_code )
        self.assertTemplateUsed( response, "someApp/user.html")

def test_chg_user( self ):
    self.client.login( username='this', password='this' )
    # The truly fussy would redo the test_chg_user_1 test here
    response= self.client.post(
        "/support/html/user/2/change/",
        {'web_services': 'P',
         'username':'olduser',
         'first_name':'asdf',
         'last_name':'asdf',
         'email':'asdf@asdf.com',
         'password1':'passw0rd',
         'password2':'passw0rd',} )
    self.assertRedirects(response, "/support/html/user/2/" )
    response= self.client.get( "/support/html/user/2/" )
    self.assertContains( response, "<h2>Users: Details for", status_code=200 )
    self.assertContains( response, "olduser" )
    self.assertTemplateUsed( response, "someApp/user_detail.html")

注 - HTML を詳細に解析するわけではありません。適切なテンプレートと適切な応答文字列があれば、それは正しくなければなりません。

于 2008-12-05T12:10:32.073 に答える
0

mechanizeまたはラッパーツイルをチェックしてください。ClientFormモジュールがあなたのために働くと思います。

于 2008-12-05T12:59:34.220 に答える