如何以较低的速度运行Selenium(通过Capybara使用)?

时间:2011-01-27 11:05:20

标签: ruby selenium cucumber capybara

默认情况下,Selenium会在我使用Cucumber定义的场景中尽可能快地运行。 我想将它设置为以较低的速度运行,因此我能够捕获该过程的视频。

我发现Selenium::Client::Driver的实例有set_speed方法。这与Java API

相对应

如何获取Selenium::Client::Driver类的实例?我可以获得page.driver,但返回Capybara::Driver::Selenium的实例。

5 个答案:

答案 0 :(得分:23)

感谢http://groups.google.com/group/ruby-capybara/msg/6079b122979ffad2提示。

请注意,这会使用Ruby的睡眠,所以它有点不精确 - 但是应该为你做好工作。此外,执行调用的所有内容,这就是为什么它等待亚秒级。中间步骤 - 等到准备好,检查字段,聚焦,输入文本 - 每次暂停。

在您的功能/支持目录中创建“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)

答案 1 :(得分:4)

这会起作用,并且不那么脆弱(对于某些小的值"较少")

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

答案 2 :(得分:3)

作为更新,该类中的execute方法不再可用。它现在只在这里:

module ::Selenium::WebDriver::Remote

我需要在IE中限制一些测试,这很有用。

答案 3 :(得分:2)

此线程中提到的方法不再适用于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。

答案 4 :(得分:0)

我想降低Capybara测试套件中的页面加载速度,以查看是否可以触发一些间歇性失败的测试。我通过创建nginx反向代理容器并将其放置在测试容器和用作无头浏览器的phantomjs容器之间来实现此目的。通过使用limit_rate指令来限制速度。最终并没有帮助我实现目标,但确实奏效了,对于其他人来说可能是有用的策略!