Ho una funzione di meccanizzazione per disconnettermi da un sito ma in rare occasioni mi fa perdere tempo. La funzione implica andare a una pagina specifica e quindi fare clic su un pulsante di disconnessione. Occasionalmente che mechanize subisce un timeout quando si va alla pagina di disconnessione o si fa clic sul pulsante di disconnessione il codice si arresta in modo anomalo. Così ho messo un piccolo salvataggio e sembra che funzioni come visto sotto il primo pezzo di codice.Errori di timeout di cattura con ruby mechanize
def logmeout(agent)
page = agent.get('http://www.example.com/')
agent.click(page.link_with(:text => /Log Out/i))
end
Logmeout con salvataggio:
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
Supponendo ho capito bene di soccorso, lo farà entrambe le azioni sopra anche se solo il ticchettio scaduta, così nello sforzo di essere efficiente Mi chiedevo se Potrei usare un proc in questa situazione e passargli un blocco di codice. Sarebbe qualcosa di simile a questo lavoro:
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 nella mia funzione trythreetimes ho lasciato come soccorso generico in modo la funzione sarebbe più riutilizzabili.
Grazie mille per l'aiuto che chiunque può fornire, mi rendo conto che ci sono un paio di domande diverse qui ma sono tutte cose che sto cercando di imparare!
Grazie per la risposta! Il tuo codice preferito presuppone che tu abbia trovato il link corretto attraverso il codice sorgente? – Sean
Beh, non è molto difficile trovare un collegamento all'interno di una fonte HTML. Preferisco questa soluzione a causa del tempo e della memoria necessari. ma puoi usare la tua soluzione con il set ['read_timeout'] (http://mechanize.rubyforge.org/Mechanize/HTTP/Agent.html#read_timeout=). È una buona idea se lo usi per più domini. Modifica il mio secondo codice di sicurezza e modificalo per accedere alla pagina principale e fare clic sul link, se preferisci. – cz3ch
Oh scusa, non ho risposto alla tua domanda in effetti. Sì, supponiamo che tu abbia trovato il link corretto attraverso il codice sorgente ... – cz3ch