Tengo una función de mecanizar para desconectarme de un sitio pero en muy raras ocasiones me interrumpe. La función implica ir a una página específica y luego hacer clic en un botón de cerrar sesión. De vez en cuando Mechanize sufre un tiempo de espera cuando, al ir a la página de cierre de sesión o al hacer clic en el botón de cerrar sesión, el código falla. Así que hice un pequeño rescate y parece estar funcionando como se ve debajo del primer código.Captura de errores de tiempo de espera con mecanizado de ruby
def logmeout(agent)
page = agent.get('http://www.example.com/')
agent.click(page.link_with(:text => /Log Out/i))
end
Logmeout con rescate:
def logmeout(agent)
begin
page = agent.get('http://www.example.com/')
agent.click(page.link_with(:text => /Log Out/i))
rescue Timeout::Error
puts "Timeout!"
retry
end
end
Suponiendo que entiendo rescate correctamente, lo hará ambas acciones más aunque sólo el clic Tiempo de espera agotado, por lo que en el esfuerzo para ser eficiente estoy preguntaba si Podría usar un proceso en esta situación y pasarle un bloque de código. Sería algo así como este trabajo:
def trythreetimes
tries = 0
begin
yield
rescue
tries += 1
puts "Trying again!"
retry if tries <= 3
end
end
def logmeout(agent)
trythreetimes {page = agent.get('http://www.example.com/')}
trythreetimes {agent.click(page.link_with(:text => /Log Out/i))}
end
nota en mi función trythreetimes me dejaron como rescate genérica lo que la función sería más reutilizable.
Muchas gracias por cualquier ayuda que alguien pueda brindarme, me doy cuenta de que hay un par de preguntas diferentes aquí, pero son todas las cosas que trato de aprender.
¡Gracias por la respuesta! ¿Su código preferido es asumir que encontró el enlace correcto a través del código fuente? – Sean
Bueno, no es realmente difícil encontrar un enlace dentro de una fuente HTML. Prefiero esta solución debido al tiempo y la memoria necesarios. pero puede usar su solución con el conjunto ['read_timeout'] (http://mechanize.rubyforge.org/Mechanize/HTTP/Agent.html#read_timeout=). Es una buena idea si lo usa para múltiples dominios. Solo edite mi segunda pausa de código y cámbiela para acceder a la página principal y haga clic en el enlace si lo prefiere. – cz3ch
Oh, lo siento, de hecho, no respondí tu pregunta. Sí, es asumiendo que encontraste el enlace correcto a través del código fuente ... – cz3ch