17

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

我发现一个实例Selenium::Client::Driver有一个set_speed方法。这对应于Java API

如何获取Selenium::Client::Driver该类的实例?我可以得到尽可能远page.driver,但返回一个实例Capybara::Driver::Selenium

4

5 回答 5

24

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

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

在您的 features/support 目录中创建一个“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)
于 2011-03-01T05:29:40.967 回答
6

这将起作用,并且不那么脆弱(对于“更少”的一些小值)

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
于 2017-10-20T00:08:14.887 回答
3

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

module ::Selenium::WebDriver::Remote

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

于 2016-02-18T15:01:43.593 回答
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。

于 2017-07-25T08:10:32.060 回答
0

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

于 2019-05-23T13:41:36.590 回答