Как я могу запустить Selenium (используется через Capybara) на более низкой скорости? - PullRequest
16 голосов
/ 27 января 2011

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

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

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

Ответы [ 5 ]

23 голосов
/ 01 марта 2011

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

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

Создайте «throttle.rb» в вашем каталоге функций / поддержки (если используете 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)
4 голосов
/ 20 октября 2017

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

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
3 голосов
/ 18 февраля 2016

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

module ::Selenium::WebDriver::Remote

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

2 голосов
/ 25 июля 2017

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

0 голосов
/ 23 мая 2019

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

...