termux python mechanize

termux - Mecanizar Python-dos botones de tipo ''enviar''



mechanize python documentation (4)

Intenté usar el parámetro nr, sin suerte.

Pude hacer que funcionara con una combinación de los parámetros de nombre y etiqueta, donde "etiqueta" parece corresponder al "valor" en el HTML:

Aquí están mis dos botones de envío:

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

... y aquí está el código que hace clic en el primero, retrocede y luego hace clic en el segundo:

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

Hay una variante que también funcionó para mí, donde el "nombre" del botón de envío es el mismo, como:

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

y

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

NOTA IMPORTANTE: solo pude conseguir que funcionara este código de envío múltiple después de limpiar algo de HTML en el resto de la página.

Específicamente, no podría tener <br/> - en vez de eso tenía que tener <br /> ... y, teniendo aún menos sentido, no podía tener nada entre los dos botones de envío.

No me frustraba que el error mecanize / ClientForm que había buscado durante más de dos horas se redujera a esto:

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

(todos en una línea) no funcionó, pero

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

funcionó bien (en varias líneas, que tampoco debería haber importado).

Me gusta mecanizar porque fue fácil de instalar (solo copie los archivos en mi directorio de inclusión) y porque es bastante simple de usar, pero a menos que me falte algo importante, creo que los errores de este tipo son bastante horribles, puedo '' Piense en una buena razón por la que el primer ejemplo debería fallar y el segundo debería funcionar.

Y, por cierto, también encontré otro error de mecanización en el que un <textarea> que está contenido dentro de un <p> no se reconoce como un control válido, pero una vez que lo sacas del contenedor <p> se reconoce bien. Y verifiqué, se permite que textarea se incluya en otros elementos a nivel de bloque como <p> .

Tengo un script mecanizado escrito en python que llena un formulario web y se supone que haga clic en el botón ''crear''. Pero hay un problema, la forma tiene dos botones. Uno para ''agregar archivo adjunto'' y otro para ''crear''. Ambos son de tipo ''enviar'', y el botón de adjuntar es el primero que aparece en la lista. Entonces, cuando selecciono el foro y hago br.submit (), hace clic en el botón "adjuntar" en lugar de "crear". El Googling extenso no ha proporcionado nada útil para seleccionar un botón específico en un formulario. ¿Alguien sabe de algún método para saltear el primer botón "enviar" y hacer clic en el segundo?


Le sugiero que use Twill que utiliza mecanizar (en su mayoría con parche). Así que diga que tiene formulario con algunos campos y dos botones de envío con los nombres "submit_to_preview" y "real_submit". El siguiente código debería funcionar.

Por cierto, recuerde que esto no es seguro para subprocesos, por lo que es posible que desee utilizar bloqueos en caso de que desee utilizar el código en un 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")

Espero que ayude. Aclamaciones.


Puedo hablar de la experiencia usando HTTP, en lugar de mecanizar, pero creo que esto es probablemente lo que quieres.

Cuando hay dos botones de envío en un formulario, un servidor puede determinar cuál se presionó, porque el cliente debería haber agregado un argumento para el botón de envío. Asi que:

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

Te llevará ya sea la URL:

blah?button_1=One

o:

blah?button_2=Two

Dependiendo de qué botón se presionó.

Si está determinando de manera programática qué argumentos se enviarán, debe agregar un argumento con el nombre del botón de envío que se presionó y su valor.


Utilice el método ''clic''. P.ej

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

Deberia trabajar.