Как я могу запустить Selenium (используемый через Capybara) на более низкой скорости?

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

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

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

4 ответа

Спасибо http://groups.google.com/group/ruby-capybara/msg/6079b122979ffad2 за подсказку.

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

Создайте "throttle.rb" в вашем каталоге features / support (если вы используете Cucumber) и заполните его:

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)

Это будет работать и будет менее хрупким (для небольшого значения "меньше")

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

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

module ::Selenium::WebDriver::Remote

Мне нужно было ограничить некоторые тесты в IE, и это сработало.

Методы, упомянутые в этой теме, больше не работают с 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.

Я хотел снизить скорость загрузки страниц в моем наборе тестов Capybara, чтобы посмотреть, смогу ли я вызвать некоторые периодически проваливающиеся тесты. Я достиг этого, создав контейнер обратного прокси-сервера nginx и поместив его между моим тестовым контейнером и контейнером phantomjs, который я использовал в качестве браузера без монитора. Скорость была ограничена с помощью директивы limit_rate. Это не помогло мне достичь цели в конце концов, но это сработало, и это может быть полезной стратегией для других!

Другие вопросы по тегам