2013-08-13 5 views
2

Я всегда узнал, что хорошее кодирование означает: не повторяйте себя. Но в эти дни я повторяю себя, пытаясь позволить моим скреперам обрабатывать ошибки времени.Автоматизация обработки таймаута (ожидание и обновление) в 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 
+0

есть причина, почему вы объединяете 'wait_until_present 'с обновлением страницы? Методы ожидания Watir ждут элемента, который предполагается асинхронно загружать (т. Е. Не требует обновления страницы). Если ваш элемент нуждается в обновлении страницы для обновления, то 'wait_until_present' всегда будет терпеть неудачу и просто будет потреблять время. –

+0

Я использую wait_until_present как способ не тратить лишнее время на ожидание появления элемента (наоборот, 'sleep (x)'). Проблема, которая появляется в нескольких царапинах, которые я пытаюсь запустить, - это тайм-аут, который иногда появляется. Я думаю, вы правы, что в тех случаях я жду слишком долго, потому что я использую wait_until_present, но это не большая проблема на данный момент. – Seeb

+0

Что должно произойти после обновления браузера? Вы должны повторить попытку щелчка по ссылке или продолжить работу со сценарием? В настоящее время ваш код, похоже, пытается позже. Тем не менее, я бы догадался, что вы хотели первого (например, попробуйте, обновите, повторите попытку, повторите) –

ответ

1

Извините за мой Enlish, я французский .... лол этот сценарий позволяет обновить браузер не пропустить шаг, для Exemple, когда вы должны войти в систему, вы не можете пропустить шаг .. ... и если у вас есть веб-сайт с слишком много связи с низким bandwhith .....

Я думаю, что Сееб бы сделать это:

module Watir 

class WhenPresentDecorator 
def method_missing(m, *args, &block) 
    unless @element.respond_to?(m) 
    raise NoMethodError, "undefined method `#{m}' for #{@element.inspect}:# {@element.class}" 
    end 

    begin 
    while [email protected]? 
    sleep(10) 
    puts "timed out, let's refresh" 
    @element.browser.refresh 
    end 
    rescue 

    else 
    @element.__send__(m, *args, &block) 
    end 
     end 
    end # WhenPresentDecorator 
    end 
+0

Спасибо! – Seeb

2

Если я правильно понимаю ваши требования правильно, я думаю, что вы хотите, чтобы переопределить method_missing обработку WhenPresentDecorator.

require 'watir-webdriver' 

module Watir 
    class WhenPresentDecorator 
    def method_missing(m, *args, &block) 
     unless @element.respond_to?(m) 
     raise NoMethodError, "undefined method `#{m}' for #{@element.inspect}:#{@element.class}" 
     end 

     begin 
     Watir::Wait.until(@timeout, @message) { @element.present? } 
     rescue 
     sleep(10) 
     puts "timed out, let's refresh" 
     @element.browser.refresh 
     else 
     @element.__send__(m, *args, &block) 
     end 
    end 
    end # WhenPresentDecorator 
end 

С этой обезьяны патч, when_present будет ждать элемент должен присутствовать. Если элемент присутствует, он выполнит действие (т. Е. Нажмите в вашем примере). Если элемент отсутствует, он поймает исключение, проигнорирует его, обновит страницу и перейдет к следующему утверждению.

Например, если на следующей странице, которая имеет Div тег, который показывает время загрузки страницы:

<html> 
    <head> 
    <script> 
     function startTime() 
     { 
     var today=new Date(); 
     var h=today.getHours(); 
     var m=today.getMinutes(); 
     var s=today.getSeconds(); 
     document.getElementById('txt').innerHTML=h+":"+m+":"+s; 
     } 
    </script> 
    </head> 
    <body onload="startTime()"> 
    <div id="txt"></div> 
    </body> 
</html> 

Вы можете видеть, что исключение не возникает при обращении к элементу (ссылка), что действительно существует. Кроме того, страница обновляется после попытки найти этот элемент.

puts browser.div(:id => 'txt').text 
#=> "22:48:25" 

browser.link(:id => 'asdf').when_present.click 
#=> "timed out, let's refresh" 

puts browser.div(:id => 'txt').text 
#=> "22:48:36" 
+0

Боюсь, что это не работает. Я закончил с «спасением в rbuf_fill»: «Тайм-аут :: Ошибка», в том числе «метод отсутствует» для '@element.__send __ (m, * args, & block) ' – Seeb

+0

Получается ли это исключение при использовании страницы примера выше или против вашего фактического приложения? –

+0

сам по себе, фактический, приложение. – Seeb

 Смежные вопросы

  • Нет связанных вопросов^_^