29

Webフォームに記入し、「作成」ボタンをクリックすることになっているPythonで書かれた機械化スクリプトがあります。しかし、問題があります。フォームには 2 つのボタンがあります。1 つは「添付ファイルの追加」用で、もう 1 つは「作成」用です。どちらも「送信」タイプで、添付ボタンが最初に表示されます。そのため、フォーラムを選択して br.submit() を実行すると、「作成」ではなく「添付」ボタンがクリックされます。広範囲にわたるグーグル検索では、フォーム内の特定のボタンを選択するのに役立つものは何も得られませんでした。最初の「送信」ボタンをスキップして2番目のボタンをクリックする方法を知っている人はいますか?

4

4 に答える 4

22

nr パラメーターを使用してみましたが、うまくいきませんでした。

name パラメータと label パラメータの組み合わせで動作させることができました。ここで、「ラベル」は HTML の「値」に対応しているようです。

ここに私の2つの送信ボタンがあります:

<input type="submit" name="Preview" value="Preview" />
<input type="submit" name="Create" value="Create New Page" />

...そして、最初のものをクリックし、戻って、2番目のものをクリックするコードは次のとおりです。

from mechanize import Browser
self.br = Browser()
self.br.open('http://foo.com/path/to/page.html')
self.br.select_form(name='my_form')
self.br['somefieldname'] = 'Foo'
submit_response = self.br.submit(name='Preview', label='Preview')
self.br.back()
self.br.select_form(name='my_form')
self.br['somefieldname'] = 'Bar'
submit_response = self.br.submit(name='Create', label='Create New Page')

次のように、送信ボタンの「名前」が同じである、私のためにも機能するバリアントがあります。

<input type="submit" name="action" value="Preview" />
<input type="submit" name="action" value="Save" />
<input type="submit" name="action" value="Cancel" />

self.br.select_form(name='my_form')
submit_response = self.br.submit(name='action', label='Preview')
self.br.back()
submit_response = self.br.submit(name='action', label='Save')

重要な注意 -ページの残りの HTML をクリーンアップした、この複数の送信ボタン コードを機能させることができました。

具体的には、私は持つことができませんでした<br/>-代わりに私は持たなければなりませんでした<br />...そして、さらに意味をなさないことに、2つの送信ボタンの間に何も置くことができませんでした.

2 時間以上探し続けた mechanize/ClientForm のバグが次のように要約されたことに、私はとてつもなくイライラしました。

<tr><td colspan="2"><br/><input type="submit" name="Preview" value="Preview" />&nbsp;<input type="submit" name="Create" value="Create New Page" /></td></tr>

(すべて 1 行で) は機能しませんでしたが、

<tr><td colspan="2"><br />
<input type="submit" name="Preview" value="Preview" />
<input type="submit" name="Create" value="Create New Page" /></td></tr>

正常に機能しました(複数の行で、これも重要ではありませんでした)。

インストールが簡単で (ファイルをインクルード ディレクトリにコピーするだけ)、使い方がとても簡単なため、私は mechanize が好きですが、何か重大なことが欠けていない限り、このようなバグはひどいものだと思います。最初の例が失敗し、2 番目の例が機能する正当な理由がまったく思い浮かびません。

<textarea>ついでに、a内に含まれる aが有効なコントロールとして認識されない別の機械化バグも発見しまし<p>たが、コンテナーから取り出すと問題なく認識されます<p>。そして、チェックしたところ、 textareaのような他のブロックレベル要素に含めることができます<p>

于 2009-11-06T06:17:16.903 に答える
7

mechanize を使用する Twill を使用することをお勧めします (主にモンキーパッチ)。たとえば、いくつかのフィールドと、"submit_to_preview" と "real_submit" という名前の 2 つの送信ボタンを含むフォームがあるとします。次のコードが機能するはずです。

ところで、これはスレッドセーフではないため、スレッド化された環境でコードを使用する場合に備えてロックを使用することをお勧めします。

import twill.commands
b = twill.get_browser()
url = "http://site/myform"
twill.commands.go(url)
twill.commands.fv("2", "name", "Me")
twill.commands.fv("2", "age", "32")
twill.commands.fv("2", "comment", "useful article")
twill.commands.browser.submit("real_submit")

それが役立つことを願っています。乾杯。

于 2009-04-09T16:50:55.797 に答える
5

「クリック」方式を使用します。例えば

mybrowser.select_form(nr=0)
req = mybrowser.click(type="submit", nr=1)
mybrowser.open(req)

動作するはずです。

于 2009-08-11T23:10:18.520 に答える
2

機械化するのではなく、HTTP を使用した経験から話すことができますが、これはおそらくあなたが望むものだと思います。

フォームに 2 つの送信ボタンがある場合、サーバーはどちらが押されたかを判断できます。これは、クライアントが送信ボタンの引数を追加している必要があるためです。そう:

<form action="blah" method="get">
    <p>
        <input type="submit" name="button_1" value="One" />
        <input type="submit" name="button_2" value="Two" />
    </p>
</form>

次のいずれかの URL に移動します。

blah?button_1=One

また:

blah?button_2=Two

押されたボタンによって異なります。

送信される引数をプログラムで決定する場合は、押された送信ボタンの名前とその値を含む引数を追加する必要があります。

于 2009-04-09T16:28:42.213 に答える