Pregunta

Tengo un script mecanizar escrito en Python que rellena 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 'añadir archivo adjunto' y otro para 'crear'. Ambos son del tipo de 'enviar', y el botón de adjuntar es el primero de la lista. Así que cuando selecciono el foro y hago br.submit (), que haga clic en el botón 'conectar' en lugar de 'crear'. Extensa googlear ha dado nada útil para la selección de un botón específico en una forma. ¿Alguien sabe de algún método para saltar sobre el primer botón de 'enviar' y haciendo clic en el segundo?

¿Fue útil?

Solución

He intentado utilizar el parámetro nr, sin ninguna suerte.

Yo era capaz de conseguir que funcione con una combinación de los parámetros de nombre y la etiqueta, donde "etiqueta" parece corresponder al "valor" en el código HTML:

Aquí están mis presentar dos botones:

<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, se remonta, 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 trabajó para mí, donde el "nombre" del botón de envío es el mismo, como por ejemplo:

<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 -. Yo era solamente capaz de conseguir algo de esto en código botones múltiples someterse a trabajar después limpiando algo de HTML en el resto de la página

En concreto, no podía tener <br/> - en lugar de eso tenía que tener <br /> ... y, haciendo aún menos sentido, no podía tener nada entre los dos botones de envío

.

Me frustra que no tiene fin de que el error mecanizar / ClientForm me cazado por más de dos horas se reducía 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>

(todo 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>

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

Me gusta mecanizar porque era fácil de instalar (sólo tienes que copiar los archivos en mi directorio de inclusión) y porque es bastante simple de usar, pero a menos que me falta algo importante, creo que los errores como éste son una especie de horrible - no puedo pensar en una buena razón en absoluto por qué el primer ejemplo no debe fallar y la segunda debería funcionar.

Y, por cierto, también encontré otro error mecanizar donde un <textarea> que está contenido dentro de un <p> no se reconoce como un control válido, pero una vez que lo saca del recipiente <p> Es reconocido muy bien. Y lo comprobé, área de texto es permite que se incluye en otros elementos en bloque como <p>.

Otros consejos

Yo sugeriría el uso de la tela cruzada que utiliza la mecanización (en su mayoría monkeypatched). Así que usted tiene formulario con algunos campos y dos botones de envío con nombres "submit_to_preview" y "real_submit". Siguiente código debería funcionar.

Por cierto recordar que esto no es threadsafe lo que podría querer utilizar bloqueos en el caso si desea utilizar el código en un env roscado.

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. Saludos.

Utilice el método de 'clic'. Por ejemplo.

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

En caso de trabajar.

puedo hablar de la experiencia a través de HTTP, en lugar de mecanizar, pero creo que esto es probablemente lo que quiere.

Cuando hay dos botones de envío en un formulario, un servidor puede determinar cuál fue presionado, ya que el cliente debería haber añadido un argumento para el botón de envío. Por lo tanto:

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

¿Va a tomar el URL:

blah?button_1=One

o

blah?button_2=Two

En función de qué botón se ha pulsado.

Si está programáticamente determinar lo que van a ser enviados argumentos, es necesario agregar una discusión con el nombre del botón de envío que se ha pulsado, y su valor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top