Как я могу запустить 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. Это не помогло мне достичь цели в конце концов, но это сработало, и это может быть полезной стратегией для других!