可以在 Cucumber 之外使用页面对象吗?

Can page-object be used outside of Cucumber?

我想了解页面对象 gem 与 Cucumber 的确切联系。

页面工厂暴露给Cucumbers world,允许使用on / visit in steps,但这好像是没有Cucumber也能暴露的东西。

页面对象所依赖的@browser 变量是在 Cucumber 的 before_suite 或 before_scenario 上下文中创建的,但这也可以在没有 Cucumber 的情况下创建。

这 gem 是否真的与 Cucumber 相关联?

是的。页面对象 gem 可以在 Cucumber 之外使用。

这是一个如何将其与 RSpec 一起使用的示例。

$树

├── Gemfile
├── spec
│   ├── my_app
│   │   └── search_spec.rb
│   ├── pages
│   │   ├── article_page.rb
│   │   └── index_page.rb
│   └── spec_helper.rb

宝石文件

source "https://rubygems.org"

gem 'rspec'
gem 'page-object'

spec_helper.rb

require 'page-object'

Dir["#{File.dirname(__FILE__)}/pages/*_page.rb"].each { |file| require file }

RSpec.configure do |config|
  config.include PageObject::PageFactory

  config.before do
    @browser = Watir::Browser.new :firefox
  end

  config.after do
    @browser.close
  end
end

search_spec.rb

require 'spec_helper'

describe 'Search field' do
  it 'searches an article' do
    visit(IndexPage) do |page|
      page.search = 'Ruby'
      page.submit_search
    end

    expect(on(ArticlePage).main_header).to eq('Ruby')
  end
end

article_page.rb

class ArticlePage
  include PageObject

  h1(:main_header)
end

index_page.rb

class IndexPage
  include PageObject

  page_url 'https://www.wikipedia.org'

  text_field(:search, id: 'searchInput')
  button(:submit_search)
end

如 rubygems.org PageObject gem has only development dependency on Cucumber. It doesnt need cucumber for implementation. A precise explanation of difference between runtime and development dependencies is given here 所述。

出于执行目的,Cucumber 查找步骤定义。将 Page Factory 传递给 World 为 Cucumber 添加了 PageObject 功能。我唯一能想到的将 PageObject 绑定到 Cucumber 的是它的单元测试。 Evmorov 已经给出了一个很好的解决方案,可以单独使用 Rspec。