2011-01-27 1 views
14

По умолчанию Selenium работает как можно быстрее в сценариях, которые я определил с помощью Cucumber. Я хотел бы настроить его на более низкую скорость, поэтому я могу захватить видео процесса.Как я могу запустить селен (используемый через Capybara) с меньшей скоростью?

Я выяснил, что пример Selenium::Client::Driver имеет метод set_speed. Что соответствует Java API.

Как я могу получить экземпляр класса Selenium::Client::Driver? Я могу получить до page.driver, но это возвращает экземпляр Capybara::Driver::Selenium.

ответ

21

http://groups.google.com/group/ruby-capybara/msg/6079b122979ffad2 Подсказка.

Просто обратите внимание, что это использует сон Рубина, поэтому он несколько неточен - но должен выполнять эту работу за вас. Кроме того, execute вызывается для всего, поэтому поэтому его ждет подсекция. Промежуточные шаги - подождать до готовности, проверить поле, сфокусироваться, ввести текст - каждую паузу.

Создать "throttle.rb" в ваших функциях/каталоге поддержки (при использовании Огурца) и залейте его:

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 

Затем, в определении шага, звоните:

set_speed(:slow) 

или:

set_speed(:medium) 

Для сброса, вызовите:

set_speed(:fast) 
+0

ТНХ для подсказки! на всякий случай 'page' недоступен, либо включите' Capybara :: DSL', либо замените его на 'Capybara.current_session' – RngTng

2

В качестве обновления метод execute в этом классе больше не доступен. Сейчас здесь только:

module ::Selenium::WebDriver::Remote

мне нужно душить некоторые тесты в IE, и это сработало.

+0

вы можете привести пример полного кода, пожалуйста :) tanx. –

+1

@MischaMolhoek Используйте приведенный выше код и замените 'module :: Selenium :: WebDriver :: Firefox' на' module :: Selenium :: WebDriver :: Remote'! : D В настоящее время я использую эту функцию w/rspec и имею ее в 'spec/support/throttle.rb', вызывающей' set_speed: medium' в моем перед блоком спецификаций моей функции. Отлично работает, когда есть много css и селен слишком быстро для него. Спасибо @phil за обновление! –

+0

@rbatta, tanx :) –

0

Методы, упомянутые в этой теме, больше не работают с Selenium Webdriver v3.

Вместо этого вам нужно будет добавить сон к команде выполнения.

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 

Обратите внимание, что это очень хрупкий способ замедлить тесты, так как вы обезьяны патчили частный API.

1

Это будет работать, и менее ломкими (для некоторого малого значения «меньше»)

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 
Смежные вопросы