如何以较低的速度运行 Selenium(通过 Capybara 使用)?
Posted
技术标签:
【中文标题】如何以较低的速度运行 Selenium(通过 Capybara 使用)?【英文标题】:How can I run Selenium (used through Capybara) at a lower speed? 【发布时间】:2011-06-16 11:25:39 【问题描述】:默认情况下,Selenium 在我使用 Cucumber 定义的场景中运行得尽可能快。 我想将其设置为以较低的速度运行,这样我就可以捕获该过程的视频。
我发现Selenium::Client::Driver
的一个实例有一个set_speed
方法。对应Java API。
如何获得Selenium::Client::Driver
类的实例?我可以到达page.driver
,但这会返回Capybara::Driver::Selenium
的实例。
【问题讨论】:
【参考方案1】:感谢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)
【讨论】:
感谢提示!以防page
不可用,包括Capybara::DSL
或替换为Capybara.current_session
【参考方案2】:
这会起作用,并且不那么脆弱(对于一些小的“更少”值)
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】:作为更新,该类中的 execute 方法不再可用。它现在只在这里:
module ::Selenium::WebDriver::Remote
我需要在 IE 中限制一些测试,这很有效。
【讨论】:
@MischaMolhoek 使用上面的代码并将module ::Selenium::WebDriver::Firefox
替换为 module ::Selenium::WebDriver::Remote
! :D 我目前正在使用这个 w/ rspec 功能并将它放在spec/support/throttle.rb
调用set_speed :medium
在我的功能规范之前的块中。当有很多 css 并且 selenium 对它来说太快时效果很好。感谢@phil 的更新!【参考方案4】:
此线程中提到的方法不再适用于 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。
【讨论】:
【参考方案5】:我想在我的 Capybara 测试套件中减慢页面加载速度,看看我是否可以触发一些间歇性失败的测试。我通过创建一个 nginx 反向代理容器并将它放在我的测试容器和我用作无头浏览器的 phantomjs 容器之间来实现这一点。使用limit_rate 指令限制了速度。它最终没有帮助我实现我的目标,但它确实奏效了,它可能是一个有用的策略供其他人使用!
【讨论】:
以上是关于如何以较低的速度运行 Selenium(通过 Capybara 使用)?的主要内容,如果未能解决你的问题,请参考以下文章
如何让 AVCaptureSessionpresetPhoto 以较低的分辨率拍照?