Rails4/Capybara - 在测试中使用测试值 window width/dimensions

Rails4/Capybara - use the value of the test window width/dimensions inside a test

在 Rails 4.2 应用程序的 ruby 中,我在数据属性的视图中注入了一条基于 window.width() 计算的信息。为了问题简单起见,我在这里假设它等于 window.width()

view.js

var screen_width = window.width();
$target.attr('data-size', screen_width)

我想在 rspec/cpabayar(webkit 驱动程序)中测试目标元素是否具有正确的数据大小。

对于我的测试,我目前使用一个模块来设置我想要的大小

spec_helper.rb

# Helpers to help test responsive and screen resize
  # config.include ResponsiveHelper
  config.include ResponsiveHelper, type: :feature

/spec/responsive_helper.rb

module ResponsiveHelper

  def resize_window_to_flattened_window
    resize_window(1200, 480)
  end

  def resize_window_to_mobile
    resize_window(375, 627) # apple iPhone 6
  end

  def resize_window_to_tablet
    resize_window(960, 640)
  end

  def resize_window_default
    resize_window(1024, 768)
  end

  private

  def resize_window(width, height)
    case Capybara.current_driver
    when :selenium
      Capybara.current_session.driver.browser.manage.window.resize_to(width, height)
    when :webkit
      handle = Capybara.current_session.driver.current_window_handle
      Capybara.current_session.driver.resize_window_to(handle, width, height)
    else
      raise NotImplementedError, "resize_window is not supported for #{Capybara.current_driver} driver"
    end
  end

end

我有一个测试,测试视图中目标的数据大小属性中是否有正确的值:

view_features.spec.rb

describe "view behaves appropriately in terms of video size" do
  resize_window_default
  visit view_page_path(deal)
  expect(page).to have_css('#target[data-size="1024px"]', visible: :visible)
end

问题是我上面有很多针对各种尺寸的测试(mobile1、mobile2、ipad...笔记本电脑...)

目前,正如您在上面看到的,我必须自己将 "hard-coded" 放入测试 1024 像素(此处:have_css('#target[data-size="1024px"]'),当然,如果我已经放入 resize_window_default,它表示 window.width 为 1024,测试应将 1024px 分配给 Target 的数据大小。

但我想将其扩展到许多测试中,而无需对它进行硬编码,因为每次我都不需要对我期望的宽度值进行硬编码。

有什么办法吗?

  1. extract/get水豚使用的屏幕宽度?

这将是 "universal",并且独立于我的 Responsive Helper。它可以在任何测试中使用,无论我是否使用 Responsive Helper。

我的意思是 Capybara 有一个方法 resize_to 可以重新设置宽度,所以 Capybara 一定有办法获得宽度 output/value 本身?

会是这样的:

view_features.spec.rb

width_set_by_capybara = Capybara.screen.width
expect(page).to have_css('#target[data-size= width_set_by_capybara]', visible: :visible)
  1. 如果 1 不可能,有没有办法将我的 ResponsiveHelper 模块作为参数或类似的东西传递到我的测试文件,这将使我能够重新使用我刚刚设置的宽度值?

会是这样的:

/spec/responsive_helper.rb

 module ResponsiveHelper
   def resize_window_default
      resize_window(1024, 768)
      width_set_by_capybara = "1024px"
   end

view_features.spec.rb

expect(page).to have_css('#target[data-size= width_set_by_capybara]', visible: :visible)

您可以在 here.

中找到该方法
##
# Get window size.
#
# @macro about_current
# @return [Array<(Integer, Integer)>] an array with width and height
#
def size
  @driver.window_size(handle)
end

看来你可以调用window维度:

Capybara.current_session.driver.browser.manage.window.size

您不应该为此使用特定于驱动程序的方法(任何时候您使用 Capybara.current_session.driver。您可能做错了什么)。相反,您应该使用 Capybara 的 window api - http://www.rubydoc.info/gems/capybara/Capybara/Window

获取当前的大小window

Capybara.current_session.current_window.size

设置当前大小window

Capybara.current_session.current_window.resize_to(width, height)