Подтвердить что ты не робот

Python mechanize - две кнопки типа 'submit'

У меня есть механизатор script, написанный на питоне, который заполняет веб-форму и должен нажать кнопку "создать". Но есть проблема, форма имеет две кнопки. Один для "добавить прикрепленный файл" и один для "create". Оба имеют тип "submit", а кнопка "Прикрепить" - первая. Поэтому, когда я выбираю форум и делаю команду br.submit(), он нажимает кнопку "attach" вместо "create". Экстенсивный Googling не принес ничего полезного для выбора конкретной кнопки в форме. Кто-нибудь знает какие-либо способы пропустить первую кнопку "отправить" и нажать вторую?

4b9b3361

Ответ 1

Я попытался использовать параметр nr, без везения.

Мне удалось заставить его работать с комбинацией параметров имени и метки, где "метка", похоже, соответствует "значению" в HTML:

Вот мои две кнопки отправки:

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

... и здесь код, который нажимает на первый, возвращается, а затем нажимает на второй:

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 />... и, что еще менее значило, у меня не могло быть ничего между двумя кнопками отправки.

Это разочаровало меня в том, что ошибка механизации /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>

(все в одной строке) не работает, но

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

работал отлично (на нескольких строках, что также не должно было иметь значения).

Мне нравится механизация, потому что она проста в установке (просто скопируйте файлы в мой каталог include) и потому, что она довольно проста в использовании, но если я не пропущу что-то важное, я думаю, что такие ошибки выглядят ужасно - Я не могу придумать вескую причину, почему первый пример должен потерпеть неудачу, а второй должен работать.

И, кстати, я также нашел еще одну ошибку механизации, в которой <textarea>, которая содержится в <p>, не распознается как действительный элемент управления, но как только вы вынимаете его из контейнера <p>, он распознает только штраф, И я проверил, textarea разрешено включать в другие элементы уровня блока, такие как <p>.

Ответ 2

Я предлагаю вам использовать Twill, который использует механизацию (в основном, обезьяну). Скажем, у вас есть форма с несколькими полями и двумя кнопками отправки с именами "submit_to_preview" и "real_submit". Следующий код должен работать.

Кстати, это не потокобезопасно, поэтому вы можете использовать блокировки в случае, если вы хотите использовать код в потоковом env.

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")

Надеюсь, что это поможет. Приветствия.

Ответ 3

Используйте метод 'click'. Например.

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

Должен работать.

Ответ 4

Я могу говорить из опыта, используя HTTP, а не механизировать, но я думаю, что это, вероятно, то, что вы хотите.

Когда в форме есть две кнопки отправки, сервер может определить, какой из них был нажат, потому что клиент должен добавить аргумент для кнопки отправки. Итак:

<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

В зависимости от того, какая кнопка была нажата.

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