2009-04-09 2 views
27

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

ответ

21

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

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

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

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

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

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

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

2

Я могу говорить из опыта, используя 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 

В зависимости от которой была нажата кнопка.

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

7

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

BTW Помните, что это не потокобезопасно, поэтому вы можете использовать блокировки в случае, если вы хотите использовать код в потоковом 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") 

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

4

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

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

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

Смежные вопросы