2011-01-27 13 views
14

Domyślnie Selen działa tak szybko, jak to możliwe, poprzez scenariusze zdefiniowane przy użyciu ogórka. Chciałbym ustawić, aby działał z mniejszą prędkością, więc jestem w stanie uchwycić wideo z procesu.Jak mogę uruchomić Selenium (używane przez Capybara) przy niższej prędkości?

Wyliczyłem, że instancja Selenium::Client::Driver ma metodę set_speed. Co odpowiada Java API.

Jak mogę uzyskać wystąpienie klasy Selenium::Client::Driver? Mogę dostać aż do page.driver, ale to zwraca instancję Capybara::Driver::Selenium.

Odpowiedz

21

Dzięki za podpowiedź http://groups.google.com/group/ruby-capybara/msg/6079b122979ffad2.

Po prostu notatka, że ​​używa ona snu Ruby, więc jest nieco nieprecyzyjna - ale powinna wykonać to za Ciebie. Ponadto wywołanie jest wywoływane dla wszystkiego, dlatego właśnie oczekuje sekundy. Pośrednie kroki - poczekaj, aż będą gotowe, sprawdź pole, ustaw ostrość, wprowadź tekst - każda pauza.

Tworzenie "throttle.rb" w katalogu/funkcji wsparcia (w przypadku korzystania Ogórek) i napełnić go:

require 'selenium-webdriver' 
module ::Selenium::WebDriver::Firefox 
    class Bridge 
    attr_accessor :speed 

    def execute(*args) 
     result = raw_execute(*args)['value'] 
     case speed 
     when :slow 
      sleep 0.3 
     when :medium 
      sleep 0.1 
     end 
     result 
    end 
    end 
end 

def set_speed(speed) 
    begin 
    page.driver.browser.send(:bridge).speed=speed 
    rescue 
    end 
end 

Następnie w definicji kroku, zadzwoń:

set_speed(:slow) 

lub:

set_speed(:medium) 

Aby zresetować, zadzwoń:

set_speed(:fast) 
+0

thx za podpowiedź! na wypadek gdyby "strona" nie była dostępna, należy dodać 'Capybara :: DSL' lub zastąpić ją' Capybara.current_session' – RngTng

2

Jako aktualizacja, metoda wykonywania w tej klasie nie jest już dostępna. Teraz jest tu tylko:

module ::Selenium::WebDriver::Remote

Musiałem udusić kilka testów w IE i to działało.

+0

czy możesz podać przykład pełnego kodu :) proszę. –

+1

@MischaMolhoek Użyj powyższego kodu i zastąp 'module :: Selenium :: WebDriver :: Firefox' z' module :: Selenium :: WebDriver :: Remote'! : D Obecnie używam tej funkcji w/rspec i mam ją w 'spec/support/throttle.rb' nazywając' set_speed: medium' w moim poprzednim bloku specyfikacji funkcji. Działa świetnie, gdy jest dużo css i selen jest za szybki. Dzięki @phil za aktualizację! –

+0

@rbatta, tanx :) –

0

Metody wymienione w tym wątku nie działają już w przypadku Selenium Webdriver v3.

Zamiast tego musisz dodać polecenie sleep do polecenia exec.

module Selenium::WebDriver::Remote 
    class Bridge 
    def execute(command, opts = {}, command_hash = nil) 
     verb, path = commands(command) || raise(ArgumentError, "unknown command: #{command.inspect}") 
     path = path.dup 

     path[':session_id'] = session_id if path.include?(':session_id') 

     begin 
     opts.each { |key, value| path[key.inspect] = escaper.escape(value.to_s) } 
     rescue IndexError 
     raise ArgumentError, "#{opts.inspect} invalid for #{command.inspect}" 
     end 

     Selenium::WebDriver.logger.info("-> #{verb.to_s.upcase} #{path}") 
     res = http.call(verb, path, command_hash) 
     sleep(0.1) # <--- Add your sleep here. 
     res 
    end 
    end 
end 

Zauważ, że jest to bardzo kruchy sposób na spowolnienie testów, ponieważ małpa łata prywatne API.

1

to będzie działać, i jest mniej kruchy (dla jakiejś małej wartości „mniej”)

require 'selenium-webdriver' 
module ::Selenium::WebDriver::Remote 
    class Bridge 
    alias_method :old_execute, :execute 
    def execute(*args) 
     sleep(0.1) 
     old_execute(*args) 
    end 
    end 
end 
Powiązane problemy