我正在使用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类位于单独的文件中
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
class Navbar < SitePrism::Section
section :login_section, LoginSection, "#new_user_session"
element :login_button, :xpath, "//a[@id='login_link']"
end
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
需要帮助,以便自动化可以按原样运行(没有错误)。任何解决方案?
答案 0 :(得分:0)
需要在使用它的页面对象之前加载该部分。您可以将这些部分放在与使用它们的页面对象相同的文件中:
# 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
语句,以确保每个类在它依赖的部分之后加载:
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
require_rel 'login_section'
class Navbar < SitePrism::Section
section :login_section, LoginSection, "#new_user_session"
element :login_button, :xpath, "//a[@id='login_link']"
end
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)。