默认情况下,Selenium 在我使用 Cucumber 定义的场景中运行得尽可能快。我想将它设置为以较低的速度运行,这样我就可以捕获该过程的视频。
我发现一个实例Selenium::Client::Driver
有一个set_speed
方法。这对应于Java API。
如何获取Selenium::Client::Driver
该类的实例?我可以得到尽可能远page.driver
,但返回一个实例Capybara::Driver::Selenium
。
感谢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)
这将起作用,并且不那么脆弱(对于“更少”的一些小值)
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
作为更新,该类中的执行方法不再可用。它现在只在这里:
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指令来限制的。它最终并没有帮助我实现我的目标,但它确实奏效了,它可能是其他人使用的有用策略!