【问题标题】:Support for the Page Object pattern in Ruby支持 Ruby 中的页面对象模式
【发布时间】:2015-07-23 11:27:11
【问题描述】:

在 Ruby 领域,我们有 Capybara 和 Webrat 在使用 Cucumber 进行功能测试期间驱动我们的 Web 浏览器。

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

Geb 是一个浏览器自动化解决方案。

它汇集了 WebDriver 的强大功能和 jQuery 的优雅 内容选择、页面对象建模的稳健性和 Groovy 语言的表现力。

Capybara 已经将 WebDriver(通常是 Selenium)和 jQuery 样式的内容选择结合在一起。但它对Page Object 的想法没有任何支持。 (您创建类来表示被测页面,因此这些步骤对它们执行操作,而不是一直直接查看 DOM。就像您页面的迷你 API。)

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

【问题讨论】:

  • 谷歌的“Ruby Page Object”给出了这个:github.com/cheezy/page-object。 . .如果这不合适,请考虑在 softwarerecs.stackexchange.com 上提问,因为在 Stack Overflow 主站点上,请求链接或外部资源被认为是题外话。
  • 这可能会因为离题而关闭,但试试这个:rubydoc.info/gems/site_prism/frames
  • 可能不应该用 [geb] 标记它,因为它并不真正相关。
  • 谢谢大家,我已经删除了 [geb] 标签。我认为有 Geb 经验的人可能知道其他语言的替代方案,因为他们在使用 {not Java} 编码时可能会错过框架。没见过softwarerecs,但听起来就是那个地方。如果没有人提供另一个答案,我最终会在找出页面对象 gem 时回答它,但如果模组认为应该关闭它,我很高兴。

标签: ruby cucumber bdd pageobjects


【解决方案1】:

我在一个相当大的应用程序中将Site Prism 用于页面对象。 Cheezy 的 page-object gem 是我当时考虑的另一个宝石,但它没有使用 Capybara(如果使用得当,可以帮助解决时间问题)。页面对象 gem 有它自己的“等待”机制。

还有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 和维基上的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 README 中有很多很好的例子。您需要了解的所有其他内容都在 Capybara's 优秀的 README 和文档中。

当然,这些差异远不止这些小示例所示。
我建议你看看两者并决定你的要求是什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    相关资源
    最近更新 更多