在 Ruby 中支持页面对象模式

Support for the Page Object pattern in Ruby

在 Ruby-land 我们有 Capybara 和 Webrat 在使用 Cucumber 进行功能测试期间驱动我们的网络浏览器。

我找不到像 Groovy/Java-land 中的 Geb 这样的东西,它似乎在比 Capybara 更高的抽象级别上工作。这是来自 the Geb website.

的 Geb 描述

Geb is a browser automation solution.

It brings together the power of WebDriver, the elegance of jQuery content selection, the robustness of Page Object modelling and the expressiveness of the Groovy language.

Capybara 已经汇集了 WebDriver(通常是 Selenium)和 jQuery 风格的内容选择。但它不支持 Page Object 想法。 (您创建 类 来表示被测试的页面,因此这些步骤会对它们执行操作,而不是一直直接查看 DOM。就像您的页面的迷你 API .)

举一个我正在寻找的有用功能的例子,我从一位同事那里了解到,Geb 可以自动断言被测页面与代表页面的虚拟页面对象中的属性相匹配黄瓜测试。

我使用了 Site Prism for page-objects in a fairly large application. Cheezy's page-object gem 是我当时考虑过的另一个 gem 但它没有使用 Capybara(如果正确使用它可以帮助解决时间问题) .页面对象 gem 有它自己的 "wait" 机制。

还有another gem,但我怀疑它被废弃了。

page-object gem 将为您提供以下几行测试代码:

class LoginPage
  include PageObject

  page_url "http://example.com/login"
  text_field(:username, :id => 'username')
  text_field(:password, :id => 'password')
  button(:login, :id => 'login')

  def login_with(username, password)
    self.username = username
    self.password = password
    login
  end
end

# in your tests
visit_page LoginPage do |page|
page.login_with('testuser1@example.com', 'incorrect')
page.wait_until do # using default of 30s for this asynch call
  page.text.include? 'invalid user or password'
end
expect(page).to have_content 'invalid user or password'

更多例子可以在这个项目中看到:https://github.com/JonKernPA/pageobject and on the wiki https://github.com/cheezy/page-object/wiki/Elements

Site Prism 看起来像这样:

class LoginPage < SitePrism::Page
  set_url '/login'

  element :username_field, '#username'
  element :password_field, '#password'
  element :login_button, '#login'

  def login_with(username, password)
    username_field.set username
    password_field.set password
    login_button.click # this uses capybara to find('#login').click
  end
end

# in your tests
@page = LoginPage.new
@page.load
@page.login_with('testuser1@example.com', 'incorrect')
# capybara automatically waits for us
expect(@page).to have_content 'invalid user or password'

Site Prism 自述文件有很多很好的例子。您需要了解的所有其他信息都在 Capybara's 出色的自述文件和文档中。

当然还有比这些小例子更多的差异。
我建议你看看两者,然后决定你的要求是什么。