如何以较低的速度运行 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 以较低的分辨率拍照?

如何使用 Thrust 库以较低的精度对键进行排序

以高分辨率从网络摄像头捕获图片,同时使用 DirectShow.Net 以较低的分辨率进行预览

我们如何在没有条件的情况下递增然后递减计数器?

代号 一个以较低分辨率运行的应用程序 (Android)

手机的性能模式有啥区别?