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
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" /> <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>
.
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ą.
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.
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ć.
- 1. Dwa przyciski z PendingIntents - Widget
- 2. Dwa przyciski radiowe mają jeden "identyfikator"?
- 3. Formularz Playframework i dwa przyciski do przesłania
- 4. Mechanizm Unboxingu
- 5. python: porównując dwa ciągi
- 6. Porównaj dwa System.Enum typu T
- 7. Mechanizm wiązania iniekcji automatycznej
- 8. Python Selenium Wyślij klucze ostrzegające o rozmiarze
- 9. Wyślij wiadomość do skryptu w języku Python
- 10. Rozciągnij dwa przyciski poziomo na wszystkich urządzeniach AutoLayout
- 11. Python: rozumienie komponować dwa słowniki
- 12. powrocie initializer lista mechanizm
- 13. Mechanizm dynamicznej manipulatora agregatora
- 14. Czy Python ma podobny mechanizm kontroli do CountDownLatch Java?
- 15. Lekki mechanizm renderowania HTML z CSS w języku Python
- 16. Uwzględnij przyciski wewnątrz sugestii typu głowicy przy użyciu narzędzia Backbone
- 17. jQuery ajax, wyślij formularz z plikiem typu wejściowego i Json
- 18. Przyciski radia WinForms
- 19. Przycisk Wyślij poza znacznikami <form>
- 20. Zamiast tego przyciski radiowe wyglądają jak przyciski.
- 21. Dlaczego te dwa importowania Python działają inaczej?
- 22. Python list - Prawda/Fałsz pierwsze dwa elementy?
- 23. Jak odróżnić dwa słowniki w języku Python?
- 24. Python - Scalanie dwa ciągi, które pokrywają
- 25. Python - Połączyć dwa słowniki, połączyć wartości ciągów?
- 26. wyniki Python cProfile: dwa numery do ncalls
- 27. Jak alias typu w python?
- 28. Mechanizm kwarcowy .NET MakeDailyTrigger
- 29. Mechanizm ważności operatorów JavaScriptu
- 30. Domyślny mechanizm oceniania ElasticSearch