未初始化的常量(NameError)使用Cucumber& SitePrism

时间:2017-01-05 14:14:41

标签: ruby cucumber site-prism

我正在使用Cucumber和SitePrism创建测试自动化。运行cucumber命令启动方案时遇到错误并出现此错误:

uninitialized constant HomePage::Navbar (NameError)
.../features/page_object/home_page.rb:4:in `<class:HomePage>'
.../features/page_object/home_page.rb:1:in `<top (required)>'

我有3个Ruby类位于单独的文件中

设有/ page_object / home_page.rb

class HomePage < SitePrism::Page
  set_url "/"

  section :navbar, Navbar, "header"
  element :flash_message, ".flash__text"
  element :username_link, ".c-nav-list__link.u-fg--yellow"
end

设有/ page_object /导航栏/ main.rb的

class Navbar < SitePrism::Section
  section :login_section, LoginSection, "#new_user_session"
  element :login_button, :xpath, "//a[@id='login_link']"
end

设有/ page_object /导航栏/ login_section.rb

class LoginSection < SitePrism::Section
  element :username_field, :xpath, "//input[@id='user_session_username'"
  element :password_field, :xpath, "//input[@id='user_session_password'"
  element :remember_me_checkbox,
          :xpath, "//input[@id='user_session_remember_me']"
  element :forgot_password_link, :xpath, "//a[text()='Lupa Password?']"
  element :submit_button, :xpath, "//button[@type='submit']"
  element :facebook_login_button, :xpath, "//a[@id='fb_login_link']"
  element :gplus_login_button, :xpath, "//a[@id='gplus_login_link']"

  def login(username, password)
    self.username_field.set(username)
    self.password_field.set(password)
    self.submit_button.click
  end
end

需要帮助,以便自动化可以按原样运行(没有错误)。任何解决方案?

2 个答案:

答案 0 :(得分:0)

需要在使用它的页面对象之前加载该部分。您可以将这些部分放在与使用它们的页面对象相同的文件中:

设有/ page_object / home_page.rb

# loads before Navbar class uses it
class LoginSection < SitePrism::Section
  ...  
end

# loads before HomePage class uses it
class Navbar < SitePrism::Section
  section :login_section, LoginSection, "#new_user_session"
  element :login_button, :xpath, "//a[@id='login_link']"
end

class HomePage < SitePrism::Page
  section :navbar, Navbar, "header"
end

或者您可以将这些文件分开并添加require语句,以确保每个类在它依赖的部分之后加载:

设有/ page_object / home_page.rb

require_rel 'navbar/main'

class HomePage < SitePrism::Page
  set_url "/"

  section :navbar, Navbar, "header"
  element :flash_message, ".flash__text"
  element :username_link, ".c-nav-list__link.u-fg--yellow"
end

设有/ page_object /导航栏/ main.rb的

require_rel 'login_section'

class Navbar < SitePrism::Section
  section :login_section, LoginSection, "#new_user_session"
  element :login_button, :xpath, "//a[@id='login_link']"
end

设有/ page_object /导航栏/ login_section.rb

class LoginSection < SitePrism::Section
  element :username_field, :xpath, "//input[@id='user_session_username'"
  element :password_field, :xpath, "//input[@id='user_session_password'"
  element :remember_me_checkbox,
          :xpath, "//input[@id='user_session_remember_me']"
  element :forgot_password_link, :xpath, "//a[text()='Lupa Password?']"
  element :submit_button, :xpath, "//button[@type='submit']"
  element :facebook_login_button, :xpath, "//a[@id='fb_login_link']"
  element :gplus_login_button, :xpath, "//a[@id='gplus_login_link']"

  def login(username, password)
    self.username_field.set(username)
    self.password_field.set(password)
    self.submit_button.click
  end
end

答案 1 :(得分:0)

在Ruby中(更具体地说是黄瓜),您需要确保从内向外加载POM。即在Pages之前的部分。

为什么?

由于使用SitePrism DSL时,我们正在运行脚本方法。如果调用Page的脚本方法,则它们将引用可能已加载或尚未加载的Section类(取决于Cucumber中的Autoloader,您无法控制)。

如果您首先定义不调用任何其他节的节,那么就不会有任何固有的问题。

现在,如果您仅在使用Sections。或以某种方式确信您永远不会遇到此问题,那么您就不会遇到任何问题。但是我们建议(也许我们应该对此做更好的记录),您应该首先在Pages之前加载最小的项(Section)。