Я всегда узнал, что хорошее кодирование означает: не повторяйте себя. Но в эти дни я повторяю себя, пытаясь позволить моим скреперам обрабатывать ошибки времени.Автоматизация обработки таймаута (ожидание и обновление) в watir
Для каждой ссылки или кнопки, которую я нажимаю, я добавляю спасение Exception => e и обновляю страницу.
Например
browser.link(:xpath, "//tr[@class='pager'][1]/td/a").when_present.click
превращается в
begin
browser.link(:xpath, "//tr[@class='pager'][1]/td/a").wait_until_present
browser.link(:xpath, "//tr[@class='pager'][1]/td/a").click
rescue Exception => e
sleep (10)
puts "timed out, let's refresh"
browser.refresh
end
Возможно, есть пылесос, неповторяющееся решение. Я пытался манипулировать Watir :: ждать, но я не мог получить, чтобы работать ..
class Watir::Wait
alias_method :__do_wait, :wait_until
def wait_until
begin
__do_wait{ yield }
rescue Exception => e
puts "timed out. let's refresh"
$browser.refresh
end
end
end
есть причина, почему вы объединяете 'wait_until_present 'с обновлением страницы? Методы ожидания Watir ждут элемента, который предполагается асинхронно загружать (т. Е. Не требует обновления страницы). Если ваш элемент нуждается в обновлении страницы для обновления, то 'wait_until_present' всегда будет терпеть неудачу и просто будет потреблять время. –
Я использую wait_until_present как способ не тратить лишнее время на ожидание появления элемента (наоборот, 'sleep (x)'). Проблема, которая появляется в нескольких царапинах, которые я пытаюсь запустить, - это тайм-аут, который иногда появляется. Я думаю, вы правы, что в тех случаях я жду слишком долго, потому что я использую wait_until_present, но это не большая проблема на данный момент. – Seeb
Что должно произойти после обновления браузера? Вы должны повторить попытку щелчка по ссылке или продолжить работу со сценарием? В настоящее время ваш код, похоже, пытается позже. Тем не менее, я бы догадался, что вы хотели первого (например, попробуйте, обновите, повторите попытку, повторите) –