У меня есть механизатор script, написанный на питоне, который заполняет веб-форму и должен нажать кнопку "создать". Но есть проблема, форма имеет две кнопки. Один для "добавить прикрепленный файл" и один для "create". Оба имеют тип "submit", а кнопка "Прикрепить" - первая. Поэтому, когда я выбираю форум и делаю команду br.submit(), он нажимает кнопку "attach" вместо "create". Экстенсивный Googling не принес ничего полезного для выбора конкретной кнопки в форме. Кто-нибудь знает какие-либо способы пропустить первую кнопку "отправить" и нажать вторую?
Python mechanize - две кнопки типа 'submit'
Ответ 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" /> <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
В зависимости от того, какая кнопка была нажата.
Если вы программно определяете, какие аргументы должны быть отправлены, вам нужно добавить аргумент с именем кнопки отправки, который был нажат, и это значение.