2009-04-09 16 views
27

Mam skrypt mechanize napisany w pythonie, który wypełnia formularz internetowy i powinien kliknąć przycisk "Utwórz". Ale jest problem, formularz ma dwa przyciski. Jeden dla "dodaj załączony plik" i drugi dla "utwórz". Oba są typu "prześlij", a przycisk dołączania jest pierwszym na liście. Kiedy więc wybiorę forum i zrobię br.submit(), kliknie przycisk "załóż" zamiast "utwórz". Rozbudowane Googling nie przyniósł nic przydatnego do wyboru konkretnego przycisku w formularzu. Czy ktoś wie o jakichkolwiek metodach pomijania pierwszego przycisku "Wyślij" i kliknięcia drugiego?Mechanizm Python - dwa przyciski typu "wyślij"

Odpowiedz

21

Próbowałem używać parametru nr, bez żadnego szczęścia.

udało mi się zmusić go do pracy z kombinacją nazw i etykiet parametrów, gdzie „label” wydaje się odpowiadać „wartości” w HTML:

Oto moje dwa przyciski przesyłania:

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

...i tu jest kod, który kliknie pierwszy, wraca, a następnie klika sekund:

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

Jest to wariant, który również pracował dla mnie, gdzie „nazwa” przycisku przedstawienia jest taka sama, jak :

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

i

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

UWAGA - byłem tylko stanie uzyskać żadnej z tego kodu wielokrotnego złożyć przycisku pracować po czyszczenie niektórych HTML w pozostałej części strony.

W szczególności nie mogłem mieć <br/> - zamiast tego musiałem mieć <br /> ... i, czyniąc jeszcze mniej sensu, nie mogłem mieć nic pomiędzy dwoma przyciskami przesyłania.

Jest sfrustrowany mnie bez końca, że ​​błąd mechanize/ClientForm polowałem przez ponad dwie godziny sprowadzała się do tego:

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

(wszystko w jednej linii) nie działa, ale

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

działa dobrze (na wielu liniach, które również nie powinny mieć znaczenia).

Lubię mechanizację, ponieważ było łatwe do zainstalowania (po prostu skopiuj pliki do mojego katalogu) i dlatego, że jest bardzo prosty w użyciu, ale jeśli brakuje mi czegoś poważnego, myślę, że takie błędy są w pewnym sensie okropne - Nie mogę wymyślić żadnego dobrego powodu, dlaczego pierwszy przykład miałby zawieść, a drugi powinien zadziałać.

I, nawiasem mówiąc, ja też znaleźć inny błąd Mechanize gdzie <textarea> który jest zawarty w <p> nie jest rozpoznany jako prawidłowy kontrolą, ale gdy go wyjąć z pojemnika <p> to uznane w porządku. I sprawdziłem, textarea jest dopuszczone do uwzględnienia w innych elementach blokowych, takich jak <p>.

2

Mogę mówić z doświadczenia używając HTTP, zamiast zmechanizować, ale myślę, że to jest prawdopodobnie to, czego chcesz.

Gdy w formularzu są dwa przyciski przesyłania, serwer może określić, który z nich został naciśnięty, ponieważ klient powinien dodać argument dla przycisku przesyłania. Więc:

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

zajmie Ci albo URL:

blah?button_1=One 

czyli

blah?button_2=Two 

zależności od naciśnięcia przycisku.

Jeśli programujesz ustalanie, które argumenty mają zostać wysłane, musisz dodać argument z nazwą naciśniętego przycisku "Wyślij" i jego wartością.

7

Proponuję użyć skrętu, który wykorzystuje mechanizację (najczęściej monkeypatched). Powiedzmy, że masz formularz z polami i dwoma przyciskami przesyłania z nazwami "submit_to_preview" i "real_submit". Poniższy kod powinien działać.

Przy okazji pamiętaj, że nie jest to bezpieczne dla wątków, więc możesz chcieć użyć zamków w przypadku, gdy chcesz użyć kodu w env z gwintem.

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

Nadzieję, że pomaga. Twoje zdrowie.

4

Skorzystaj z metody "kliknięcia". Na przykład.

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

Powinien działać.

Powiązane problemy